getURL() 函数从原始 URL 创建一个抓取 URL 的数组。getSubURL() 然后循环遍历该数组并抓取所有这些页面的 URL。目前,此代码可以很好地输出到控制台,但我不知道如何等待我的数据解析,以便我可以将所有收集的数据推送到单个数组。目前,当我尝试返回站点然后推送到数组时,它只推送最后一个值。我相信这是一种promise.all(map) 的情况,但我不知道如何正确编写而不出现错误。理想情况下,我完成的抓取可以在另一个函数中调用。如果可以的话请看一下const cheerio = require('cheerio');const axios = require('axios');let URL = 'https://toscrape.com';const getURLS = async () => { try { const res = await axios.get(URL); const data = res.data; const $ = cheerio.load(data); const urlQueue = []; $("a[href^='http']").each((i, elem) => { const link = $(elem).attr('href'); if (urlQueue.indexOf(link) === -1) { urlQueue.push(link); } }); return urlQueue; } catch (err) { console.log(`Error fetching and parsing data: `, err); }};const getSubURLs = async () => { let urls = await getURLS(); try { //loop through each url in array for (const url of urls) { //fetch all html from the current url const res = await axios.get(url); const data = res.data; const $ = cheerio.load(data); //create object and push that url into that object let sites = {}; sites.url = url; let links = []; //scrape all links and save in links array $("a[href^='/']").each((i, elem) => { const link = $(elem).attr('href'); if (links.indexOf(link) === -1) { links.push(link); } //save scraped data in object sites.links = links; }); // returns list of {url:'url', links:[link1,link2,link3]} console.log(sites); } } catch (err) { console.log(`Error fetching and parsing data: `, err); }};
1 回答
Cats萌萌
TA贡献1805条经验 获得超9个赞
不要认为这是一个与 Promise 相关的问题。
您需要将您的数据收集sites到一个在循环外部初始化的数组中。然后当getSubURLs()解析时,它将解析为您的数组:
const getSubURLs = async() => {
let urls = await getURLS();
let siteList = [];
try {
for (const url of urls) {
// :
// :
// :
siteList.push(sites);
}
} catch (err) {
console.log(`Error fetching and parsing data: `, err);
}
return siteList; // array of objects
};
getSubURLs().then(console.log);
添加回答
举报
0/150
提交
取消