我正在尝试使用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();
singleProduct.detailsPage
始终为空的原因是scrapeFullDetailsPage()
函数本质上是异步的,因为axios库基于Promise。
[请查看How to make axios synchronous作为一种可能的解决方案,希望对您有帮助。