Python 如何限制scrapy请求对象?

Python 如何限制scrapy请求对象?,python,web-scraping,scrapy,web-crawler,bots,Python,Web Scraping,Scrapy,Web Crawler,Bots,因此,我有一个蜘蛛,我认为是泄漏内存,结果是,当我检查telnet控制台>>>prefs()时,它只是从链接丰富的页面抓取了太多的链接(有时会超过100000个) 现在我一次又一次地浏览文档和谷歌,我找不到一种方法来限制蜘蛛接收的请求。我想要的是能够告诉它,一旦有一定数量的请求进入调度程序,就不要接收请求。我曾尝试设置一个深度限制,但这只能让它获取大量数据,然后对已获取的数据运行回调 这似乎是一件相当简单的事情,我相信人们以前也遇到过这个问题,所以我知道一定有办法做到这一点。有什么想法吗 编辑:

因此,我有一个蜘蛛,我认为是泄漏内存,结果是,当我检查telnet控制台>>>prefs()时,它只是从链接丰富的页面抓取了太多的链接(有时会超过100000个)

现在我一次又一次地浏览文档和谷歌,我找不到一种方法来限制蜘蛛接收的请求。我想要的是能够告诉它,一旦有一定数量的请求进入调度程序,就不要接收请求。我曾尝试设置一个
深度限制
,但这只能让它获取大量数据,然后对已获取的数据运行回调

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

编辑:这里是MEMUSAGE\u 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 spider,它会将挂起的请求写入磁盘,然后从磁盘检索它们,而不是将它们全部存储在内存中

$ scrapy crawl spider -s JOBDIR=somedirname
当我这样做的时候,如果我进入telnet控制台,我可以看到我在内存中的请求数总是在25左右,我有100000多个写入磁盘,这正是我希望它运行的方式

这似乎是一个常见的问题,因为一个人可能会在一个大型站点上爬行,该站点的每个页面都有多个可提取的链接。我感到惊讶的是,它没有更多的文档记录或更容易找到

那里的scrapy站点声明,主要目的是暂停并稍后恢复,但它也是这样工作的