未使用Tweepy爬取Twitter数据时如何统计单条推文的图片与视频数量
代码失效的核心原因
- 静态请求拿不到真实推文内容:Twitter的推文页是强前端动态渲染架构,用
urlopen直接发起匿名请求,首先会触发平台反爬机制返回权限错误页;哪怕通过了反爬校验,拉取到的也只是没有实际数据的空HTML壳,根本不包含推文对应的媒体元素,自然只能抓到错误页的logo图。 - 媒体识别逻辑错位:你之前以为所有图片、视频都藏在t.co短链跳转的目标页面里,这个判断完全不符合Twitter的内容加载规则——推文对应的媒体直链是嵌在页面内嵌的结构化JSON数据里的,根本不会以普通DOM图片元素的形式出现在初始加载的静态HTML中,靠解析DOM里的img标签根本抓不到实际媒体。
- 原代码本身存在硬语法和逻辑bug:
BeautifulSoup(urlopen((url))括号不闭合,运行直接触发语法错误- 代码从bs4模块导入了BeautifulSoup类,调用时却写了
bs4.BeautifulSoup,会直接报未定义变量的错误 - 用来判断图片类型的
file_types变量存的是XPath语法查询串,却被拿来做文件后缀的字符串匹配,就算拿到正确页面的内容,这个匹配逻辑也永远返回0个结果。
更高效的实现方案
你已经存储了包含完整字段的推文原始内容,完全没必要再发请求去爬推文URL,多此一举还容易触发反爬:
- 图片计数:直接读取你已存的推文原始内容里的
extended_entities.media字段,筛选列表中type值为photo的元素个数,就是这条推文的图片总数。 - 视频计数:在同一个
extended_entities.media列表里,筛选type值为video或者animated_gif的元素个数,就是这条推文的视频/动图总数(注:Twitter平台的动图本质是无声循环的mp4格式媒体,归到视频类计数即可)。 - 如果存储的原始内容里没有完整的
extended_entities字段,只保留了t.co格式的短链,也不需要爬取完整页面:只需要读取t.co短链的302跳转头信息,通过跳转目标的路径特征判断媒体类型,完全不需要解析页面DOM。
实际使用的避坑提示
- 别用普通静态请求库直接拉取推文页面,匿名未登录的请求绝大多数会触发反爬返回错误页,哪怕加了自定义UA头也很容易被拦截,完全浪费请求性能。
- 不要把t.co短链一概判定为外部站点链接,Twitter会把平台内的媒体、长文本、话题页全部替换为t.co短链,判断内容类型要靠跳转后的目标路径特征,不能靠短链本身的形式判断。
- 单条推文的媒体数量有固定上限:最多4张图片/1个视频/1个动图,如果计数结果超过这个数值,基本就是解析逻辑把页面其他无关元素算进去了。
内容的提问来源于stack exchange,提问作者hajar hajar
相关产品推荐
相关产品推荐

