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

Python 如何在scrapy中处理大量请求?,python,memory,web-scraping,scrapy,Python,Memory,Web Scraping,Scrapy,我正在搜索大约2000万个URL。但在实际发出请求之前,由于内存使用过度(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.appen

我正在搜索大约2000万个URL。但在实际发出请求之前,由于内存使用过度(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

我相信创建一个大的URL列表作为
start\u URL
可能会导致这个问题

这样做怎么样

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

我想我找到了解决办法。 将此方法添加到spider

def start_requests(self):
    for d in range(1,26999999):
        yield scrapy.Request("http://example.com/"+str(d), self.parse)
您不必在起始URL中指定起始URL

它将开始生成URL并开始发送异步请求,当scrapy获得响应时将调用回调。在开始时,内存使用将更多,但稍后将占用恒定内存

除此之外,您还可以使用

scrapy crawl somespider -s JOBDIR=crawls/somespider-1
通过使用此命令,您可以暂停爬行器,并随时使用相同的命令恢复爬行器

并且为了节省CPU(和日志存储需求) 使用


在scrapy项目的settings.py中。

它也将被终止,因为scrapy将在内存中对请求对象进行排队。当限制超过时,它会要求更多的内存。尽管如此,还是要尝试一下。我以前试过刮这个秤,把它刮下来了。在这些情况下,Scrapy的可伸缩性很好。可能是微优化,但如果您想节省一些内存,则应使用
xrange
而不是
range
。@Rahul,根据,如果您设置
“JOBDIR”
,则将使用设置磁盘队列。使用它,您可以放弃队列大小作为问题的原因。是的。早点读。我只是在使用start_url方法时尝试了一下,但结果是一样的。让我试一下这个。scrapy输出的错误是什么?只是在一段时间后被杀死了。我监控了内存使用情况,发现当可用内存减少到100MB或更少时,它就会被杀死。如果你共享日志,这会很有帮助。
LOG_LEVEL = 'INFO'