Изо всех сил, чтобы очистить несколько страниц - Cheerio. js - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь создать веб-скребок, используя Javascript и Cheerio, и у меня возникают некоторые трудности, когда я пытаюсь очистить данные с URL-адресов на страницах соскоба. Например, я очищаю первую страницу для нескольких деталей (включая URL-адрес связанной страницы), а затем, когда я пытаюсь очистить связанную страницу, используя функцию обратного вызова, я не могу назначить возвращаемое значение для объекта. Оба скребка работают по отдельности, однако у меня возникают проблемы с их асинхронной работой, и переменная detailsPage всегда возвращается как неопределенная.

Любая помощь будет принята с благодарностью!

const cheerio = require("cheerio");
const axios = require("axios");

const scrapeAllData = () => {
  return scrapeListingPage(scrapeFullDetailsPage, "www.fakeURL.com");
};



function scrapeListingPage(callbackFn, url) {
  axios.get(url)
    .then(response => {
      const $ = cheerio.load(response.data);
      let products = [];
      let singleProduct = {};

      $(".page-content-thumbs-two .row .col-sm-8").each((i, e) => {
        singleProduct = {
          price: $(e).find($("h3")),
          shortDescription: $(e).find($("p")),
          fullProductDetailsURL: $(e).find($("a")).attr("href"),
          detailsPageData: {}
        };
        singleProduct.detailsPage = scrapeFullDetailsPage(singleProduct.fullDescriptionURL);
        products.push(singleProduct);
      });
      console.log("Product DATA --> ", products);
    });
}

function scrapeFullDetailsPage(url) {
  axios.get(url).then(res => {
    const $ = cheerio.load(res.data);
    let detailsPageData = {};
    $("#container").each((i, e) => {
      detailsPageData.fullDescription = $(e)
        .find($("p span"))
        .text();
    });
    console.log("detailsPageData", detailsPageData);
    return detailsPageData;
  });
}

scrapeAllData();

1 Ответ

0 голосов
/ 19 февраля 2020

Причина, по которой ваш singleProduct.detailsPage всегда пуст, заключается в том, что функция scrapeFullDetailsPage() по своей природе асинхронна, поскольку библиотека ax ios основана на Promise.

Пожалуйста, изучите Как сделать топор ios синхронный как одно из возможных решений, и я надеюсь, что это поможет.

...