用p操纵者报废亚马逊

时间:2019-04-27 19:20:00

标签: javascript node.js puppeteer

我目前正在从事一些个人项目,但我只是想做一些亚马逊废料收集工作,因此我可以获得产品的详细信息,例如名称和价格。

我发现使用相同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 ' } ]

1 个答案:

答案 0 :(得分:2)

仅设置视口的高度和重量不足以完全模拟移动浏览器。现在,该页面假定您只有一个很小的浏览器窗口。

模拟移动设备的最简单方法是使用功能page.emulate和默认DeviceDesriptors,其中包含有关大量移动设备的信息。

page.emulate的文档报价:

  

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

           

为帮助仿真,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之后使用原始代码。这为我返回了产品的名称和价格。