You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用snscrape按Twitter用户ID在指定日期爬取推文的报错解决问询

使用snscrape通过Twitter用户ID按日期范围爬取推文的问题解决

问题背景

使用snscrape工具时,通过用户名爬取指定日期范围的推文、或通过用户ID无日期限制爬取推文都能正常运行,但尝试通过用户ID+日期范围爬取时出现多种错误:

  1. 给TwitterUserScraper传入日期参数,报错TypeError: __init__() takes 2 positional arguments but 3 were given
  2. 给TwitterUserScraper传入带from:的搜索语法,报错ValueError: Invalid username
  3. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:14:59