如何使用Snscrape抓取仅过去一小时内的Twitter推文?
问题分析与修复方案
你的代码主要是时间格式和查询语法出了问题,导致无法正确筛选过去一小时的推文:
核心问题点
- 时间格式错误:Snscrape适配的Twitter搜索时间参数不需要微秒(
%f),且datetime.utcnow()是无时区感知对象,%z会输出空字符串,导致时间条件不生效。 - 查询参数大小写错误:Twitter搜索的
since:和until:参数必须小写,你写的Since:会被忽略。
修正后的代码
import pandas as pd import snscrape.modules.twitter as sntwitter from datetime import datetime, timedelta # 获取当前带时区的UTC时间 now = datetime.now(datetime.timezone.utc) since = now - timedelta(hours=1) # 转换为Snscrape要求的UTC时间格式:YYYY-MM-DD HH:MM:SS since_str = since.strftime('%Y-%m-%d %H:%M:%S') until_str = now.strftime('%Y-%m-%d %H:%M:%S') # 修正查询语法:参数名小写,格式符合要求 query = '#SOSREX since:' + since_str + ' until:' + until_str SOSREX_data = [] for tweet in sntwitter.TwitterSearchScraper(query).get_items(): if len(SOSREX_data) > 100: break SOSREX_data.append([ tweet.date, tweet.user.username, tweet.user.displayname, tweet.content, tweet.likeCount, tweet.retweetCount, tweet.sourceLabel, tweet.user.followersCount, tweet.user.location ]) Tweets_data = pd.DataFrame( SOSREX_data, columns=[ "Date_tweeted", "username", "display_name", "Tweets", "Number_of_Likes", "Number_retweets", "Source_of_Tweet", "number_of_followers", "location" ] )
关键调整说明
- 改用
datetime.now(datetime.timezone.utc)获取带时区的UTC时间,确保时间戳准确匹配Twitter的时间规则。 - 去掉时间格式中的微秒(
%f)和时区标识(%z),Twitter搜索默认使用UTC,不需要额外标注。 - 将查询中的
Since:改为小写的since:,严格遵循Twitter搜索的语法规范。
内容的提问来源于stack exchange,提问作者Dakon
相关产品推荐
相关产品推荐

