我有一个带有cheerio-crawler 的演员,它可以抓取大约5500 个网址(urlList)的列表
url 是结果页面,其中有一个包含 json 文件的脚本。json 中添加了一些文本,因此它不是“干净的”,因此我将其提取到 const 中,并检查“if”语句中是否存在匹配项。如果有比赛,我会爬。
现在。我的问题是爬虫统计信息+日志,似乎表明所有网址都已被爬取。问题是他们不是。在日志中,我确实看到了一些超时(下面的示例),但是这些 url 只是放回了请求列表中。像“example.com”这样的 url 在日志中似乎很好,并且在查找时页面上有 data + json,但它没有在结果中输出。
我不知道出了什么问题,但有一种预感,它的“if”语句正在做一些时髦的事情。也许找到了 json 但尚未加载,或者其他什么。
你们中的一些聪明的头脑可以伸出援助之手吗?
统计示例 爬虫最终请求统计:{"avgDurationMillis":2554,"perMinute":580,"finished":5445,"failed":0,"retryHistogram":[5151,276,18]}
超时示例: 错误:CheerioCrawler:请求在 30 秒后超时。等等等等
const Apify = require('apify');
Apify.main(async () => {
const requestList = new Apify.RequestList({ sources: urlList })
await requestList.initialize();
const crawler = new Apify.CheerioCrawler({
requestList,
useApifyProxy: true,
handlePageFunction: async ({ $, request }) => {
const jsonString = $('script:contains("__thisvalue__")').text();
if (jsonString.match(/\[{[\d\D]*}\]/) !== null) {
const json = JSON.parse(jsonString.match(/\[{[\d\D]*}\]/));
let i = 0;
for (i = 0; i < json.length; i++) {
await Apify.pushData({
//do some crawling
url: request.url
});
}
}
},
handleFailedRequestFunction: async ({ request }) => {
console.log(`Copy of request: ${request}`);
},
});
await crawler.run();
return 'Done'
});