Javascript Apify-如何有效地将URL变体排队
我在Apify with Cheerio中创建了一个新的actor来读取URL的输入文件,并主要返回两项:(1)HTTP状态代码和(2)HTML标题。作为我们流程的一部分,我希望能够尝试每个输入URL最多4种变体,例如:Javascript Apify-如何有效地将URL变体排队,javascript,node.js,web-scraping,apify,Javascript,Node.js,Web Scraping,Apify,我在Apify with Cheerio中创建了一个新的actor来读取URL的输入文件,并主要返回两项:(1)HTTP状态代码和(2)HTML标题。作为我们流程的一部分,我希望能够尝试每个输入URL最多4种变体,例如: HTTP://WWW.SOMEURL.COM HTTPS://WWW.SOMEURL.COM HTTP://SOMEURL.COM HTTPS://SOMEURL.COM 如果4个变体中的一个成功,那么流程应该忽略其他变体,并移动到下一个输入URL 我将原始输入列表读入Requ
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();
});
const Apify=require('Apify');
常数{
utils:{enqueueLinks},
}=Apify;
const urlParse=require('url');
main(异步()=>{
常量输入=等待Apify.getInput();
const inputFile=input.inputFile;
log('INPUT FILE:'+inputFile);
const requestList=await Apify.openRequestList('url'[
{requestsFromUrl:inputFile,userData:{isFromUrl:true},
]);
const requestQueue=wait Apify.openRequestQueue();
const proxyConfiguration=wait Apify.createProxyConfiguration();
const handlePageFunction=async({$,请求,响应})=>{
让parsedHost=urlParse.parse(request.url.host);
让simplifiedHost=parsedHost.replace('www.,'');
常量URL前缀=['HTTP://WWW.'、'HTTPS://WWW.'、'HTTP://'、'HTTPS://'];
让我;
对于(i=0;i{
等待Apify.pushData({inputUrl:request.url,httpCode:'000',title:'s,responseUrl:'});
}
});
等待爬虫。运行();
});
您应该事先创建URL列表。handlepage功能仅用于实际的刮片零件,您应该只在那里有Apify.pushData
:
/。。。
const initRequestList=await Apify.openRequestList('url'[
{requestsFromUrl:inputFile},
]);
const parsedRequests=[];
let-req;
while(req=await initRequestList.fetchNextRequest()){
const parsedHost=urlParse.parse(req.url).host;
const simplifiedHost=parsedHost.replace('www.,'');
常量URL前缀=['HTTP://WWW.'、'HTTPS://WWW.'、'HTTP://'、'HTTPS://'];
for(设i=0;i{
等待Apify.pushData({inputUrl:request.url,httpCode:'000',title:'s,responseUrl:'});
}
});
//...
requestsFromUrl
是一个贪婪函数,它试图解析从到给定资源的所有URL。因此,您必须作为附加步骤执行处理。非常感谢您提供这段代码。我最终选择了另一条路线,但该模式对于创建单独的函数来解析URL非常有用。