javascript - 努力抓取多个页面 - 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();
解决方案
singleProduct.detailsPage
你总是为空的原因是scrapeFullDetailsPage()
函数本质上是异步的,因为 axios 库是基于 Promise 的。
请查看如何使 axios 同步作为一种潜在的解决方案,我希望它有所帮助。
推荐阅读
- python - 如何在此配置中使用外部 python 包
- python - Python:将 csv 文件的内容添加到列表中
- php - 如何为具有多个变量的回声函数设置样式
- javascript - 使用服务帐户的 Google drive api rest 上传文件不起作用
- python - 无法将我的应用程序与 django 中的文本编辑器集成
- c - 检查值是否在未定义的枚举中?
- excel - 如果日期重复但数据是唯一的,如何匹配日期然后将相应数据从一个电子表格复制到另一个电子表格?
- python - 返回满足熊猫数据框中条件的数据框位置的第一个值的位置
- sql - 需要帮助加入 2 个表并使用 BigQuery SQL 以独特的方式汇总它们
- reporting-services - 第一个新手问题:SSRS Tablix 可见性参数