Puppeteer. js - парсинг списка доменов и хранение данных - PullRequest
1 голос
/ 19 июня 2020

У меня проблемы с очисткой списка URL-адресов и сохранением данных из них в массиве. Я думаю, что моя основная проблема - это контекст кукловода и браузера.

Я хочу проверить тексты привязок, но только в привязках со строкой c в атрибуте href.

Шаги:

  1. Инициализировать настройку хрома
  2. Использовать для l oop в массиве с URL-адресами
  3. В для l oop выберите все вхождения таких URL-адресов и удалить текст привязки
  4. И теперь у меня проблема с сохранением его в какой-то переменной с областью действия за пределами l oop и в контексте кукловода

Я использовал несколько методов page.evaluate(), page.evaluateHandle(), page.$$(), page.$$eval(), но мои проблемы следующие:

  1. Переход на новую страницу, похоже, перезаписывает предыдущее значение из-за перезагрузки Chromium
  2. У меня нет правильного представления, как использовать оператор распространения / pu sh для клонирования массива в марионетке. js context.

Я думаю, что идеальный способ - передавать данные каждый раз время от переменных контекста браузера до кукловода. js переменная контекста.

Был бы рад за y советы / решения :) Код ниже

Индекс. js файл:

const puppeteer = require("puppeteer");
const jsonFile = require("./example.json");
const numberOfUrls = jsonFile.urls.length;
const urlsArray = jsonFile.urls;

(async () => {
  try {
    // initial settings for Chromium
    const browser = await puppeteer.launch({
      defaultViewport: null,
      headless: false,
      devtools: true,
    });
    const page = await browser.newPage();
    await page.setUserAgent(
      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
    );

    await page.setViewport({ width: 0, height: 0, deviceScaleFactor: 1 });

    // for loop on urls list
    for (let i = 0; i < numberOfUrls; i++) {
      await page.goto(urlsArray[i]);
      await page.waitFor(1000);
      const elements = await page.$$eval( `a[href*="https://mysuperdomain.com/"]`,  elements => elements.map(el => el.innerText));
      console.log(await {url: urlsArray[i],
         urlsTexts: elements});

    }
    //end for loop
  } catch (error) {
    console.log(`Catched error: ${error}`);
  }

})();

пример. json файл:

{
    "urls": [
        "https://exampledomain1.com/something/",
        "https://exampledomain2.com/something/",
        "https://exampledomain3.com/something/"
    ]
}

Предпочтительный вывод:

[{
  url: 'https://exampledomain1.com/something/',
  urlsTexts: [ 'learn more', 'go to our partner' ]
},
{
  url: 'https://exampledomain2.com/something/',
  urlsTexts: [ 'go to mysuperdomain', 'check on mysuperdomain.com' ]
}]

1 Ответ

1 голос
/ 19 июня 2020

Вам просто нужно внести несколько исправлений:

// for loop on urls list

const result = [];

for (let i = 0; i < numberOfUrls; i++) {
  await page.goto(urlsArray[i]);
  await page.waitFor(1000);
  const elements = await page.$$eval( `a[href*="https://mysuperdomain.com/"]`,  elements => elements.map(el => el.innerText));
  result.push({ url: urlsArray[i], urlsTexts: elements });
}

console.log(result);

//end for loop
...