如何在scrapy中处理大量请求?

时间:2015-12-02 06:22:04

标签: python memory web-scraping scrapy

我爬了大约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

2 个答案:

答案 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
相关问题