使用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
相关产品推荐
相关产品推荐

