You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 05:27:32