使用snscrape抓取过去30天每日10条推特出现跳日问题如何解决
问题原因梳理
- 日期更新逻辑位置错误:你将日期后移的代码放在了内层遍历单条推文的循环中,每抓取1条当天的推文就会把日期往后挪1天,根本没有等当天的10条推文全部抓取完成再切换日期,这是跳天的核心原因。
- 推文抓取数量阈值错误:当前代码中设置的是
if i>3: break,最多只能抓取4条单日推文,远达不到你需要的10条的需求。 - 循环变量重复修改冲突:外层
for x in range(30)已经会自动迭代x计数,你在内层循环中额外手动执行x+=1,会打乱外层循环的计数逻辑,导致循环提前终止。 - 冗余的i自增操作:enumerate方法已经会自动为i迭代计数,手动写
i+=1属于多余操作,会导致计数跳步,进一步减少单日抓取的推文数量。
修正后的代码示例
from datetime import datetime, timedelta import snscrape.modules.twitter as sntwitter # 初始化日期:从30天前开始抓取,单日查询区间为[since, until) first_date = (datetime.now() - timedelta(days=30)).strftime('%Y-%m-%d') second_date = (datetime.now() - timedelta(days=29)).strftime('%Y-%m-%d') for x in range(30): # 先完成当日的推文抓取 for i, tweet in enumerate(sntwitter.TwitterSearchScraper(f'ethereum exclude:retweets lang:en since:{first_date} until:{second_date}').get_items()): if i >= 10: # 满10条就停止当日抓取 break run_the_tweets(tweet) # 你的自定义推文处理逻辑 # 当日抓取完成后再统一切换到下一天的日期 first_date = (datetime.strptime(first_date, '%Y-%m-%d') + timedelta(days=1)).strftime('%Y-%m-%d') second_date = (datetime.strptime(second_date, '%Y-%m-%d') + timedelta(days=1)).strftime('%Y-%m-%d') # 30天全部抓取完成后执行收尾逻辑 final_day()
逻辑说明
- 外层循环固定遍历30天,每次进入循环时先锁定当日的查询时间区间,避免日期提前变动
- 内层循环仅负责抓取当日的推文,累计到10条就主动终止,不会修改日期参数
- 当日的所有符合要求的推文处理完成后,再统一把日期往后挪1天,进入下一轮循环
- 所有冗余的变量自增操作全部移除,避免计数逻辑混乱
内容的提问来源于stack exchange,提问作者rubypoe
相关产品推荐
相关产品推荐

