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

如何通过推文ID列表批量爬取对应推文的所有回复内容

你之前用BeautifulSoup、Selenium爬不到内容是必然的,X(原Twitter)现在的反爬强度和前端渲染逻辑,这两个原生方案根本跑不通:

  • BeautifulSoup只能抓取页面初始返回的静态HTML,X的回复内容全部为用户触发滚动后才异步加载,初始源码里没有任何有效回复数据
  • 原生Selenium默认携带明确的自动化测试指纹,X的反爬系统可以直接识别拦截,手动修改指纹绕过的成本极高,完全没必要自己从零实现

下面是亲测可落地的实现方案,按稳定性从高到低排序:

推文回复爬取落地方案

方案1:官方API对接(稳定性最高,合规风险最低)

  • 适合对数据完整性要求高、有长期爬取需求的场景,完全不需要和反爬系统对抗
  • 操作流程:
    • 申请X开发者账号,获取API调用凭证,免费档单月支持拉取1000条推文关联数据,处理小批量推文ID列表完全够用,数据量较大时可以按需选择付费档位
    • 直接调用平台的对话检索接口,传入目标推文ID,分页拉取该推文所属对话线程下的所有回复,返回结果自带回复正文、发布者信息、发布时间、互动数据等全字段,不需要额外做页面解析
    • 可以直接用tweepy库封装好的方法开发,不需要手写请求签名逻辑,示例代码:
import tweepy

# 填入自己申请到的API凭证
bearer_token = "你的Bearer Token"
client = tweepy.Client(bearer_token=bearer_token)

def fetch_all_replies(tweet_id):
    replies = []
    # 首次拉取
    resp = client.get_tweets_search_recent(
        query=f"conversation_id:{tweet_id}",
        max_results=100,
        tweet_fields=["created_at", "author_id", "text"]
    )
    if resp.data:
        replies.extend(resp.data)
    # 分页拉取剩余所有结果
    while "next_token" in resp.meta:
        next_token = resp.meta["next_token"]
        resp = client.get_tweets_search_recent(
            query=f"conversation_id:{tweet_id}",
            max_results=100,
            next_token=next_token,
            tweet_fields=["created_at", "author_id", "text"]
        )
        if resp.data:
            replies.extend(resp.data)
    return replies
  • 注意事项:免费档仅支持拉取最近7天内发布的推文回复,更早的历史内容需要升级付费API权限。

方案2:开源爬虫工具(无需申请API,零使用成本)

  • 适合不想走官方申请流程、临时爬取小批量数据的场景,不需要启动图形化浏览器,爬取速度远高于Selenium
  • 优先选择snscrape,这个工具已经封装好了X的底层接口请求逻辑,自带基础反爬绕过能力,不需要登录账号就可以使用
  • 操作流程:
    • 执行安装命令:pip install snscrape
    • 直接通过对话ID参数检索对应推文下的所有内容,过滤掉原推文本身即可拿到全量回复,示例代码:
import snscrape.modules.twitter as sntwitter

def fetch_replies_by_snscrape(tweet_id):
    replies = []
    query = f"conversation_id:{tweet_id}"
    for tweet in sntwitter.TwitterSearchScraper(query).get_items():
        # 过滤原推文,仅保留回复内容
        if tweet.id != tweet_id:
            replies.append({
                "content": tweet.rawContent,
                "username": tweet.user.username,
                "publish_time": tweet.date,
                "like_count": tweet.likeCount
            })
    return replies
  • 异常处理:如果遇到临时限流或者接口失效,可以更换为twscrape工具,支持导入个人X账号Cookie做请求签名,稳定性更强;爬取时给每次请求加3-5秒的随机间隔,基本不会触发拦截。

通用避坑提示

  • 无论使用哪种方案,不要用单IP做高频请求,请求频率控制在1次/秒以上,避免IP被临时封禁
  • 爬取到的内容仅限个人研究使用,不要用于商业用途或者公开发布,避免违反平台用户协议。

内容的提问来源于stack exchange,提问作者Chacko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:24:16