如何限制scrapy请求对象?

How to limit scrapy request objects?

所以我有一个蜘蛛,我认为它正在泄漏内存,结果它只是在我检查时从 link 丰富的页面(有时它会超过 100,000)抓取太多 links telnet 控制台 >>> prefs()

现在我已经一遍又一遍地查看文档和 google,但我找不到一种方法来限制蜘蛛接受的请求。我想要的是能够告诉它一旦一定数量的请求进入调度程序,就停止接受请求。我试过设置一个 DEPTH_LIMIT 但这只会让它抓取大量然后 运行 对它抓取的那些进行回调。

这似乎是一件相当简单的事情,我相信人们以前 运行 遇到过这个问题,所以我知道一定有办法解决这个问题。有什么想法吗?

编辑:这是 MEMUSAGE_ENABLE = True

的输出
     {'downloader/request_bytes': 105716,
     'downloader/request_count': 315,
     'downloader/request_method_count/GET': 315,
     'downloader/response_bytes': 10066538,
     'downloader/response_count': 315,
     'downloader/response_status_count/200': 313,
     'downloader/response_status_count/301': 1,
     'downloader/response_status_count/302': 1,
     'dupefilter/filtered': 32444,
     'finish_reason': 'memusage_exceeded',
     'finish_time': datetime.datetime(2015, 1, 14, 14, 2, 38, 134402),
     'item_scraped_count': 312,
     'log_count/DEBUG': 946,
     'log_count/ERROR': 2,
     'log_count/INFO': 9,
     'memdebug/gc_garbage_count': 0,
     'memdebug/live_refs/EnglishWikiSpider': 1,
     'memdebug/live_refs/Request': 70194,
     'memusage/limit_notified': 1,
     'memusage/limit_reached': 1,
     'memusage/max': 422600704,
     'memusage/startup': 34791424,
     'offsite/domains': 316,
     'offsite/filtered': 18172,
     'request_depth_max': 3,
     'response_received_count': 313,
     'scheduler/dequeued': 315,
     'scheduler/dequeued/memory': 315,
     'scheduler/enqueued': 70508,
     'scheduler/enqueued/memory': 70508,
     'start_time': datetime.datetime(2015, 1, 14, 14, 1, 31, 988254)}

我解决了我的问题,答案真的很难找到所以我把它贴在这里以防其他人遇到同样的问题。

在筛选 scrapy 代码并回头参考文档后,我可以看到 scrapy 将所有请求都保存在内存中,我已经推断出这一点,但在代码中也有一些检查以查看是否有作业目录在其中将挂起的请求写入磁盘(core.scheduler)

因此,如果您 运行 具有作业目录的 scrapy 蜘蛛,它会将挂起的请求写入磁盘,然后从磁盘中检索它们,而不是将它们全部存储在内存中。

$ scrapy crawl spider -s JOBDIR=somedirname

当我执行此操作时,如果我进入 telnet 控制台,我可以看到我在内存中的请求数始终约为 25,并且我有 100,000+ 写入磁盘,这正是我想要的 运行.

这似乎是一个常见问题,因为要抓取一个大型网站,每个页面都有多个可提取的链接。我很惊讶它没有更多的记录或更容易找到。

http://doc.scrapy.org/en/latest/topics/jobs.html 那里的 scrapy 站点声明主要目的是暂停和稍后恢复,但它也以这种方式工作。