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

如何使用Dart通过ID或类名获取指定Twitter账号的所有推文

问题原因说明

你当前代码无法打印推文内容有两个核心原因:

  1. X(原Twitter)属于客户端渲染站点,普通http.get请求只能拿到未加载动态内容的初始HTML骨架,推文、地理标签等内容都是后续通过JS请求接口动态渲染的,直接解析静态HTML找不到对应元素
  2. getElementsByClassName返回的是元素集合,永远不会为null,你写的空判断逻辑无效,实际拿到的是空集合,所以打印结果为空
可行实现方案

方案1:调用官方API(稳定性最高)

这是最推荐的实现方式,可完全避免前端结构变动、反爬拦截的问题:

  • 申请X开发者账号,获取对应的API调用密钥
  • 调用用户查询接口通过用户名获取对应用户的ID
  • 调用用户推文查询接口拉取该账号的全量推文
  • 推文中的经纬度信息会直接在返回结果的geo、coordinates字段中返回,无需额外解析HTML

方案2:无头浏览器渲染后解析(适合无API权限场景)

如果要坚持通过HTML解析的方式实现,需要使用支持执行JS的无头浏览器加载页面,等内容完全渲染后再解析,推荐使用Dart的puppeteer封装库,示例代码如下:

import 'package:puppeteer/puppeteer.dart';

void main() async {
  // 启动无头浏览器
  var browser = await puppeteer.launch(headless: true);
  var page = await browser.newPage();
  // 加载目标用户主页,等待网络请求完成
  await page.goto('https://twitter.com/Test15598298', wait: WaitUntil.networkIdle);
  // 等待推文元素渲染完成
  await page.waitForSelector('article[data-testid="tweet"]');
  // 获取当前页面所有推文元素
  var tweetElements = await page.$$('article[data-testid="tweet"]');

  for (var tweet in tweetElements) {
    // 提取推文文本内容
    var tweetContent = await tweet.$eval(
      'div[data-testid="tweetText"]',
      (element) => element.text
    );
    // 提取经纬度信息
    var geoLink = await tweet.$OrNull('a[href*="/place/"]');
    if (geoLink != null) {
      // 地理标签链接中包含位置ID,可进一步解析获取经纬度
      var placeHref = await geoLink.evaluate('el => el.href') as String;
      print('位置链接:$placeHref');
    }
    print('推文内容:$tweetContent');
  }

  await browser.close();
}
注意事项
  • X有严格的反爬机制,频繁请求会触发验证码、IP封禁,请求时需要控制频率,配置合理的请求头和代理
  • 前端元素定位优先使用data-testid这类稳定性高的属性,不要用随机生成的哈希类名,避免站点更新后定位失效
  • 经纬度信息只有用户发推时主动开启位置定位才会存在,大部分推文默认不带地理标签

经纬度信息示例:
经纬度示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:27:03