Расширение Scrapy ItemLoader с помощью пользовательских методов - PullRequest
0 голосов
/ 02 февраля 2019

Документация Scrapy перечисляет все встроенные методы экземпляров ItemLoader и объясняет , как объявлять ваши собственные загрузчики элементов .Однако любые объявленные вами загрузчики элементов будут применяться ко всем обработанным элементам.Вы можете немного изменить их поведение с помощью Контекстов загрузчика элементов , но это часто недостаточно детально.

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

import mymodule

class MySpider(BaseSpiderName):
  def parse_item(self, response):
    product = ItemLoader(item=Product(), response=response)
    new_value = mymodule.myfunction(argument, ..., ...)
    product.add_value('my_field', new_value)

Вы могли написать:

# (no extra import)
class MySpider(BaseSpiderName):
  def parse_item(self, response):
    product = CustomItemLoader(item=Product(), response=response)
    product.custom_function(argument, ..., ...)

Даже если это кажется очевидным способомРасширить ItemLoaders, как вы бы это делали для любого другого класса, это не документировано, и я не вижу примеров того, как сделать это в Scrapy, где бы я ни проверял (Google, StackOverflow).Возможно ли это / поддерживается и как бы вы их объявили?

1 Ответ

0 голосов
/ 04 февраля 2019

Это возможно / поддерживается, и как бы вы их объявили?

Это возможно.Какой способ сделать это зависит от типа используемой вами логики.

Вы можете объявить свои методы не зависящим от Scrapy, то есть, как вы делали бы это с любым другим классом Python: подкласс вашего CustomItemLoader классаи определите метод в этом подклассе:

from scrapy.loaders import ItemLoader

class CustomItemLoader(ItemLoader):

    def custom_function(self, *args, **kwargs):
        self.add_value('my_field', mymodule.myfunction(*args, **kwargs))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...