如何使用Tweepy获取Twitter账号最近30条推文的平均互动量
问题修复方案
现有代码的核心问题
- 第一部分拉取推文的代码存在语法错误:
user_timeline方法的screen_name参数被误写为元组格式(多了外层括号和逗号),且方法本身括号未闭合,导致参数传递异常,拉取的推文数据不符合预期,自然无法获取正确的转发量。 - 平均值计算逻辑错误:原代码将单条推文的转发、点赞数单独存入列表后除以总元素数(30条推文对应60个元素),不符合「每条推文点赞+转发+评论之和的平均值」的计算规则。
- 评论数获取方案效率低、准确率差:Twitter v1.1 API的search接口仅支持查询最近7天的公开内容,超过时限的推文回复无法被检索到,且遍历搜索的方式漏检率极高,不适用于批量统计30条推文的回复数。
最优解决方案
推荐使用Twitter API v2配合Tweepy v4及以上版本实现需求,v2接口的public_metrics字段会直接返回每条推文的点赞数、转发数、评论数、引用数,无需自行检索回复,数据准确、调用效率高。
完整实现代码
import tweepy # 填入你在Twitter开发者平台申请的V2 API Bearer Token BEARER_TOKEN = "你的Bearer Token" # 要查询的目标用户名 TARGET_USERNAME = "test_name" # 要拉取的最近推文数量 TWEET_COUNT = 30 # 初始化V2客户端 client = tweepy.Client(bearer_token=BEARER_TOKEN) # 先根据用户名获取用户ID user = client.get_user(username=TARGET_USERNAME) user_id = user.data.id # 拉取用户最近30条推文,指定返回public_metrics字段 # exclude参数可根据需求调整:如果不需要统计转推、回复的互动,就加上exclude=['retweets', 'replies'] tweets = client.get_users_tweets( id=user_id, max_results=TWEET_COUNT, tweet_fields=['public_metrics'] ) total_interaction = 0 for tweet in tweets.data: metrics = tweet.public_metrics # 单条推文互动量 = 点赞数 + 转发数 + 评论数 single_interaction = metrics['like_count'] + metrics['retweet_count'] + metrics['reply_count'] total_interaction += single_interaction # 计算平均互动量 average_interaction = total_interaction / TWEET_COUNT print(f"最近{TWEET_COUNT}条推文的平均互动量为:{average_interaction:.2f}")
原代码的局部修复(仍使用v1 API的情况)
如果你坚持使用v1版本API,可以按以下方式修改原有代码,但仍无法解决评论数只能查7天的问题:
import tweepy # 原有auth逻辑保持不变 auth = tweepy.OAuthHandler("你的API Key", "你的API Secret") auth.set_access_token("你的Access Token", "你的Access Token Secret") tweepy_api = tweepy.API(auth, wait_on_rate_limit=True) # 修复screen_name参数的语法错误,去掉多余的括号和逗号 my_tweets = tweepy_api.user_timeline( screen_name='test_name', count=30, include_rts=True, tweet_mode='extended' ) total_interaction = 0 for el in my_tweets: # 单独获取单条推文的转发、点赞数 retweet = el.retweet_count favorite = el.favorite_count # 原有获取评论的逻辑适配新版Tweepy方法名,注意仅支持7天内的推文 name = el.user.screen_name tweet_id = el.id_str replies = [] for tweet in tweepy.Cursor(tweepy_api.search_tweets, q='to:'+name, result_type='recent', timeout=999999).items(1000): if hasattr(tweet, 'in_reply_to_status_id_str') and tweet.in_reply_to_status_id_str == tweet_id: replies.append(tweet) reply_count = len(replies) total_interaction += (retweet + favorite + reply_count) average = total_interaction / len(my_tweets) print(f"平均互动量为:{average:.2f}")
内容的提问来源于stack exchange,提问作者gael1130
相关产品推荐
相关产品推荐

