另一个文件中的草率回调函数

时间:2019-02-10 18:44:08

标签: python scrapy

我正在使用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)

我想知道是否有什么办法可以将最后两个函数(在回调函数中)放在所有我的Spider共有的另一个模块中(这样,如果我对其进行修改,则所有它们都会改变) 。我知道它们是类函数,但是无论如何我可以将它们放在另一个文件中吗?

我试图在library.py文件中声明这些函数,但是我的问题是如何将所需的2个参数(自身,响应)传递给它们。

1 个答案:

答案 0 :(得分:3)

创建一个基类以包含那些常用功能。然后,您真正的蜘蛛可以从中继承。例如,如果所有蜘蛛都延伸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),然后可以将其用作混合。