Функция обратного вызова Scrapy в другом файле - PullRequest
0 голосов
/ 10 февраля 2019

Я использую Scrapy с Python, чтобы очистить несколько веб-сайтов.

Я получил много пауков со структурой, подобной этой:

import library as lib

class Spider(Spider):
   ...

   def parse(self, response):
       yield FormRequest(..., callback=lib.parse_after_filtering_results1)
       yield FormRequest(..., callback=lib.parse_after_filtering_results2)

   def parse_after_filtering_results1(self,response):
       return results

   def parse_after_filtering_results2(self,response):
       ... (doesn't return anything)

Я хотел бы знать, есть ли способ, которым я могупоместите последние 2 функции, которые вызываются в обратном вызове, в другой модуль, который является общим для всех моих пауков (так что, если я изменю его, все они изменятся).Я знаю, что они являются функциями класса, но есть ли способ поместить их в другой файл?

Я пытался объявить функции в моем файле library.py, но моя проблема в том, как передать 2 необходимых параметра (self, ответ) им.

1 Ответ

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

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

spiders/basespider.py:

from scrapy import Spider

class BaseSpider(Spider):
    # Do not give it a name so that it does not show up in the spiders list.
    # This contains only common functions.

    def parse_after_filtering_results1(self, response):
        # ...

    def parse_after_filtering_results2(self, response):
        # ...

spiders/realspider.py:

from .basespider import BaseSpider

class RealSpider(BaseSpider):
     # ...

    def parse(self, response):
        yield FormRequest(..., callback=self.parse_after_filtering_results1)
        yield FormRequest(..., callback=self.parse_after_filtering_results2)

Если выесть разные типы пауков, вы можете создавать разные базовые классы.Или ваш базовый класс может быть простым объектом (не Spider), и тогда вы можете использовать его как миксин.

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