Не могу соскрести со страницы, на которую я перехожу с помощью Puppeteer

#javascript #node.js #puppeteer

#javascript #node.js #puppeteer

Вопрос:

Я довольно новичок в Puppeteer и пытаюсь практиковать отслеживание выбранного товара с Amazon. Однако я сталкиваюсь с проблемой, когда пытаюсь получить некоторые результаты со страницы.

Я предполагал, что эта автоматизация будет работать, выполнив следующие шаги:

  • Новая вкладка.
  • Перейдите на домашнюю страницу Amazon.
  • Введите указанное название продукта в элемент поиска.
  • Нажмите клавишу ввода.
  • Верните название продукта и цену.

Проверьте этот пример ниже:

 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;

})();
 

когда я выполняю этот код, я попадаю в консоль.запишите значение undefined для переменной ProductTitle . У меня было много проблем с очисткой информации со страницы, на которую я перехожу. Раньше я делал page.evaluate() , и это работало только тогда, когда я выполняю очистку со страницы, на которую я указал браузеру перейти.

Ответ №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-го элемента всегда даст вам тот, который вы хотите, но если это не так, это будет тема для другого вопроса.

Комментарии:

1. Очень простой и понятный ответ. Этот ответ сработал для меня. Я согласен, что это не лучшая практика для получения 43-го элемента. Для меня это был просто способ убедиться, что я получаю то, что хотел. Спасибо, и хорошего дня.