我正在使用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个参数(自身,响应)传递给它们。
答案 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
),然后可以将其用作混合。