努力抓取多个页面-Cheerio.js

时间:2020-02-19 03:00:40

标签: javascript node.js asynchronous web-scraping cheerio

我正在尝试使用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 :(得分:0)

singleProduct.detailsPage始终为空的原因是scrapeFullDetailsPage()函数本质上是异步的,因为axios库基于Promise。

请查看How to make axios synchronous作为一种潜在的解决方案,希望对您有所帮助。