Scraper с логином Puppeteer возвращает только один элемент массива - PullRequest
0 голосов
/ 07 апреля 2020

Предполагается, что этот код l oop через URL-адреса, которые извлекаются из функции scrapeProductPage. Но перед циклом необходимо войти в систему, чтобы получить цены. Цены отображаются только для зарегистрированных пользователей. Вместо того, чтобы перебирать URL-адреса, он просто возвращает извлеченные данные с одной страницы. Я получаю сообщение об ошибке: «MaxListenersExceededWarning: возможная утечка памяти в EventEmitter».

const request = require("request-promise");
const cheerio = require("cheerio");
const ObjectsToCsv = require("objects-to-csv");
const puppeteer = require('puppeteer');


const url = "https://www.example.com";

const scrapeResults = [];

async function scrapeProductPage() {
  try {
    const htmlResult = await request.get(url);
    const $ = await cheerio.load(htmlResult);

$("td.productListing-data > a[style='position:relative;float:left;']").each((index, element) => {
     let url = $(element).attr("href");
     url = "https\://www.example.com/" + url;
      const scrapeResult = { url };
      scrapeResults.push(scrapeResult);
    });
    return scrapeResults;
} catch (err) {
    console.error(err);
}
}

async function scrapeDescription(productsWithImages) {
process.setMaxListeners(0);
  const browser = await puppeteer.launch({
      headless: false
  }); 

  const page = await browser.newPage();
  await page.goto('https://www.example.com/login');

  await page.waitFor(500);

  await page.waitFor('input[name="email_address"]');
  await page.type('input[name="email_address"]', 'example@gmail.com');
  await page.type('input[name="password"]', '123test');
  await page.click('#btnLogin');

return await Promise.all(
   productsWithImages.map(async job => {
     try {
         await page.goto(job.url, { waitUntil: "load" });
        const content = await page.content();
        const $ = await cheerio.load(content);

        job.main_img = $('img#main_img').attr('src');
        job.name = $('h2').text();
        job.price =  $("td.products_info_price").text();

        return job; 
      } catch (error) {
        console.error(error);
      }
    })
  );
}



async function saveDataToCsv(data) {
  const csv = new ObjectsToCsv(data);
  console.log(csv);
}

async function scrapeWona() {
  const productsWithImages = await scrapeProductPage();
  const wonaFullData = await scrapeDescription(productsWithImages);
  await saveDataToCsv(productsWithImages);
}

scrapeWona();

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Спасибо за вашу помощь. Я посмотрел видео на udemy.com под названием «Веб-скрейпинг в Nodejs», созданное Стефаном Хилтофтом. С помощью этого видео я смог скопировать новый работающий код.

0 голосов
/ 07 апреля 2020

Причина, по которой вы получаете предупреждение, заключается в том, что process.setMaxListeners(0)

Указывает на наличие утечки памяти где-то в коде.

Вы также можете посмотреть документацию здесь : https://nodejs.org/docs/latest/api/events.html#events_emitter_setmaxlisteners_n

Посмотрите ответ здесь: node.js - запрос - Как выполнить "emitter.setMaxListeners ()"?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...