CrawlSpider / Scrapy - настройки CLOSESPIDER не работают - PullRequest
0 голосов
/ 13 марта 2020

Я создал CrawlSpider, который должен следовать по всем "внутренним" ссылкам до определенного количества элементов / страниц / времени.

Я использую multiprocessing.Pool для обработки нескольких страниц одновременно (например, 6 рабочих).

Я вызываю CrawlSpider с командой os.system из отдельного python сценария:

import os
...

cmd = "scrapy crawl FullPageCrawler -t jsonlines -o "{0}" -a URL={1} -s DOWNLOAD_MAXSIZE=0 -s CLOSESPIDER_TIMEOUT=180 -s CLOSESPIDER_PAGECOUNT=150 -s CLOSESPIDER_ITEMCOUNT=100 -s DEPTH_LIMIT=5 -s DEPTH_PRIORITY=0 --nolog'.format(OUTPUT_FILE, url.strip())"
os.system(cmd)

Это работает довольно хорошо для некоторых из моих страниц, но для определенных c страниц crawler не соответствует ни одному из моих установленных параметров.

Я попытался определить следующее (с тем, что я думаю, что это делает):
CLOSESPIDER_PAGECOUNT: сколько страниц он будет следить?
CLOSESPIDER_ITEMCOUNT: Не уверен насчет этого. В чем разница с PAGECOUNT?
CLOSESPIDER_TIMEOUT: максимальное время работы сканера.

Сейчас я сталкиваюсь с примером, который уже просканировал более 4000 страниц (или элементов ?!) и работает более 1 часа.

Сталкиваюсь ли я с этим, потому что я все одновременно определил?
Нужно ли мне также определять те же настройки в settings.py?
Может быть мне достаточно одного из них? (например, максимальное время безотказной работы = 10 минут)

Я пытался использовать subprocess.Popen вместо os.system, потому что он имеет функцию wait, но это не сработало, как ожидалось.

В конце концов использование os.system - самая стабильная вещь, которую я пробовал, и я хочу придерживаться этого. Единственная проблема - scrapy

Я пытался найти ответ на SO, но не смог найти никакой помощи!

РЕДАКТИРОВАТЬ: приведенный выше пример заканчивался 16.009 удаленными подстраницами и более 333 МБ.

1 Ответ

0 голосов
/ 17 марта 2020

После того, как я продолжил поиск ответа, я нашел следующее решение:

В моем CrawlSpider я определил максимальное количество страниц (self.max_cnt), на котором должен остановиться скребок, и счетчик это проверяется (self.max_counter) и увеличивается для каждой страницы, которую посетил мой скребок.

Если количество страниц превышает максимально допустимое, паук будет закрыт, подняв scrapy.exception.CloseSpider.

class FullPageSpider(CrawlSpider):
    name = "FullPageCrawler"
    rules = (Rule(LinkExtractor(allow=()), callback="parse_all", follow=True),)

    def __init__(self, URL=None, *args, **kwargs):
        super(FullPageSpider, self).__init__(*args, **kwargs)
        self.start_urls = [URL]
        self.allowed_domains = ['{uri.netloc}'.format(uri=urlparse(URL))]
        self.max_cnt = 250
        self.max_counter = 0

    def parse_all(self, response):
        if self.max_counter < self.max_cnt:
                self.max_cnt += 1

                ...

        else:
            from scrapy.exceptions import CloseSpider
            raise CloseSpider('Exceeded the number of maximum pages!')

Теперь это работает нормально, но меня все равно интересует причина, по которой настройки сканера не работают должным образом.

...