【发布时间】:2021-05-10 13:46:38
【问题描述】:
我正在使用 Cheerio 在 Apify 中创建一个新角色,以读取 URL 的输入文件并主要返回两个项目:(1) HTTP 状态代码和 (2) HTML 标题。作为我们流程的一部分,我希望能够尝试每个输入 URL 的最多 4 种变体,例如:
- HTTP://WWW.SOMEURL.COM
- HTTPS://WWW.SOMEURL.COM
- HTTP://SOMEURL.COM
- HTTPS://SOMEURL.COM
如果 4 个变体之一成功,则该过程应忽略其他变体并移至下一个输入 URL。
我将原始输入列表读入 RequestList,然后想在 RequestQueue 中创建变体。这是最有效的方法吗?请看下面的代码,谢谢!
const Apify = require('apify');
const {
utils: { enqueueLinks },
} = Apify;
const urlParse = require('url');
Apify.main(async () => {
const input = await Apify.getInput();
const inputFile = input.inputFile;
console.log('INPUT FILE: ' + inputFile);
const requestList = await Apify.openRequestList('urls', [
{ requestsFromUrl: inputFile, userData: { isFromUrl: true } },
]);
const requestQueue = await Apify.openRequestQueue();
const proxyConfiguration = await Apify.createProxyConfiguration();
const handlePageFunction = async ({ $, request, response }) => {
let parsedHost = urlParse.parse(request.url).host;
let simplifiedHost = parsedHost.replace('www.', '');
const urlPrefixes = ['HTTP://WWW.', 'HTTPS://WWW.', 'HTTP://', 'HTTPS://'];
let i;
for (i = 0; i < urlPrefixes.length; i++) {
let newUrl = urlPrefixes[i] + simplifiedHost;
console.log('NEW URL: ' + newUrl);
await requestQueue.addRequest({ url: newUrl });
}
console.log(`Processing ${request.url}`);
const results = {
inputUrl: request.url,
httpCode: response.statusCode,
title: $('title').first().text().trim(),
responseUrl: response.url
};
await Apify.pushData(results);
};
const crawler = new Apify.CheerioCrawler({
proxyConfiguration,
maxRequestRetries: 0,
handlePageTimeoutSecs: 60,
requestTimeoutSecs: 60,
requestList,
requestQueue,
handlePageFunction,
handleFailedRequestFunction: async ({ request }) => {
await Apify.pushData({ inputUrl: request.url, httpCode: '000', title: '', responseUrl: ''});
}
});
await crawler.run();
});
【问题讨论】:
标签: javascript node.js web-scraping apify