【发布时间】:2021-12-03 05:26:58
【问题描述】:
我在node 中创建了一个脚本,使用promise 结合request 和cheerio 来解析Province 列下的links webpage 然后重用这些链接来抓取所有所有这些pages 中的Office 列下的url,最后使用这些links 从所有这些target pages 中收集title,如本页中的Cairos main Post Office。
我当前的脚本大部分时间都卡住了。但是,有时它会抛出此错误UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'parent' of undefined。我检查了每个功能,发现它们都以正确的方式单独工作。
虽然脚本看起来有点大,但它是建立在一个非常简单的逻辑之上的,即利用其登录页面中的每个links,直到到达目标页面的title。
这是我目前的尝试:
const request = require('request');
const cheerio = require('cheerio');
const link = 'https://www.egyptcodebase.com/en/p/all';
const base_link = 'https://www.egyptcodebase.com/en/';
const items = [];
const nitems = [];
let getLinks = () => {
return new Promise((resolve, reject) => {
request(link, function(error, response, html) {
let $ = cheerio.load(html);
if (error) return reject(error);
try {
$('.table tbody tr').each(function() {
items.push(base_link + $(this).find("a").attr("href"));
});
resolve(items);
} catch (e) {
reject(e);
}
});
});
};
let getData = (links) => {
const promises = links
.map(nurl => new Promise((resolve, reject) => {
request(nurl, function(error, response, html) {
let $ = cheerio.load(html);
if (error) return reject(error);
try {
$('.table tbody tr').each(function() {
nitems.push(base_link + $(this).find("a").attr("href"));
});
resolve(nitems);
} catch (e) {
reject(e);
}
})
}))
return Promise.all(promises)
}
let FetchData = (links) => {
const promises = links
.map(nurl => new Promise((resolve, reject) => {
request(nurl, function(error, response, html) {
let $ = cheerio.load(html);
if (error) return reject(error);
try {
resolve($(".home-title > h2").eq(0).text());
} catch (e) {
reject(e);
}
})
}))
return Promise.all(promises)
}
getLinks().then(resultList => {
getData(resultList).then(resultSet => {
FetchData(resultSet).then(title =>{
console.log(title);
})
})
})
如何利用登陆页面的所有链接从目标页面中抓取标题?
【问题讨论】:
-
请对您要从中报废的服务器保持温柔,它无法同时处理数百个请求,这就是您的脚本卡住的原因。对于
Cannot read property 'parent' of undefined,您应该先检查if(error),然后再检查cheerio.load。 -
兄弟,我知道是什么问题
标签: node.js web-scraping promise request cheerio