如何使用Tweepy获取Twitter用户全部点赞?应对速率限制
解决方案:适配Twitter API限制获取全部点赞或按日期筛选
一、适配速率限制获取全部点赞内容
你的问题核心是/favorites/list接口的速率限制(Elevated权限下15分钟内75次调用),加上默认每次调用仅返回20条推文,导致75次调用只能拿到1400-1500条左右。可以通过以下方法优化:
1. 提升单次调用的推文返回量
在get_favorites中指定count=200(这是API允许的最大值),这样每次调用能拿到200条推文,75次调用可覆盖15000条点赞,大幅减少调用次数:
tweepy.Cursor(api.get_favorites, screen_name=twitterUsername, count=200).items()
2. 开启自动限流等待
初始化Tweepy API时设置wait_on_rate_limit=True,当触发限流时,库会自动计算等待时间并暂停,直到速率限制重置后继续执行,无需手动处理:
import tweepy auth = tweepy.OAuthHandler(你的consumer_key, 你的consumer_secret) auth.set_access_token(你的access_token, 你的access_token_secret) # 开启自动等待限流,同时开启通知提示 api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
3. 手动分页控制(进阶)
如果需要更精细的控制,可通过max_id参数手动分页,同时处理限流等待:
import time favorites = [] max_id = None while True: try: # 每次获取200条,用max_id实现翻页 batch = api.get_favorites(screen_name=twitterUsername, count=200, max_id=max_id) if not batch: break # 无更多内容,终止循环 favorites.extend(batch) # 更新max_id为最后一条推文ID减1,避免重复获取 max_id = batch[-1].id - 1 except tweepy.RateLimitError: # 获取限流重置时间,计算等待时长 reset_info = api.rate_limit_status()['resources']['favorites']['/favorites/list'] wait_time = reset_info['reset'] - time.time() + 10 # 多等待10秒确保限制重置 print(f"触发限流,等待{int(wait_time/60)}分钟...") time.sleep(wait_time)
二、按指定日期筛选点赞内容
Twitter的/favorites/list接口不支持直接按日期参数筛选,但可以通过本地过滤或分页终止的方式实现:
1. 本地过滤已获取的点赞
先获取足够多的点赞内容,再根据推文的created_at字段筛选目标日期范围内的内容:
from datetime import datetime target_start = datetime(2023, 1, 1) target_end = datetime(2023, 12, 31) # 先获取全部(或批量)点赞 all_favorites = list(tweepy.Cursor(api.get_favorites, screen_name=twitterUsername, count=200).items()) # 筛选指定日期范围内的推文 filtered_favorites = [ tweet for tweet in all_favorites if target_start <= tweet.created_at <= target_end ]
2. 分页时提前终止(高效方式)
当分页获取的推文全部早于目标日期时,直接终止循环,避免无效调用:
from datetime import datetime target_date = datetime(2023, 1, 1) # 获取此日期之后的点赞 favorites = [] max_id = None while True: batch = api.get_favorites(screen_name=twitterUsername, count=200, max_id=max_id) if not batch: break # 过滤当前批次中符合日期要求的推文 valid_tweets = [t for t in batch if t.created_at >= target_date] favorites.extend(valid_tweets) # 如果当前批次的第一条推文已早于目标日期,说明后续无符合条件的内容,终止循环 if batch[0].created_at < target_date: break max_id = batch[-1].id - 1
关于之前返回更多内容的说明
你提到曾返回2500多条推文,大概率是之前调用时设置了count=200(单次拿200条),且跨了多个15分钟的速率限制周期;或者早期API的临时调整,但目前Elevated权限下/favorites/list的限制是稳定的15分钟75次调用。
内容的提问来源于stack exchange,提问作者Chris K
相关产品推荐
相关产品推荐

