首页 > 解决方案 > 试图用 puppeteer 抓取 Apple 评论,但它返回空

问题描述

我正在尝试抓取以下所有评论;

https://apps.apple.com/jp/app/mcdonalds-japan/id413618155?l=en#see-all/reviews

如果您可以看到评论被遮挡,那么您需要;

我还有很长的路要走,但我已经尝试过这段代码;

import puppeteer from 'puppeteer';

const url = "https://apps.apple.com/jp/app/mcdonalds-japan/id413618155?l=en#see-all/reviews";

(async () => {

  try {

    const browser = await puppeteer.launch({
      headless: false
    });
    const page = await browser.newPage();

    await page.goto(
      url,{
      waitUntil: "domcontentloaded"
    });
    await page.waitForTimeout(4000);
    let result = await page.evaluate(() => {
      const items = Array.from(document.querySelectorAll("div"));
      return items
    })

    console.log(result);
    await browser.close();


  } catch (e) {
    console.error();
  }

})();

但结果返回空,不知道我做错了什么。

[
  {}, {}, {}, {}, {}, {}, {}, {},
  {}, {}, {}, {}, {}, {}, {}, {},
  {}, {}, {}, {}, {}, {}, {}, {},
  {}, {}, {}
]

标签: javascriptnode.jsweb-scrapingpuppeteer

解决方案


不幸的是,page.evaluate()只能传输可序列化的值(大致是 JSON 可以处理的值)。由于document.querySelectorAll()返回不可序列化的 DOM 元素集合(它们包含方法和循环引用),集合中的每个元素都被替换为一个空对象。page.$$(selector)您需要返回可序列化的值(例如,文本或属性数组)或使用类似ElementHandleAPI。


推荐阅读