Как лучше всего реализовать синхронную очистку нескольких веб-страниц с помощью puppeteer node js? - PullRequest
1 голос
/ 04 августа 2020

Я создал сценарий Python, который считывает URL-адреса из текстового файла и использует URL-адреса в l oop для сбора аналогичной информации. Все URL-адреса взяты с одного веб-сайта. Ниже примерно показано, как выглядит код Python.

for url in urls:
    x = scrape(url)
    if has_changed(x):
        notify_me()
    else:
        continue

К сожалению, этот парсер не работает на некоторых веб-сайтах, так как веб-сайты блокируют большинство парсеров, поэтому я вынужден использовать Node js Puppetteer Stealth библиотека, с которой я не очень знаком, так как Python Pyppeteer заблокирован (вместе с Selenium, requests, requests- html et c.)

Я пытаюсь реализовать синхронный подход из Python в Node JS, но я изо всех сил пытаюсь. На данный момент это моя реализация ...

const puppeteer = require("puppeteer-extra");

// add stealth plugin and use defaults (all evasion techniques)
const StealthPlugin = require("puppeteer-extra-plugin-stealth");
const { url } = require("inspector");
puppeteer.use(StealthPlugin());

// puppeteer usage as normal
async function sad(url, number) {
  puppeteer.launch({ headless: true }).then(async (browser) => {
    console.log("Running tests..");
    const page = await browser.newPage();
    await page.goto(url);
    await page.screenshot({ path: "test" + number + ".png", fullPage: true });
    await browser.close();
    console.log(`All done, check the screenshot. ✨`);
  });
}

var urls = [
  "https://www.example1.com",
  "https://www.example2.com",
  "https://www.example3.com",
];

function iHateNode() {
  for (i in urls) {
    sad(urls[i], i);
  }
}

iHateNode();

Я создал структуру данных из массива с объектом для каждого вида, как показано ниже.

allUrls = [
    {
        url: "https://example1.org"
        extraInfo : "1234"
    }

    {
        url: "https://example1.org"
        extraInfo : "789"
    }

    {
        url: "https://example1.org"
        extraInfo : "987"
    }
    ...

]

Намерение состоит в том, что я хочу пройти l oop через каждый URL в массиве allUrls и вызвать скребок Puppetteer. Если информация изменилась, я хочу получить уведомление, а затем изменить соответствующую информацию в allUrls, чтобы отразить это новое изменение (поэтому я не получаю уведомления об этом постоянно). Я не уверен, что асинхронная природа Node JS вызовет проблемы, две функции одновременно пытаются изменить массив allUrls. Я не совсем уверен, что синхронизация - лучший подход и в этом случае, но, по крайней мере, это не должно вызывать ошибок, подобных упомянутой ранее.

1 Ответ

1 голос
/ 04 августа 2020

Просто переберите URL-адреса внутри функции asyn c, как насчет?:

puppeteer.launch({ headless: true }).then(async (browser) => {
  console.log("Running tests..");
  const page = await browser.newPage();
  for(let url of urls){
    await page.goto(url);
    await page.screenshot({ path: "test" + number + ".png", fullPage: true });        
    console.log(`All done, check the screenshot. ✨`);
  }
  await browser.close();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...