焦点

python爬取微博内容

时间:2010-12-5 17:23:32  作者:知识   来源:综合  查看:  评论:0
内容摘要:用Python抓微博,第一件事不是写代码,是搞清楚你要抓什么。微博的页面结构这几年改了好几次,PC端和移动端返回的数据格式完全不同。我试过直接请求搜索页,返回的HTML里几乎没有内容,全是JavaSc

用Python抓微博,微博第一件事不是内容写代码,是微博搞清楚你要抓什么。微博的内容页面结构这几年改了好几次,PC端和移动端返回的微博数据格式完全不同。我试过直接请求搜索页,内容返回的微博HTML里几乎没有内容,全是内容JavaScript动态渲染的。这意味着你得换思路——要么模拟API请求,微博要么上Selenium之类的内容工具。

先说API这条路。微博微博的内容移动端接口(m.weibo.cn)相对好搞。打开浏览器开发者工具,微博切到Network面板,内容刷新页面,微博你会看到一堆返回JSON的请求。比如搜索关键词的接口大概长这样:

https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D关键词&page_type=searchall

用requests直接请求这个URL,带上User-Agent和Cookie,就能拿到结构化的数据。每页返回10条微博,翻页靠page参数。我去年抓“新能源车”这个话题时,大概翻到50页左右就被限流了,返回403。解决办法是加延时,随机sleep 2到5秒,再配合几个Cookie轮换。

代码骨架不复杂:

import requests, time, random headers = {  'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X)', 'Cookie': '你的Cookie' } for page in range(1, 51): url = f'https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D新能源车&page_type=searchall&page={ page}' r = requests.get(url, headers=headers) if r.status_code == 200: data = r.json() cards = data.get('data', { }).get('cards', []) for card in cards: if 'mblog' in card: text = card['mblog'].get('text', '') print(text[:100]) time.sleep(random.uniform(2, 5)) 

注意,返回的text字段里带HTML标签,用BeautifulSoup或正则清一下。另外,微博的搜索接口对未登录用户限制很严,Cookie是必须的。怎么拿Cookie?登录m.weibo.cn后,从开发者工具里复制请求头中的Cookie值就行。别用账号密码模拟登录,验证码和滑块够你折腾半天。

如果你非要抓PC端,Selenium是备选方案。启动Chrome,加载页面,等元素出现,再提取。慢,但稳。我试过抓某个明星的超话帖子,用Selenium滚动加载了200多条,耗时大概3分钟。代码里加个WebDriverWait,等`div.card-wrap`出现再操作。缺点是资源占用高,开无头模式也吃内存。

还有个坑:微博的敏感词过滤。你抓“疫情”相关的帖子,很多会被屏蔽或仅自己可见,返回的数据里直接缺失。这不是代码问题,是平台策略。我建议抓之前先手动搜一下,看看结果是否完整。

数据存哪儿?小规模用CSV就行,pandas的DataFrame.to_csv()一行搞定。大规模上MongoDB,微博的字段嵌套深,文档型数据库更合适。我习惯把原始JSON整个存进去,后面再慢慢解析。

最后提醒一句:别高频请求。微博的风控不是吃素的,轻则封IP几小时,重则封账号。我一般控制在每分钟不超过10次请求,单次抓取不超过500条。够用就行,别贪。

最近更新
热门排行
copyright © 2026 powered by 烟消火灭网   sitemap