tweepy.Paginator调用search_all_tweets频繁触发限流问题咨询
问题根因
这不是配置遗漏问题,核心是两个认知偏差:
- 学术权限对应的
search_all_tweets端点限流规则为 每15分钟300次请求,单次请求最大可返回500条结果,单限流窗口最多可拉取15万条推文,完全覆盖你1万条的采集需求。 Paginator.flatten()会将分页返回的结果拆分为单条推文迭代,你之前尝试加time.sleep(1)的逻辑放错了粒度:等待应该加在两次分页请求之间,而非两条推文的处理逻辑之间,这也是为什么你之前的方案每秒只能处理1条。- 你当前的代码没有任何限速逻辑,Paginator会在上一页请求返回后立刻发起下一页请求,短时间内打满300次/15分钟的限流阈值,自然会快速触发速率限制。
最优解决方案
Tweepy 内置了速率限制自动等待能力,不需要手写sleep逻辑,只需要在初始化Client时开启wait_on_rate_limit参数即可,这也是官方推荐的用法:
import tweepy # 初始化客户端时开启自动限速等待 client = tweepy.Client( bearer_token="替换为你的Bearer Token", wait_on_rate_limit=True ) mentions = [] for tweet in tweepy.Paginator( client.search_all_tweets, query="to:######## lang:nl -is:retweet", start_time="2022-01-01T00:00:00Z", end_time="2022-05-31T00:00:00Z", max_results=500 ).flatten(limit=10000): mentions.append(tweet.text)
效率说明
- 开启
wait_on_rate_limit=True后,Tweepy会自动检测剩余请求配额,在配额耗尽时自动等待到限流窗口重置,不会触发429错误。 - 该方案下单次请求拉满500条的上限,按限流规则计算平均采集效率约为166条/秒,远高于每秒1条的低效方案。
如果需要手动控制请求节奏,不要直接遍历flatten后的单条推文,改为遍历分页对象,在每一页请求完成后加等待即可:
import tweepy import time client = tweepy.Client(bearer_token="替换为你的Bearer Token") mentions = [] paginator = tweepy.Paginator( client.search_all_tweets, query="to:######## lang:nl -is:retweet", start_time="2022-01-01T00:00:00Z", end_time="2022-05-31T00:00:00Z", max_results=500 ) for page in paginator: # 处理当前页的所有推文 for tweet in page.data: mentions.append(tweet.text) # 达到采集上限直接终止 if len(mentions) >= 10000: break if len(mentions) >= 10000: break # 每完成一次请求(拉取500条)后等待3秒,远低于限流阈值 time.sleep(3)
注意:Twitter API的限流计数维度是请求次数,不是返回的推文条数,单请求拉取500条和拉取10条消耗的配额完全一致,尽量把
max_results设为端点允许的最大值,是提升采集效率最直接的手段。
内容的提问来源于stack exchange,提问作者fritsvegters
相关产品推荐
相关产品推荐

