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

使用Puppeteer爬取Twitter时返回空数组的问题求助

解决Puppeteer爬取Twitter推文返回空数组的问题

你的代码存在几个关键问题导致返回空数组,下面逐一给出修正方案:

1. 缺少cheerio依赖及引入

代码中使用了cheerio.load()但未引入cheerio模块,先安装依赖:

npm install cheerio

再在代码顶部添加引入语句:

const cheerio = require('cheerio');

2. DOM选择器错误

Twitter当前的DOM结构和你使用的类名完全不匹配,且选择器里的"是HTML转义字符,需改为正常引号:

  • 推文文本:不再是.tweet-text,正确选择器为[data-testid="tweetText"]
  • 推文图片:不是.tweet-image,需定位[data-testid="tweetPhoto"]下的img标签
  • 推文视频:对应[data-testid="videoPlayer"]内的video或source标签(部分动态视频需额外等待加载)

3. 元素等待逻辑不充分

networkidle2状态不代表推文已渲染完成,需明确等待推文元素出现:

await page.waitForSelector('[data-testid="tweet"]', { timeout: 10000 });

4. 防爬虫识别优化(可选但关键)

Twitter会识别无头浏览器,建议设置用户代理并禁用自动化特征:

await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36');
await page.setExtraHTTPHeaders({
  'Accept-Language': 'en-US,en;q=0.9'
});
await page.evaluateOnNewDocument(() => {
  delete navigator.__proto__.webdriver;
});

修正后的完整代码

//Scraper.js
const puppeteer = require('puppeteer');
const fs = require('fs');
const cheerio = require('cheerio'); // 新增cheerio引入

async function scrapeTwitter() {
  try {
    const browser = await puppeteer.launch({
      headless: 'new', // 使用新版无头模式,更贴近真实浏览器
      args: ['--no-sandbox', '--disable-setuid-sandbox']
    });
    const page = await browser.newPage();
    
    // 设置用户代理与反检测
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36');
    await page.setExtraHTTPHeaders({
      'Accept-Language': 'en-US,en;q=0.9'
    });
    await page.evaluateOnNewDocument(() => {
      delete navigator.__proto__.webdriver;
    });

    await page.goto('https://twitter.com/coindesk', { waitUntil: 'networkidle2' });
    // 等待推文元素加载完成
    await page.waitForSelector('[data-testid="tweet"]', { timeout: 10000 });

    const html = await page.content();
    const $ = cheerio.load(html);
    const tweets = $('[data-testid="tweet"]'); // 修正引号问题
    
    const posts = [];
    tweets.each(function () {
      // 修正文本选择器
      const text = $(this).find('[data-testid="tweetText"]').text().trim();
      // 修正图片选择器
      const image = $(this).find('[data-testid="tweetPhoto"] img').attr('src');
      // 修正视频选择器
      const video = $(this).find('[data-testid="videoPlayer"] video').attr('src') || 
                    $(this).find('[data-testid="videoPlayer"] source').attr('src');
      posts.push({ text, image, video });
    });
    
    await browser.close();
    return posts;
  } catch (error) {
    console.error('Error scraping Twitter:', error);
    return [];
  } 
}

module.exports = scrapeTwitter;

额外注意事项

  • 目前Twitter大部分内容需要登录才能访问,未登录状态下爬取的内容有限,可添加模拟登录逻辑(通过page.type和page.click实现)。
  • 频繁爬取可能触发IP限制,建议添加请求间隔或使用代理。

内容的提问来源于stack exchange,提问作者lyon98.dbios

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 03:58:12