2015-12-02 2 views
2

Я ползаю около 20 миллионов URL. Но до того, как запрос действительно сделан, процесс убивается из-за чрезмерного использования памяти (4 ГБ ОЗУ). Как я могу справиться с этим в процессе лечения, чтобы процесс не убивали?Как обрабатывать большое количество запросов в 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

Что такое выходы scrap ошибки? – eLRuLL

+0

Просто «убил» через некоторое время. Я отслеживал использование памяти и видел, когда доступная память сокращается до 100 мб или меньше, она просто убивается. – Rahul

+0

было бы полезно, если бы вы делились журналами. – eLRuLL

ответ

0

Я считаю, что создание большой список 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 
+0

Он также будет убит, так как scrapy будет помещать объект запроса в память. И он будет запрашивать больше памяти, когда предел закончился. – Rahul

+0

Попробуй. Я уже пробовал соскабливать эту шкалу и снимал ее. Scrapy хорошо масштабируется в таких ситуациях. –

+0

Возможно * микро оптимизация *, но вы должны использовать 'xrange' вместо' range', если хотите освободить некоторую память. – memoselyk

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' 

в settings.py проекта Scrapy.

Смежные вопросы