Работает ли консоль Chrome так же, как код Visual Studio? - PullRequest
0 голосов
/ 03 ноября 2018

Я хочу сканировать Интернет по ссылкам со скидками, поэтому я сделал это. Когда я тестировал свой код на консоли, data2 (который является массивом ссылок, которые я сохранил) был верным, как я и ожидал. data2 только перечисляет ссылки, которые имеют скидку.

This code written on Chrome console

Но когда я запускаю на консоли VSCode, я получаю другой результат (data2 теперь имеет все ссылки, а не только скидки).

This code written on VisualStudioCode

Можете ли вы сказать мне разницу? Я сомневаюсь, что мое условие «если» в VScode не может быть адаптировано, что приводит к этому.

Примечание: Код, который я запускаю по хрому, копируется с VSCODE, логика точно такая же.

1 Ответ

0 голосов
/ 04 ноября 2018

Есть несколько проблем с вашим кодом.

Прежде всего, страница, которую вы пытаетесь посетить, загружает ее содержимое динамически, поэтому вы можете дождаться добавления элементов, указанных в строке селектора, в 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);
});
...