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

使用Tweepy时for循环中time.sleep()无法解决限流问题

解决Tweepy调用Twitter API v2时的限流问题

问题核心分析

你遇到的限流问题主要源于两个关键错误:

  1. time.sleep(1)的位置错误:你把延迟放在了单条推文的遍历循环中,而Twitter API的限流是按API请求次数计算的,不是单条推文数量。这种延迟对控制请求频次毫无作用,反而会浪费时间。
  2. 未利用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:26:09