
本文旨在解决在使用 Puppeteer 抓取网页数据时,遇到返回空数组的问题。通过分析问题代码,找到导致问题的原因,并提供修正后的代码示例,确保能正确抓取目标网站的数据,并清晰地呈现抓取结果。本文重点关注选择器的使用和异步操作的处理,帮助开发者避免类似问题。
在使用 Puppeteer 进行网页数据抓取时,返回空数组是一个常见的问题。通常,这与选择器错误、异步操作未正确处理或目标元素未加载有关。下面将分析一个实际案例,并提供解决方案。
问题分析
原始代码尝试从 https://naamhinaam.com/baby-girl-names-a 网站抓取婴儿名字和含义。代码存在以下潜在问题:
解决方案
以下是修正后的代码,它解决了上述问题:
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, // 建议设置为 true,提高效率
    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`);
    // 循环遍历抓取数据
    for (let i = 0; i < nameElements.length; i++) {
      let fullName = "";
      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 });
    }
  }
  console.log(data);
  await browser.close();
})();
app.get("/", (req, res) => {
  res.status(200).json(data);
});
app.listen(3000, () => {
  console.log("App is running...");
});代码解释:
注意事项:
总结
通过简化选择器、移除不必要的代码、使用 page.$$ 获取所有元素以及清晰的数据提取,可以有效地解决 Puppeteer 抓取网页数据返回空数组的问题。同时,需要注意网站结构变化、反爬机制以及遵守 robots.txt 协议。通过不断学习和实践,可以更好地掌握 Puppeteer 的使用技巧,并高效地抓取所需的网页数据.
以上就是使用 Puppeteer 抓取网页数据返回空数组的解决方案的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号