如何使用Python的Tweepy按起止日期流式获取Twitter推文
如何用Tweepy结合Twitter完整档案权限获取指定日期范围的推文
嘿,作为Python初学者能搞定Twitter完整档案访问权限已经超棒啦!先给你理清一个关键误区:Tweepy的流式API(比如StreamingClient)是用来抓取实时推文流的,根本不支持指定历史起止日期。你需要用的是Twitter的Full-Archive Search API,通过Tweepy的Client类来调用它,这才是获取历史数据的正确姿势。
下面是一步步的实操指南,专门针对初学者:
第一步:确保你用的是最新版Tweepy
Twitter API V2是目前的主流,Tweepy的旧版本对V2支持不好,所以先升级到最新版:
pip install --upgrade tweepy
第二步:初始化Tweepy Client
你需要用你的Bearer Token来认证(在Twitter开发者平台的项目里就能找到),不用复杂的OAuth流程,Bearer Token足够调用Full-Archive Search:
import tweepy # 替换成你自己的Bearer Token BEARER_TOKEN = "你的Bearer Token" client = tweepy.Client(bearer_token=BEARER_TOKEN)
第三步:构造带日期范围的搜索请求
核心方法是client.search_all_tweets——这个方法只有拥有完整档案权限的账号才能调用,刚好符合你的情况。你需要指定:
- 搜索关键词(可以用Twitter的搜索语法,比如排除转推、指定话题等)
- 起始时间
start_time和结束时间end_time,格式必须是ISO 8601 UTC时间(比如2023-01-01T00:00:00Z) - 要获取的推文字段(比如创建时间、文本、互动数据等)
完整代码示例(带分页处理)
因为API每次最多返回100条推文,所以用Tweepy.Paginator来自动分页获取所有符合条件的数据:
import tweepy BEARER_TOKEN = "你的Bearer Token" client = tweepy.Client(bearer_token=BEARER_TOKEN) # 自定义搜索参数 query = "你的研究主题关键词 -is:retweet" # -is:retweet 用来排除转推,只保留原创推文 start_time = "2023-01-01T00:00:00Z" # 起始日期(UTC时间) end_time = "2023-01-31T23:59:59Z" # 结束日期(UTC时间) max_results_per_page = 100 # 每页最多100条,这是API的上限 # 初始化列表存储所有推文 all_tweets = [] # 分页获取数据 for response in tweepy.Paginator( client.search_all_tweets, query=query, start_time=start_time, end_time=end_time, # 指定要获取的推文字段,按需添加 tweet_fields=["created_at", "text", "public_metrics", "author_id"], max_results=max_results_per_page ): # 将当前页的推文添加到总列表 if response.data: all_tweets.extend(response.data) # 打印进度,方便你跟踪 print(f"已累计获取 {len(all_tweets)} 条推文") # 示例:打印前5条推文的内容和创建时间 print("\n=== 前5条示例推文 ===") for tweet in all_tweets[:5]: print(f"创建时间: {tweet.created_at}") print(f"推文内容: {tweet.text}\n")
几个重要注意事项
- 日期格式不能错:必须是
YYYY-MM-DDTHH:MM:SSZ,Z代表UTC时间,如果你用的是本地时间,要先转换成UTC。 - 搜索语法灵活用:比如要搜带话题的推文可以写
#你的话题,要指定作者用from:用户名,排除关键词用-关键词,直接在Twitter网页端搜索时就能测试语法效果。 - 速率限制:Full-Archive Search每15分钟最多允许900次请求,每次最多100条,Tweepy的Paginator会自动处理速率限制的429错误,自动重试,所以不用手动加延迟。
- 权限验证:如果调用
search_all_tweets时提示权限不足,说明你的账号还没开通完整档案权限,去Twitter开发者平台确认一下权限是否生效。
内容的提问来源于stack exchange,提问作者Adam Davies




