groupbwt / scrapy-boilerplate

Scrapy project boilerplate done right
MIT License
42 stars 25 forks source link

feat(rmq pipeline): add push possibility to different queue #79

Closed LyricalToxic closed 2 years ago

LyricalToxic commented 3 years ago

Changelog:

  1. Добавил возможность выбора очереди, в которую будет пушиться RMQItem через ItemProducerPipeline. Предполагается, что очередь будет выбираться на основе подклассов RMQItem-a. Необходимо унаследоваться от ItemProducerPipeline и переопределить метод choose_queue_name. По умолчанию будет использоваться очередь, которая будет возвращена методом get_result_queue_name.
  2. Удалил атрибут result_queue_name, и его валидацию. Добавил вместо него метод get_result_queue_name и валидацию его аутпута. В основном, имя очереди берется из настроек проекта settings.py. Сейчас есть 2 способа в пауке установить имя очереди: 2.1. Импортировать функцию get_project_settings из scrapy.utils.project, вызвать её, и уже после получить доступ к имени очереди. Считаю такой подход не лучшим, из-за неочевидности и из-за возможных потенциальных ошибок, так как settings могут быть перегружены в пауке. 2.2. В класс методе from_crawler, создать экземпляр класса паука, получить доступ к его settings и присвоить этому экземпляру метод result_queue_name из settings. Считаю этот способ слишком грамоздким.

    Example usage

    Паук должен переопределить метод get_result_queue_name, который должен возвращать имя очереди типа str. В нем сразу доступны настройки паука через экземпляр класса.

def get_result_queue_name(self)->str:
      return self.settings["RESULT_QUEUE_NAME"]

Пример использования pipeline-a для нескольких очередей.

class TestPipeline(ItemProducerPipeline):

def choose_queue_name(self, item):
    if isinstance(item, TestItem1):
        return "results_test1"
    elif isinstance(item, TestItem2):
        return self.__spider.settings["results_test2"]

Futher features

В идеале разделить логику для пауков:

  1. TaskToSingleResultSpider - необходим метод get_result_queue_name, который возвращает имя единственной очереди.
  2. TaskToMultipleResultsSpider - метод get_result_queue_name игнорируется(не нуждается в переопределении), вместо него требуется переопределить в пайплайне метод choose_queue_name, и указать в нем несколько очередей как в примере example usage. Сейчас это невозможно, так как при старте PikaSelectConnection декларирует всегда очередь, и get_result_queue_name переопределять все равно необходимо.
vulreid commented 2 years ago

если запланируешь вернуться к "Futher features", то сначала надо будет переговорить. Single\Multiple изначально не несколько разных типов Item'ов определяют, за ними другая логика предполагалась.