#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-го элемента. Для меня это был просто способ убедиться, что я получаю то, что хотел. Спасибо, и хорошего дня.