javascript 用 puppet 师刮亚马逊

ddrv8njm  于 2023-06-04  发布在  Java
关注(0)|答案(2)|浏览(172)

我目前正在做一些个人项目,我只是有一个想法,做一些亚马逊刮,这样我就可以得到产品的细节,如名称和价格。
我发现,最一致的视图,使用相同的id的产品名称和价格是移动的视图,所以这就是为什么我使用它。
问题是我无法得到价格。
我已经做了同样的完全查询选择器的名称(工程)在价格,但没有成功。

const puppeteer = require('puppeteer');

const url = 'https://www.amazon.com/dp/B01MUAGZ49';

(async () => {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  await page.setViewport({ width: 360, height: 640 });
  await page.goto(url);

  let producData = await page.evaluate(() => {
    let productDetails = [];

    let elements = document.querySelectorAll('#a-page');

    elements.forEach(element => {
      let detailsJson = {};

      try {
        detailsJson.name = element.querySelector('h1#title').innerText;
        detailsJson.price = element.querySelector('#newBuyBoxPrice').innerText;
      } catch (exception) {}

      productDetails.push(detailsJson);
    });

    return productDetails;
  });

  console.dir(producData);
})();

我应该在console.dir中获取名称和价格,但现在我只得到

[ { name: 'Nintendo Switch – Neon Red and Neon Blue Joy-Con ' } ]
wsewodh2

wsewodh21#

仅设置视口高度和权重不足以完全模拟移动的浏览器。现在,页面假设您只有一个非常小的浏览器窗口。
模拟移动终端最简单的方法是使用函数page.emulate和默认值DeviceDesriptors,它们包含有关大量移动设备的信息。

引用page.emulate文档:

模拟给定的设备指标和用户代理。此方法是调用两个方法的快捷方式:

  • page.setUserAgent(userAgent)
  • page.setViewport(viewport)

为了帮助仿真,puppeteer提供了一个设备描述符列表,可以通过require('puppeteer/DeviceDescriptors')命令获得。[...]

示例

下面是一个关于如何在访问页面时模拟iPhone的示例。

const puppeteer = require('puppeteer');
const devices = require('puppeteer/DeviceDescriptors');
const iPhone = devices['iPhone 6'];

const url = '...';

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.emulate(iPhone);
  await page.goto(url);

  // Simlified page.evaluate
  let producData = await page.evaluate(() => ({
    name: document.querySelector('#a-page h1#title').innerText,
    price: document.querySelector('#a-page #newBuyBoxPrice').innerText
  }));

  console.dir(producData);
})();

我还对page.evaluate进行了一点简化,当然您也可以在page.goto之后使用原始代码。这为我返回了产品的名称和价格。

uqzxnwby

uqzxnwby2#

目前,你不需要Puppeteer来抓取亚马逊或其他流行的电子商务网站。你可以使用一个NPM包ecommerce-scraper-js来实现。它使用起来非常简单。
如果您想通过搜索查询获得列表:

amazon.getListings("searchQuery").then(console.log);

如果您需要获取所选产品信息:

amazon.getListingInfo("https://www.amazon.com/PlayStation-5-Digital/dp/B08FC6MR62/").then(console.log);

你可以在他们的文档中看到更多的用例(带例子)。

相关问题