Есть несколько проблем с вашим кодом.
Прежде всего, страница, которую вы пытаетесь посетить, загружает ее содержимое динамически, поэтому вы можете дождаться добавления элементов, указанных в строке селектора, в DOM, используя page.waitForSelector()
:
await page.waitForSelector('#app > div > div.container > div.now-list-restautants > div > div > a > div.info-restaurant > p > i');
Кроме того, внутри page.evaluate()
переменная jq
не определена:
document.getElementsByTagName('head')[0].appendChild(jq); // jq is not defined
Кроме того, вы излишне ждете result
дважды. Вы можете просто вернуть result
:
return result;
Наконец, убедитесь, что вы используете browser.close()
после того, как закончите очищать ссылки:
await browser.close();
Остальные проблемы, перечисленные ниже, связаны со стилем и не обязательно функциональностью.
Вы должны использовать let
и const
вместо var
всякий раз, когда это возможно ( источник ):
const arr = ... // good
var arr = ... // bad
Если вы собираетесь преобразовать итерируемый объект в массив, используйте синтаксис вместо Array.from()
( source ):
[...elements] // good
Array.from(elements) // bad
Вы можете получить атрибут href
из элементов, используя свойство href
, и, следовательно, вам не нужно использовать getAttribute('href')
:
element.querySelector('.item-content').href // good
element.querySelector('.item-content').getAttribute('href') // bad
Вот полный рабочий пример:
'use strict';
const puppeteer = require('puppeteer');
let scrape = async () => {
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.goto('https://www.now.vn/ho-chi-minh/food/danh-sach-dia-diem-phuc-vu-ca-phe,nuoc-ep-sinh-to,16,70-giao-tan-noi');
await page.waitForSelector('#app > div > div.container > div.now-list-restautants > div > div > a > div.info-restaurant > p > i');
const result = await page.evaluate(() => {
// document.getElementsByTagName('head')[0].appendChild(jq);
const data2 = [];
const elements = document.querySelector('#app > div > div.container > div.now-list-restautants > div').children;
const arr = [...elements];
const regex = '';
arr.shift();
arr.forEach((element, index) => {
const tagi = document.querySelector('#app > div > div.container > div.now-list-restautants > div > div:nth-child(' + (index + 2) + ') > a > div.info-restaurant > p > i');
if (element.contains(tagi)) {
data2.push(element.querySelector('.item-content').href);
}
});
return data2;
});
await browser.close();
return result;
};
scrape().then(value => {
console.log(value);
});