You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Cheerio Crawler全局计数maxRequestsPerCrawl的爬取限制?

解决Cheerio Crawler无法连续执行数千次请求的问题

问题根源

你遇到的核心问题是错误使用了maxRequestsPerCrawl参数:这个配置项的作用就是限制单次crawler.run()调用的总请求数量,一旦达到设定值,爬虫会自动终止当前爬取任务。即使你新建CheerioCrawler实例,每个实例的run()调用都会受自身maxRequestsPerCrawl的限制,导致无法连续处理大量请求。

解决方案

根据你的需求(连续执行数千次请求、无需并行),可以按以下方式调整配置:

  1. 移除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();
    
  2. 分批处理请求(可选)
    如果你需要分批次处理请求(比如避免一次性加载过多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 11:43:20