如何在混乱中处理大量请求



我正在抓取大约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

最新更新