我已经开发了基于Actor + PuppeteerCrawler + Proxy的搜寻器,并希望重新搜寻失败的页面。为了增加重新刮擦的机会,我想切换到另一个proxyUrl。这个想法是,使用修改后的launchPupperteer函数和一个不同的proxyUrl创建一个新的搜寻器,然后重新加入失败的页面。请检查下面的示例代码。
但是不幸的是,它不起作用,尽管我通过使用drop和opens重设了请求队列。是否可以通过将PuppeteerCrawler与其他proxyUrl配合使用来重新抓取失败的页面?
最好的问候, 沃尔夫冈
for(let retryCount = 0; retryCount <= MAX_RETRY_COUNT; retryCount++){
if(retryCount){
// Try to reset the request queue, so that failed request shell be rescraped
await requestQueue.drop();
requestQueue = await Apify.openRequestQueue(); // this is necessary to avoid exceptions
// Re-enqueue failed urls in array failedUrls >>> ignored although using drop() and reopening request queue!!!
for(let failedUrl of failedUrls){
await requestQueue.addRequest({url: failedUrl});
}
}
crawlerOptions.launchPuppeteerFunction = () => {
return Apify.launchPuppeteer({
// generates a new proxy url and adds it to a new launchPuppeteer function
proxyUrl: createProxyUrl()
});
};
let crawler = new Apify.PuppeteerCrawler(crawlerOptions);
await crawler.run();
}
答案 0 :(得分:1)
我认为您的方法应该行得通,但另一方面,它没有必要。我不确定createProxyUrl
会做什么。
您可以提供具有auto
用户名的通用代理URL,该URL将使用Apify上的所有数据中心代理。或者,您可以直接向PuppeteerCrawler
提供proxyUrls
。
别忘了您必须切换浏览器才能从代理获取新IP。本文的更多内容-https://help.apify.com/en/articles/2190650-how-to-handle-blocked-requests-in-puppeteercrawler