一日一技:从 Scrapy 学习模块导入技巧
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一日一技:从 Scrapy 学习模块导入技巧相关的知识,希望对你有一定的参考价值。
一日一技:从 Scrapy 学习模块导入技巧
截图:产品经理
我们平时导入第三方模块的时候,一般使用的是import关键字,例如:
import scrapy
from scrapy.spider import Spider
但是如果各位同学看过 Scrapy 的settings.py文件,就会发现里面会通过字符串的方式来指定 pipeline 和 middleware,例如:
DOWNLOADER_MIDDLEWARES = {
‘Test.middlewares.ExceptionRetryMiddleware‘: 545,
‘Test.middlewares.BOProxyMiddlewareV2‘: 543,
}
SPIDER_MIDDLEWARES = {
‘Test.middlewares.LoggingRequestMiddleware‘: 543,
}
我们知道,这里的Test.middlewares.ExceptionRetryMiddleware实际上对应了根目录下面的Test文件夹里面的middlewares.py文件中的ExceptionRetryMiddleware类。那么 Scrapy 是如何根据这个字符串,导入这个类的呢?
在 Scrapy 源代码中,我们可以找到相关的代码[1]:
def load_object(path):
"""Load an object given its absolute object path, and return it.
object can be a class, function, variable or an instance.
path ie: ‘scrapy.downloadermiddlewares.redirect.RedirectMiddleware‘
"""
try:
dot = path.rindex(‘.‘)
except ValueError:
raise ValueError("Error loading object ‘%s‘: not a full path" % path)
module, name = path[:dot], path[dot+1:]
mod = import_module(module)
try:
obj = getattr(mod, name)
except AttributeError:
raise NameError("Module ‘%s‘ doesn‘t define any object named ‘%s‘" % (module, name))
return obj
根据这段代码,我们知道,它使用了importlib模块的import_module函数:
首先根据字符串路径最右侧的.把字符串路径分成两个部分,例如:Test.middlewares.LoggingRequestMiddleware分成Test.middlewares和LoggingRequestMiddleware
使用import_module导入左边的部分
从左边部分通过getattr获得具体的类
现在我们来测试一下。我们创建的测试文件结构如下图所示:
其中,pipelines.py文件的内容如下图所示:
main.py文件的内容如下图所示:
运行main.py,可以看到pipelines.py中的Pipeline类被成功执行了,如下图所示:
参考资料
[1]
相关的代码: https://github.com/scrapy/scrapy/blob/master/scrapy/utils/misc.py#L33
以上是关于一日一技:从 Scrapy 学习模块导入技巧的主要内容,如果未能解决你的问题,请参考以下文章