使用Twitter API v2抓取推文时如何添加用户名、转发计数?
Twitter API v2 抓取推文至DataFrame:添加用户名、转发计数等字段的问题解决
问题分析
你当前代码的核心问题有两个:
- 用户数据(用户名等)并不存储在单个
tweet对象中,而是返回在response.includes['users']集合里,直接调用tweet.users会报错 - 转发计数的获取方式错误,
public_metrics是tweet的属性,无需通过tweet.data访问
解决方案
步骤1:收集推文时同步保存用户数据
在循环请求批次数据时,不仅要保存tweets_chunk,还要把response.includes里的用户数据收集起来,避免丢失。
步骤2:构建用户ID到用户信息的映射字典
把收集到的用户数据转换成以author_id为键的字典,方便后续通过推文的author_id快速匹配用户名。
步骤3:修正字段提取逻辑
- 通过
author_id从用户字典中获取对应的username - 直接通过
tweet.public_metrics['retweet_count']获取转发计数
修正后的完整代码
import pandas as pd # 假设你的client已经完成初始化 num_batches = 5 # 可根据实际需求调整批次数量 until_id = None tweets = [] users = [] # 新增:用于存储用户数据 for _ in range(num_batches): response = client.search_recent_tweets( query='nurofen', max_results=100, until_id=until_id, tweet_fields=['author_id', 'created_at', 'text', 'lang', 'public_metrics'], user_fields=['name', 'username', 'location', 'id'], expansions=['author_id', 'entities.mentions.username'], ) tweets_chunk = response.data if not tweets_chunk: break tweets.extend(tweets_chunk) # 新增:收集返回的用户数据 if 'users' in response.includes: users.extend(response.includes['users']) until_id = tweets_chunk[-1].id # 构建author_id到用户对象的映射字典 user_dict = {user.id: user for user in users} # 整理数据生成DataFrame tweet_data = [] for tweet in tweets: # 通过author_id匹配对应用户 user = user_dict.get(tweet.author_id) username = user.username if user else None user_location = user.location if user else None tweet_data.append({ 'Author ID': tweet.author_id, 'Tweet ID': tweet.id, 'Language': tweet.lang, 'Created at': tweet.created_at, 'Text': tweet.text, 'User Location': user_location, 'Username': username, 'Retweet Count': tweet.public_metrics['retweet_count'], 'Like Count': tweet.public_metrics['like_count'] # 可选:额外添加点赞数字段 }) nurofen_twts = pd.DataFrame(tweet_data) print(nurofen_twts)
额外说明
- 如果需要获取推文本身的地理位置信息,需要在
tweet_fields中添加'geo',且仅当用户发布推文时开启位置权限才会返回该数据 - 若不需要获取推文中提及的用户,可移除
entities.mentions.username扩展参数,减少返回的数据量
内容的提问来源于stack exchange,提问作者Chioma Amuwa
相关产品推荐
相关产品推荐

