Javascript Apify-如何有效地将URL变体排队

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

我在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

    我将原始输入列表读入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();
    });
    
    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非常有用。