我正在抓取大约2000万个url。但在实际发出请求之前,由于内存使用过多(4GB RAM),进程会被终止。我如何才能在混乱中处理这件事,这样这个过程就不会被扼杀?
class MySpider(Spider):
name = "mydomain"
allowed_domains = ["mydomain.com"]
urls = []
for d in range(0,20000000):
link = "http://example.com/"+str(d)
urls.append(link)
start_urls = urls
def parse(self, response):
yield response
我想我找到了解决方法。将此方法添加到您的spider中。
def start_requests(self):
for d in range(1,26999999):
yield scrapy.Request("http://example.com/"+str(d), self.parse)
您不必在starting中指定starturl。
它将开始生成URL并开始发送异步请求,当scrapy得到响应时将调用回调。在开始时,内存使用量会更多,但稍后会占用恒定内存。
除此之外,您还可以使用
scrapy crawl somespider -s JOBDIR=crawls/somespider-1
通过使用这个,你可以暂停蜘蛛,并随时使用相同的命令恢复它
并且为了节省CPU(以及日志存储需求)使用
LOG_LEVEL = 'INFO'
在环境中。
我认为创建一个大的URL列表用作start_urls
可能会导致问题。
不如这样做吧?
class MySpider(Spider):
name = "mydomain"
allowed_domains = ["mydomain.com"]
start_urls = ["http://example.com/0"]
def parse(self, response):
for d in xrange(1,20000000):
link = "http://example.com/"+str(d)
yield Request(url=link, callback=self.parse_link)
def parse_link(self, response):
yield response