使用Tweepy时for循环中time.sleep()无法解决限流问题
解决Tweepy调用Twitter API v2时的限流问题
问题核心分析
你遇到的限流问题主要源于两个关键错误:
time.sleep(1)的位置错误:你把延迟放在了单条推文的遍历循环中,而Twitter API的限流是按API请求次数计算的,不是单条推文数量。这种延迟对控制请求频次毫无作用,反而会浪费时间。- 未利用
max_results减少请求次数:默认情况下get_users_tweets每次仅拉取10条推文,请求次数会被放大10倍,更容易触发限流阈值。
另外,你已经开启的wait_on_rate_limit=True是有效的,但需要配合正确的请求策略才能发挥作用。
修正后的代码
import tweepy import pandas as pd import time # 配置API密钥 consumer_key = "consumer key" consumer_secret = "consumer secret" access_token = "access token" access_secret = "access secret" bearer_token = "bearer token" # 初始化客户端,启用自动限流等待 client = tweepy.Client( bearer_token=bearer_token, consumer_key=consumer_key, consumer_secret=consumer_secret, access_token=access_token, access_token_secret=access_secret, wait_on_rate_limit=True ) # 配置拉取参数 end_time="2024-06-22T23:59:01Z" start_time="2024-06-10T23:59:01Z" user_id="insert user id here" result = [] # 分页拉取推文,设置max_results=100减少请求次数 for response in tweepy.Paginator( client.get_users_tweets, user_id=user_id, end_time=end_time, tweet_fields=['id','referenced_tweets','text','context_annotations','created_at','geo','author_id','lang','public_metrics'], start_time=start_time, max_results=100 # 关键:每次请求拉取最多100条推文,大幅减少请求次数 ): if response.data: for tweet in response.data: result.append({ 'id': tweet.id, 'author_id': tweet.author_id, 'lang': tweet.lang, 'text': tweet.text, 'created_at': tweet.created_at, 'retweets': tweet.public_metrics['retweet_count'], 'replies': tweet.public_metrics['reply_count'], 'likes': tweet.public_metrics['like_count'], 'quote_count': tweet.public_metrics['quote_count'], 'referenced_tweets': tweet.referenced_tweets, 'context_annotations': tweet.context_annotations, 'tweet_url': f"https://twitter.com/{tweet.author_id}/status/{tweet.id}" }) # 在两次API请求之间添加延迟,配合自动限流处理 time.sleep(1) # 保存结果到CSV df = pd.DataFrame(result) df.to_csv("mydf.csv", index=False)
关键修改说明
- 添加
max_results=100:将单次请求的推文数量拉满,直接把总请求次数降低到原来的1/10,从根源上减少触发限流的概率。 - 调整
time.sleep(1)位置:将延迟移到分页请求的外层循环,控制两次API请求的间隔,符合Twitter API的限流计算逻辑。 - 移除无效参数
user_fields:get_users_tweets接口仅返回推文数据,添加用户字段不会返回任何额外内容,反而增加不必要的参数开销。 - 保留
wait_on_rate_limit=True:让Tweepy自动捕获限流响应,计算并等待到限流重置时间后继续请求,无需手动计算等待时长。
额外注意事项
- 确保使用最新版Tweepy:旧版本对
wait_on_rate_limit的支持可能存在bug,可通过pip install --upgrade tweepy升级。 - 记录断点位置:如果脚本中断重启,建议记录已拉取的最后一条推文ID,通过
until_id参数继续拉取,避免重复请求浪费额度。 - 确认API计划:免费版API的限流阈值更低,若需大规模拉取,可考虑升级到付费API计划。
内容的提问来源于stack exchange,提问作者Bene_ma_non_Benissimo
相关产品推荐
相关产品推荐

