【问题标题】:Can't scrape from a page I navigate to by using Puppeteer无法从我使用 Puppeteer 导航到的页面中抓取
【发布时间】:2021-03-25 08:47:54
【问题描述】:

我对 Puppeteer 还很陌生,我正在尝试练习跟踪亚马逊的选定商品。但是,当我尝试从页面检索一些结果时遇到了问题。

我希望这种自动化工作的方式是按照以下步骤操作:

  • 新标签。
  • 进入亚马逊首页。
  • 在搜索元素中输入给定的产品名称。
  • 按回车键。
  • 返回产品名称和价格。

检查以下示例:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    headless: false,
  });
  const page = await browser.newPage();
  await page.setRequestInterception(true);


  page.on('request', (req) => {      // don't load any fonts or images on my requests. To Boost the  performance

    if (req.resourceType() == 'font' /* || req.resourceType() == 'image' || req.resourceType() == 'stylesheet'*/) {
      req.abort();
    }
    else {
      req.continue(); {

      }
    }
  });

const baseDomain = 'https://www.amazon.com';

  await page.goto(`${baseDomain}/`, { waitUntil: "networkidle0" });

await page.click("#twotabsearchtextbox" ,{delay: 50})

  await page.type("#twotabsearchtextbox", "Bose QuietComfort 35 II",{delay: 50});
  await page.keyboard.press("Enter");
  await page.waitForNavigation({
    waitUntil: 'networkidle2',
  });

  let productTitle = await page.$$(".a-size-medium, .a-color-base, .a-text-normal")[43]; //varible that holds the title of the product

  console.log(productTitle );

  debugger;

})();

当我执行此代码时,我会在 console.log 中为变量 productTitle 获得一个未定义的值。从导航到的页面中抓取信息时遇到了很多麻烦。我曾经做过page.evaluate(),它只在我从我告诉浏览器要转到的页面上抓取时才起作用。

【问题讨论】:

    标签: javascript node.js puppeteer


    【解决方案1】:

    第一个问题在这一行:

    let productTitle = await page.$$(".a-size-medium, .a-color-base, .a-text-normal")[43];
    // is equivalent to:
    let productTitle = await (somePromise[43]);
    
    // As you guessed it, a Promise does not have a property `43`,
    // so I think you meant to do this instead:
    let productTitle = (await page.$$(".a-size-medium, .a-color-base, .a-text-normal"))[43];
    

    一旦解决了这个问题,您就不会得到标题文本,而是 DOM 元素的句柄。所以你可以这样做:

    let titleElem = (await page.$$(".a-size-medium, .a-color-base, .a-text-normal"))[43];
    let productTitle = await titleElem.evaluate(node => node.innerText);
    
    console.log(productTitle); // "Microphone"
    

    但是,我不确定简单地选择第 43 个元素是否总能得到你想要的,但如果不是,那将是另一个问题的主题。

    【讨论】:

    • 非常简单明了的答案。这个答案对我有用。我同意这不是获得第 43 个元素的最佳做法。这只是我确保得到我想要的东西的一种方式。谢谢,祝你有美好的一天。
    猜你喜欢
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多