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

使用Puppeteer爬取时,NodeList转数组无法在终端输出

解决Puppeteer无法在终端输出爬取到的URL数组问题

我刚仔细看了你的爬取脚本,发现几个关键问题导致终端没法正常输出urlsArray,咱们一步步来修复:

1. 等待元素加载的方式不够可靠

你用await page.waitFor(4000)是固定等待4秒,但网络波动或者页面加载慢的话,这时候目标元素.mt-CardAd-link可能还没渲染出来,导致Array.from拿到的是空数组,自然终端没输出。

修复方案:换成等待目标选择器出现的waitForSelector,还可以设置超时时间避免无限等待:

await page.waitForSelector('.mt-CardAd-link', { timeout: 10000 }); // 最多等10秒

2. catch块存在未定义变量风险

如果在browser = await puppeteer.launch()之前就报错(比如Puppeteer依赖没装好、网络连不上网站),browser变量还没赋值,这时候执行await browser.close()会直接抛出新的错误,导致后面的console.log("Browser Closed")也没法执行,你甚至看不到报错信息。

修复方案:在catch块里先判断browser是否存在再关闭:

catch (err) {
  console.log(err);
  if (browser) {
    await browser.close();
    console.log("Browser Closed");
  }
}

3. 可能触发了网站的反爬机制

很多网站会检测无头浏览器(headless模式),直接阻止爬取。你可以给Puppeteer添加一些参数模拟真实浏览器环境:

const browser = await puppeteer.launch({
  headless: true,
  args: [
    '--no-sandbox',
    '--disable-setuid-sandbox',
    '--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"'
  ]
});

4. 增加调试日志(可选但实用)

如果还是有问题,可以监听页面的控制台输出,看看page.evaluate里的代码有没有执行:

// 在page.goto之前添加
page.on('console', msg => console.log('页面内输出:', msg.text()));

然后在page.evaluate里加一句console.log(urlsArray),这样就能在终端看到页面里的数组内容,方便排查。

修改后的完整脚本

const puppeteer = require("puppeteer");

(async () => {
  let browser; // 提前声明变量,避免catch块未定义
  try {
    browser = await puppeteer.launch({
      headless: true,
      args: [
        '--no-sandbox',
        '--disable-setuid-sandbox',
        '--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"'
      ]
    });
    const page = await browser.newPage();
    
    // 监听页面控制台输出,方便调试
    page.on('console', msg => console.log('页面内输出:', msg.text()));
    
    await page.goto(`https://www.coches.net/nuevo/km-0/`);
    // 等待目标元素加载完成
    await page.waitForSelector('.mt-CardAd-link', { timeout: 10000 });
    
    const news = await page.evaluate(() => {
      const urlsArray = Array.from(document.querySelectorAll('.mt-CardAd-link')).map(a => a.href);
      console.log(urlsArray); // 页面内输出,方便调试
      return urlsArray;
    });
    
    console.log("爬取到的URL数组:", news);
    await browser.close();
    console.log("Browser Closed");
  } catch (err) {
    console.log("报错信息:", err);
    if (browser) {
      await browser.close();
      console.log("Browser Closed");
    }
  }
})();

你可以试试这个修改后的脚本,应该就能在终端正常输出URL数组了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:03:10