Scrapy: изменение приоритетов загрузки медиа-конвейера: как отложить загрузку медиа-файлов в самом конце сканирования?

http://doc.scrapy.org/en/latest/topics/media-pipeline.html

Когда элемент достигает FilesPipeline, URL-адреса в поле file_urls планируются для загрузки с использованием стандартного планировщика и загрузчика Scrapy (что означает, что промежуточное ПО планировщика и загрузчика повторно используется), но с более высоким приоритетом, обрабатывая их раньше других страниц соскабливаются. Элемент остается «заблокированным» на этом конкретном этапе конвейера до тех пор, пока файлы не загрузятся (или не завершатся ошибкой по какой-либо причине).

Я хочу сделать прямо противоположное: сначала очистить все URL-адреса HTML, а затем загрузить все медиафайлы сразу. Как я могу это сделать?


person Antoine Brunel    schedule 22.04.2016    source источник


Ответы (1)


Не ответ, но если вам интересно узнать, как реализовано это поведение, проверьте MediaPipeline исходный код конвейера, особенно _ 2_ метод:

    def process_item(self, item, spider):
        info = self.spiderinfo
        requests = arg_to_iter(self.get_media_requests(item, info))
        dlist = [self._process_request(r, info) for r in requests]
        dfd = DeferredList(dlist, consumeErrors=1)
        return dfd.addCallback(self.item_completed, item, info)

Вы видите, что группа запросов поставлена ​​в очередь для обработки (запрос отправлен + загружен ответ) ПЕРЕД вызовом item_completed, возвращающим исходный элемент + загруженную информацию о мультимедиа.

В номинальном случае запросы, сгенерированные подклассами MediaPipeline, будут немедленно отправлены для загрузки напрямую crawler.engine.download:

        (...)
        else:
            request.meta['handle_httpstatus_all'] = True
            dfd = self.crawler.engine.download(request, info.spider)
            dfd.addCallbacks(
                callback=self.media_downloaded, callbackArgs=(request, info),
                errback=self.media_failed, errbackArgs=(request, info))
        return dfd
person paul trmbrth    schedule 22.04.2016
comment
Спасибо, я пытаюсь определить лучший способ: 1. Во время обхода HTML сохраните все пути к файлам в очереди, затем запустите другой scrapy spider для обработки всех файлов сразу (простое решение) или 2. Получение с носителя конвейер (элегантное решение), но в этом случае мне также нужно сохранить все пути к файлам в постоянной очереди ... Если вы можете направить меня в любом направлении? Я не так заинтересован в загрузке файлов, а скорее в том, чтобы определить, доступны ли они (200 или 404), и получить их размер в килобайтах. - person Antoine Brunel; 23.04.2016