Python 另一个文件中的Scrapy回调函数
我正在使用Scrapy和Python来刮取几个网站 我有很多蜘蛛的结构是这样的:Python 另一个文件中的Scrapy回调函数,python,scrapy,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_af
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文件中声明函数,但问题是如何将所需的两个参数(self、response)传递给它们。创建一个基类以包含这些常用函数。那么你真正的蜘蛛就可以从中继承。例如,如果您的所有Spider扩展
Spider
,则可以执行以下操作:
spider/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):
# ...
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/realspider.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):
# ...
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。创建一个基类来包含这些常用函数。那么你真正的蜘蛛就可以从中继承。例如,如果您的所有Spider扩展Spider
,则可以执行以下操作:
spider/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):
# ...
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/realspider.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):
# ...
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。是的,只需确保正确导入它们(这似乎是您已经尝试过的,否则我不理解库。
)@DeepSpace是的,我正在导入它们,我的问题是如何向它们传递参数?因为回调函数不允许我这样做(它确实需要是可调用的:),所以您可以直接调用对象实例来代替self
?我不太清楚这里的问题是什么,也许你可以构造一个更实际的例子,我可以帮助betterYes,只要确保正确导入它们(这似乎是你已经尝试过的,否则我不理解库。
)@DeepSpace是的,我正在导入它们,我的问题是如何向他们传递参数?因为回调函数不允许我这样做(它确实需要是可调用的:),所以您可以直接调用对象实例来代替self
?我不太确定这里的问题是什么,也许你可以构造一个更实际的例子,我可以帮助你更好地完善!这正是我想要的,谢谢!有一个问题,如果在爬行器类中不包含“name”属性,那么在终端中键入“scrapy list”命令时,爬行器不会出现?只是好奇为什么“scrapy list”命令不包括BaseSpider。@Jorgeggarcia是的,这就是原因。我更新了答案,将其包括在内。如果您使用ScrapingHub服务,它还可以防止它显示为蜘蛛。太棒了!非常感谢!:)完美的这正是我想要的,谢谢!有一个问题,如果在爬行器类中不包含“name”属性,那么在终端中键入“scrapy list”命令时,爬行器不会出现?只是好奇为什么“scrapy list”命令不包括BaseSpider。@Jorgeggarcia是的,这就是原因。我更新了答案,将其包括在内。如果您使用ScrapingHub服务,它还可以防止它显示为蜘蛛。太棒了!非常感谢!:)