如何使用Tweepy在指定时间区间内获取指定用户的推文?
解决Tweepy获取@IBM指定时间段推文的问题
嘿,我来帮你搞定这个需求~你的代码思路是对的,但有几个细节需要调整才能正确运行,我来一步步给你修正和解释:
原代码的问题点
- 缺少
datetime模块的导入,代码里用到了datetime.datetime但没声明导入; - Tweepy的
user_timeline接口的since和until参数只接受字符串格式的日期(比如"2018-01-19"),而且只能按日期过滤,没法直接精确到小时级别; - 循环语句没有写完,缺少具体的处理逻辑;
- 没有处理时区问题,Twitter返回的推文时间是UTC时区,直接用本地时间比较会出错。
修正后的完整代码
import tweepy from datetime import datetime, timezone # 替换成你的Twitter开发者API密钥 consumer_key = "..." consumer_secret = "..." access_token = "..." access_token_secret = "..." # 完成API认证 auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) # 加上wait_on_rate_limit=True,自动处理API限流问题 api = tweepy.API(auth, wait_on_rate_limit=True) # 定义目标时间范围(注意:这里用UTC时区,和Twitter返回的时间保持一致) # 如果你的需求是本地时间,需要先转换为UTC,比如北京时间要减8小时 start_date = datetime(2018, 1, 19, 12, 0, 0, tzinfo=timezone.utc) end_date = datetime(2018, 1, 19, 13, 0, 0, tzinfo=timezone.utc) # 存储符合条件的推文 filtered_tweets = [] # 遍历IBM的用户时间线,过滤指定时间段的推文 for tweet in tweepy.Cursor(api.user_timeline, screen_name="IBM", tweet_mode="extended").items(): # 将推文的创建时间转换为带UTC时区的datetime对象 tweet_created_at = tweet.created_at.replace(tzinfo=timezone.utc) # 检查是否在目标时间范围内 if start_date <= tweet_created_at < end_date: filtered_tweets.append(tweet) # 打印推文信息,方便验证 print(f"发布时间 (UTC): {tweet_created_at}") print(f"推文内容: {tweet.full_text}\n") # 输出结果统计 print(f"共找到 {len(filtered_tweets)} 条符合2018年1月19日12:00-13:00 UTC条件的推文")
关键细节说明
- 时区处理:Twitter所有推文的
created_at字段都是UTC时间,所以我们定义的时间范围必须也用UTC,避免时间偏差。如果你的需求是本地时间,记得先转换为UTC(比如北京时间转UTC需要减去8小时)。 - 完整推文内容:加上
tweet_mode="extended"参数,避免长推文被截断,这样能获取到完整的推文文本。 - 限流处理:
wait_on_rate_limit=True会让Tweepy在API请求达到限制时自动等待,不用手动处理限流问题。 - 时间过滤逻辑:因为Twitter API不支持精确到小时的时间范围查询,所以我们先获取@IBM的推文,再在本地通过
created_at字段过滤出目标时间段的内容。
额外注意事项
- Twitter的标准API最多只能获取用户最近3200条推文,如果@IBM在2018年1月19日的推文超过这个范围(可能性很低),可能无法获取到全部内容;如果需要更完整的历史数据,需要申请Twitter学术研究API。
- 确保你的开发者账号有足够的权限,免费账号可以正常使用
user_timeline接口,但有请求次数限制。
内容的提问来源于stack exchange,提问作者Alessandro Russo
相关产品推荐
相关产品推荐

