我正在使用 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)
我想知道是否有任何方法可以将回调中调用的最后两个函数放在我所有蜘蛛都通用的另一个模块中(这样,如果我修改它,那么它们都会改变) 。我知道它们是类函数,但我是否可以将它们放入另一个文件中?
我尝试在我的library.py 文件中声明函数,但我的问题是如何将所需的2个参数(self、response)传递给它们。
最佳答案
创建一个基类来包含这些常用函数。然后你真正的蜘蛛就可以继承它。例如,如果您的所有蜘蛛都扩展了 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
),然后您可以将其用作 mixin。
关于python - Scrapy回调函数在另一个文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54619754/