前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一日一技:从 Scrapy 学习模块导入技巧

一日一技:从 Scrapy 学习模块导入技巧

作者头像
青南
发布2019-10-28 17:30:14
5530
发布2019-10-28 17:30:14
举报
文章被收录于专栏:未闻Code未闻Code

截图:产品经理

我们平时导入第三方模块的时候,一般使用的是import关键字,例如:

代码语言:javascript
复制
import scrapy
from scrapy.spider import Spider

但是如果各位同学看过 Scrapy 的settings.py文件,就会发现里面会通过字符串的方式来指定 pipeline 和 middleware,例如:

代码语言:javascript
复制
 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]

代码语言:javascript
复制
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函数:

  1. 首先根据字符串路径最右侧的.把字符串路径分成两个部分,例如:Test.middlewares.LoggingRequestMiddleware分成Test.middlewaresLoggingRequestMiddleware
  2. 使用import_module导入左边的部分
  3. 从左边部分通过getattr获得具体的类

现在我们来测试一下。我们创建的测试文件结构如下图所示:

其中,pipelines.py文件的内容如下图所示:

main.py文件的内容如下图所示:

运行main.py,可以看到pipelines.py中的Pipeline类被成功执行了,如下图所示:

参考资料

[1]

相关的代码: https://github.com/scrapy/scrapy/blob/master/scrapy/utils/misc.py#L33

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档