使用snscrape按Twitter用户ID在指定日期爬取推文的报错解决问询
使用snscrape通过Twitter用户ID按日期范围爬取推文的问题解决
问题背景
使用snscrape工具时,通过用户名爬取指定日期范围的推文、或通过用户ID无日期限制爬取推文都能正常运行,但尝试通过用户ID+日期范围爬取时出现多种错误:
- 给
TwitterUserScraper传入日期参数,报错TypeError: __init__() takes 2 positional arguments but 3 were given - 给
TwitterUserScraper传入带from:的搜索语法,报错ValueError: Invalid username - 用
TwitterSearchScraper直接把ID放入from:语法,无报错但无结果,因为搜索器把ID当成了用户名。
错误原因分析
- 第一种错误:
TwitterUserScraper的构造函数仅接受一个参数(用户名或用户ID),不支持直接传入日期过滤参数,它的作用是获取指定用户的所有推文,而非按条件搜索。 - 第二种错误:
TwitterUserScraper的参数只能是纯用户名或纯用户ID,不能是带搜索语法的字符串,它不是搜索类爬虫,无法解析from:这类搜索指令。 - 第三种无结果情况:
TwitterSearchScraper的from:语法默认匹配用户名,直接填入用户ID的话,Twitter搜索会认为你要找用户名是该数字的用户,而这类用户几乎不存在,因此返回空结果。
正确解决方案
方法1:使用TwitterSearchScraper+正确的ID搜索语法
Twitter搜索支持通过from:id:<用户ID>的语法指定用户ID,而非用户名。构造搜索字符串时使用该格式,即可让搜索器正确识别目标用户并过滤日期范围。
示例代码:
import snscrape.modules.twitter as sntwitter users_id = [90402416, 571111858] tweets_list1 = [] for userId in users_id: # 构造包含用户ID和日期范围的搜索查询 search_query = f'from:id:{userId} since:2021-01-01 until:2022-01-01' for i, tweet in enumerate(sntwitter.TwitterSearchScraper(search_query).get_items()): if i > 100: break tweets_list1.append([tweet.date, tweet.user.username, tweet.user.id, tweet.rawContent])
方法2:TwitterUserScraper获取推文后本地过滤日期
如果不想依赖搜索API的语法,可以先获取指定用户的所有推文,再在代码中手动过滤日期范围。这种方式适合需要自定义过滤逻辑的场景,但用户推文较多时效率较低。
示例代码:
import snscrape.modules.twitter as sntwitter import datetime users_id = [90402416, 571111858] tweets_list1 = [] # 定义日期范围(注意要带时区,和tweet.date的时区一致) start_date = datetime.datetime(2021, 1, 1, tzinfo=datetime.timezone.utc) end_date = datetime.datetime(2022, 1, 1, tzinfo=datetime.timezone.utc) for userId in users_id: for i, tweet in enumerate(sntwitter.TwitterUserScraper(userId).get_items()): if i > 100: break # 过滤符合日期范围的推文 if start_date <= tweet.date <= end_date: tweets_list1.append([tweet.date, tweet.user.username, tweet.user.id, tweet.rawContent])
方法对比
- 方法1:利用Twitter搜索的服务器端过滤,效率更高,无需本地处理大量推文,适合大日期范围或用户推文数量多的场景。
- 方法2:不依赖搜索语法,过滤逻辑更灵活,适合需要对推文进行额外自定义筛选的场景,但性能受用户推文总量影响。
内容的提问来源于stack exchange,提问作者AlejandroDGR
相关产品推荐
相关产品推荐

