如何解决Cheerio Crawler全局计数maxRequestsPerCrawl的爬取限制?
解决Cheerio Crawler无法连续执行数千次请求的问题
问题根源
你遇到的核心问题是错误使用了maxRequestsPerCrawl参数:这个配置项的作用就是限制单次crawler.run()调用的总请求数量,一旦达到设定值,爬虫会自动终止当前爬取任务。即使你新建CheerioCrawler实例,每个实例的run()调用都会受自身maxRequestsPerCrawl的限制,导致无法连续处理大量请求。
解决方案
根据你的需求(连续执行数千次请求、无需并行),可以按以下方式调整配置:
移除
maxRequestsPerCrawl配置
如果你不需要限制单次爬取的请求总量,直接删除该配置项。爬虫会自动处理所有加入队列的请求,直到队列为空。修正后的代码示例:
const crawler = new CheerioCrawler({ minConcurrency: 1, maxConcurrency: 1, maxRequestRetries: 1, requestHandlerTimeoutSecs: 30, async requestHandler({ request, $, proxyInfo }) { // 你的页面处理逻辑 } }); // 传入所有需要爬取的URL(数千个) const largeUrlList = [/* 你的URL数组 */]; await crawler.run(largeUrlList); await crawler.teardown();分批处理请求(可选)
如果你需要分批次处理请求(比如避免一次性加载过多URL到内存),不要依赖maxRequestsPerCrawl,而是手动拆分URL列表,每次新建实例处理一批请求:const batchSize = 100; // 每批次处理100个请求 const allUrls = [/* 你的数千个URL */]; for (let i = 0; i < allUrls.length; i += batchSize) { const batchUrls = allUrls.slice(i, i + batchSize); const crawler = new CheerioCrawler({ minConcurrency: 1, maxConcurrency: 1, maxRequestRetries: 1, requestHandlerTimeoutSecs: 30, async requestHandler({ request, $, proxyInfo }) { // 你的页面处理逻辑 } }); await crawler.run(batchUrls); await crawler.teardown(); }
额外说明
从你提供的日志来看,requestsFinished:0可能意味着你的requestHandler没有正确完成请求处理,或者请求全部失败。建议在requestHandler中添加日志输出,排查请求是否正常执行。
内容的提问来源于stack exchange,提问作者delete
相关产品推荐
相关产品推荐

