del*_*lta 2 python bots web-crawler scrapy web-scraping
所以我有一个我认为泄漏内存的蜘蛛,当我检查telnet控制台>>> prefs()时,它只是从链接丰富页面抓取太多链接(有时它会超过100,000)
现在我一次又一次地浏览文档和谷歌,我找不到限制蜘蛛接收请求的方法.我想要的是能够告诉它一旦获得一定数量的请求就会阻止它进入调度程序.我已经尝试过设置一个,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)}
Run Code Online (Sandbox Code Playgroud)
del*_*lta 10
我解决了我的问题,答案很难找到,所以我在这里发布,以防其他人遇到同样的问题.
通过scrapy代码筛选并返回文档后,我可以看到scrapy将所有请求保存在内存中,我已经推断过,但是在代码中还有一些检查,看看是否有一个作业目录在哪里写入待定对磁盘的请求(在core.scheduler中)
因此,如果您使用作业目录运行scrapy spider,它会将待处理请求写入磁盘,然后从磁盘检索它们,而不是将它们全部存储在内存中.
$ scrapy crawl spider -s JOBDIR=somedirname
Run Code Online (Sandbox Code Playgroud)
当我这样做时,如果我进入telnet控制台,我可以看到我在内存中的请求数总是大约25,而且我有100,000多写入磁盘,这正是我希望它运行的方式.
看起来这将是一个常见的问题,因为有人会抓取一个大型网站,每个网页都有多个可提取链接.我很惊讶它没有更多记录或更容易找到.
http://doc.scrapy.org/en/latest/topics/jobs.html那里的scrapy网站声明主要目的是稍后暂停和恢复,但它也是这样工作的.