首页 > 解决方案 > 努力抓取多个页面 - Cheerio.js

问题描述

我正在尝试使用 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();

标签: javascriptnode.jsasynchronousweb-scrapingcheerio

解决方案


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

请查看如何使 axios 同步作为一种潜在的解决方案,我希望它有所帮助。


推荐阅读