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

