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

使用Tweepy爬取Twitter用户3200条推文的分页限制问题

问题根源

  • Twitter API v1.1的user_timeline接口有硬限制:单请求最多返回200条推文,你设置result_limit=5000不会生效,接口会自动截断为200条,这就是你调整参数后仅拿到200条的原因。同时该接口普通权限最多只能获取单个用户最近3200条公开推文,和你的需求刚好吻合。
  • 你的代码缺少last_tweet_id的更新逻辑,每次循环都没有把本次请求拿到的最小推文id赋值给last_tweet_id,导致要么重复请求同一页数据,要么请求参数错误拿不到新内容。
  • 你使用了错误的参数名:include_retweets不是接口的合法参数,正确参数为include_rts,参数不生效可能导致返回结果不符合预期。
  • 循环终止逻辑不合理:不需要设置3200页这么大的数值,按单页最大200条计算,最多16页就能拿满3200条,同时如果某次请求返回空列表,说明已经没有更多历史推文,可以提前终止循环,不需要跑满预设页数。

修复后的实现方案

你可以参考下面的代码修改,单用户最多仅需16次请求即可拿满3200条推文,没有无效请求:

import tweepy
import json

# 初始化API的逻辑保持你原来的配置不变即可
api = tweepy.API(auth, parser=tweepy.parsers.JSONParser(), wait_on_rate_limit=True)

def get_user_all_tweets(username, max_total=3200, per_page=200):
    all_tweets = []
    last_tweet_id = None
    # 计算最大需要的页数
    max_pages = (max_total // per_page) + 1

    for _ in range(max_pages):
        # 构造请求参数
        params = {
            "screen_name": username,
            "count": per_page,
            "tweet_mode": "extended",
            "include_rts": True
        }
        if last_tweet_id:
            params["max_id"] = last_tweet_id - 1
        
        # 发起请求
        current_page = api.user_timeline(**params)
        # 此处打印的数值就是当前页实际返回的推文条数
        print(f"当前页返回{len(current_page)}条推文")
        if not current_page:
            # 没有更多数据,提前退出
            break
        
        all_tweets.extend(current_page)
        # 更新last_tweet_id为当前页最小的推文id
        last_tweet_id = current_page[-1]["id"]
        
        # 已拿到足够数量,退出
        if len(all_tweets) >= max_total:
            all_tweets = all_tweets[:max_total]
            break
    
    # 写入文件
    with open(f"{username}_tweets.json", "w", encoding="utf-8") as f:
        json.dump(all_tweets, f, ensure_ascii=False, indent=4)
    return all_tweets

# 批量爬取调用示例,替换为你的100个用户名列表即可
for user in ["user1", "user2", "..."]:
    get_user_all_tweets(user)

疑问解答

  • 怎么知道单页接口返回多少条推文?每次请求后取返回列表的长度len(current_page)即可,正常情况最多为200,若小于200说明当前时间区间内用户发布的推文不足200条,若为0说明已经没有更多历史推文可以获取。
  • 效率说明:单用户最多16次请求即可拿满3200条,你已经开启了wait_on_rate_limit=True,接口会自动处理速率限制,批量爬取100个用户不会触发接口封禁。

内容的提问来源于stack exchange,提问作者Adnan Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:36:04