我正在抓取大约 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
最佳答案
我想我找到了解决方法。 将此方法添加到您的蜘蛛。
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中。
关于python - 如何在scrapy中处理大量请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34036166/