Корректно ли в таком случае использовать класс Meta? Я использую фреймворк Scrapy и у меня есть два сайта которые парсятся по примерно одинаковому алгоритму и хочется несколько абстрагировать и объединить их функционал. Проблема в том, что каждому спайдеру соответствует своя моделька базы данных, своя схема данных для внешнего сервиса, свой Scrapy ItemLoader и так далее. Моя идея заключается в следующем, реализовать некий абстрактный класс не содержащий вообще ничегоclass AbstractSpider(scrapy.Spider):
name = ''
allowed_domains = ()
start_urls = ()
class Meta:
model = None
schema = None
history_model = None
_loader = None
def parse(self, response: scrapy.http.HtmlResponse) -> Any:
raise NotImplementedError
def _gen_item(self, response: scrapy.http.HtmlResponse) -> scrapy.Item:
raise NotImplementedError
def _add_fields(self, loader: Meta._loader) -> None:
raise NotImplementedError
Далее реализовать общий класс для обоих спайдеров:class AutoSpider(AbstractSpider, scrapy.Spider):
class Meta:
model = models.AutoModel
schema = schemas.AUTO_SCHEMA
history_model = models.HistoryAutoModel
_loader = AutoItemLoader
full_loader = FullAutoItemLoader
short_loader = ShortAutoItemLoader
def parse(self, response: scrapy.http.HtmlResponse) -> Any:
raise NotImplementedError
def _gen_item(self, response: scrapy.http.HtmlResponse) -> scrapy.Item:
...
def _add_fields(self, loader: Meta._loader) -> None:
if isinstance(loader, self.Meta.full_loader):
self._add_from_full(loader)
elif isinstance(loader, self.Meta.short_loader):
self._add_from_short(loader)
def _add_from_full(self, loader: Meta.full_loader) -> None:
raise NotImplementedError
def _add_from_short(self, loader: Meta.short_loader) -> None:
raise NotImplementedError
...
И дальше наследовать уже каждый спайдер реализуя в них класс Meta с изменяющими поведение общего для них класса.
На сколько корректно так делать? На сколько корректно будет обращаться к Meta не из спайдера (например, из пайплайнов)? Или как иначе увеличить связность и уменьшить зацепление?

21 Авг 2019 в 06:58
160 +1
0
Ответы
1

В целом, использование класса Meta для хранения метаинформации о спайдерах в Scrapy вполне допустимо. Однако, стоит учитывать, что класс Meta не является стандартным элементом фреймворка и может понести изменения в будущих версиях Scrapy.

В вашем случае, использование класса Meta для хранения информации о моделях базы данных, схемах данных и ItemLoader'ах может быть удобным для обобщения функционала двух похожих спайдеров.

Чтобы уменьшить зацепление и увеличить связность, вам также стоит учитывать принципы SOLID и пытаться разделять классы на более мелкие и легко модифицируемые компоненты. Например, вы можете вынести логику работы с базой данных, сериализации данных и другие функции в отдельные классы или модули.

С точки зрения обращения к классу Meta из пайплайнов, в общем случае это не самый хороший подход, так как пайплайны в Scrapy являются отдельными компонентами и лучше избегать плотной связности между ними и спайдерами. Вместо этого, можно передавать необходимую метаинформацию напрямую из спайдеров в пайплайны или использовать атрибуты данных спайдера для передачи информации между компонентами.

Таким образом, ваш подход с использованием класса Meta может быть работоспособным, но важно учитывать принципы проектирования и стремиться к более модульной структуре вашего приложения.

20 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 706 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир