
本文针对使用 Puppeteer 爬取 naamhinaam.com 网站数据时,出现返回空数组的问题,提供了一套可行的解决方案。通过分析问题代码,找出选择器和循环逻辑上的错误,并提供优化后的代码示例,确保能正确抓取网页上的婴儿名字和含义信息,并避免因广告元素干扰导致的问题。本文还强调了headless模式的运用以及数据清洗的重要性。
原始代码尝试通过循环遍历页面上的元素,并根据复杂的 CSS 选择器提取婴儿名字。然而,这种方法存在几个问题:
为了解决上述问题,我们应该采用更稳定、更灵活的方法来提取数据。以下是优化后的代码示例:
const puppeteer = require("puppeteer");
const express = require("express");
const cors = require("cors");
const app = express();
app.use(cors());
let data = [];
(async () => {
const browser = await puppeteer.launch({
headless: true, // 建议使用 headless 模式
defaultViewport: null,
});
const page = await browser.newPage();
for (let pageNumber = 1; pageNumber <= 42; pageNumber++) {
await page.goto(`https://naamhinaam.com/baby-girl-names-a?page=${pageNumber}`);
await page.waitForTimeout(3000);
// 使用更简洁、稳定的选择器
let nameElements = await page.$$(`a.nsg__name`);
let meaningElements = await page.$$(`div.nsg__meaning > i`);
// 确保名字和含义的数量一致
if (nameElements.length !== meaningElements.length) {
console.warn(`页面 ${pageNumber} 上的名字和含义数量不一致,可能存在问题。`);
continue; // 跳过当前页面
}
for (let i = 0; i < nameElements.length; i++) {
let fullName = "";
try {
let name = await page.evaluate(el => el.textContent, nameElements[i]);
let meaning = await page.evaluate(el => el.textContent, meaningElements[i]);
fullName = `${name.split(/[\n\t]/).join('').trim()}, ${meaning}`;
data.push({ fullName });
} catch (error) {
console.error(`处理页面 ${pageNumber} 的第 ${i} 个元素时出错:`, error);
}
}
}
console.log(data);
await browser.close();
})();
app.get("/", (req, res) => {
res.status(200).json(data);
});
app.listen(3000, () => {
console.log("App is running...");
});代码解释:
通过使用更稳定的选择器、进行数量一致性检查、添加错误处理机制以及清洗数据,我们可以更可靠地使用 Puppeteer 爬取网页数据。同时,需要注意网站结构变化、反爬机制以及法律法规等问题,确保爬虫的稳定性和合法性。
以上就是Puppeteer 爬取网页数据返回空数组问题解决方案的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号