使用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
相关产品推荐
相关产品推荐

