Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 努力抓取多个页面-Cheerio.js_Javascript_Node.js_Asynchronous_Web Scraping_Cheerio - Fatal编程技术网

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

Javascript 努力抓取多个页面-Cheerio.js,javascript,node.js,asynchronous,web-scraping,cheerio,Javascript,Node.js,Asynchronous,Web Scraping,Cheerio,我正在尝试使用Javascript和Cheerio创建一个web刮板,当我试图从被刮板的页面中的url中刮板数据时,遇到了一些困难。例如,我在第一个页面上刮取一些细节(包括链接页面的URL),然后当我尝试使用回调函数刮取链接页面时,我无法将返回值分配给对象。两个scraper都可以单独工作,但是我在异步运行它们时遇到了问题,变量detailsPage总是以未定义的形式返回 任何帮助都将不胜感激 const cheerio = require("cheerio"); const axios = r

我正在尝试使用Javascript和Cheerio创建一个web刮板,当我试图从被刮板的页面中的url中刮板数据时,遇到了一些困难。例如,我在第一个页面上刮取一些细节(包括链接页面的URL),然后当我尝试使用回调函数刮取链接页面时,我无法将返回值分配给对象。两个scraper都可以单独工作,但是我在异步运行它们时遇到了问题,变量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();

您的
singleProduct.detailsPage
始终为空的原因是
scrapfulldetailspage()
函数本质上是异步的,因为axios库是基于承诺的


请作为一种可能的解决方案进行研究,我希望它能有所帮助。

没错,但如果他们只是将console.log移到scrapfulldetailspage的末尾,那就好了。