我爬了大约2000万网址。但是在实际请求之前,由于过多的内存使用(4 GB RAM),进程被终止。我怎样才能在scrapy中处理这个问题,以免这个过程被杀死?
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
答案 0 :(得分:1)
我想我找到了解决方法。 将此方法添加到蜘蛛中。
def start_requests(self):
for d in range(1,26999999):
yield scrapy.Request("http://example.com/"+str(d), self.parse)
你不必在开始时指定start_urls。
它将开始生成URL并开始发送异步请求,并且当scrapy获得响应时将调用回调。在开始时,内存使用量会更多,但稍后会占用常量内存。
除此之外,您还可以使用
scrapy crawl somespider -s JOBDIR=crawls/somespider-1
通过使用此功能,您可以暂停蜘蛛并使用相同的命令
随时恢复它并且为了节省CPU(和日志存储要求) 使用
LOG_LEVEL = 'INFO'
在scrapy项目的settings.py中。
答案 1 :(得分:0)
我认为创建一个用作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