一日一技:从 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函数:

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

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

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

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

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

目录
相关文章
|
数据采集 Web App开发 JSON
Python爬虫:关于scrapy模块的请求头
Python爬虫:关于scrapy模块的请求头
469 0
Python爬虫:关于scrapy模块的请求头
|
9月前
|
SQL JSON 自然语言处理
Elasticsearch学习随笔与Scrapy中Elasticsearch的应用
Elasticsearch学习随笔与Scrapy中Elasticsearch的应用
|
7月前
|
数据采集 Linux Python
Scrapy 框架学习
Scrapy 框架学习
23 0
Scrapy 框架学习
|
9月前
|
数据采集 JSON 缓存
Python | Python学习之初识Scrapy
Python | Python学习之初识Scrapy
|
数据采集 存储 JSON
scrapy学习
scrapy学习
156 0
5、web爬虫,scrapy模块,解决重复ur——自动递归url
一般抓取过的url不重复抓取,那么就需要记录url,判断当前URL如果在记录里说明已经抓取过了,如果不存在说明没抓取过 记录url可以是缓存,或者数据库,如果保存数据库按照以下方式: i...
1974 0
4、web爬虫,scrapy模块标签选择器下载图片,以及正则匹配标签
标签选择器对象 HtmlXPathSelector()创建标签选择器对象,参数接收response回调的html对象需要导入模块:from scrapy.
858 0
|
数据采集 存储 中间件
3、web爬虫,scrapy模块介绍与使用
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。
1226 0
|
XML 数据采集 Linux
2、web爬虫,scrapy模块以及相关依赖模块安装
当前环境python3.5 ,windows10系统 Linux系统安装 在线安装,会自动安装scrapy模块以及相关依赖模块
970 0
|
数据采集 API Python
scrapy爬虫加载API,配置自定义加载模块
当我们在scrapy中写了几个爬虫程序之后,他们是怎么被检索出来的,又是怎么被加载的?这就涉及到爬虫加载的API,今天我们就来分享爬虫加载过程及其自定义加载程序。 SpiderLoader API  该API是爬虫实例化API,主要实现一个类SpiderLoader class scrapy.loader.SpiderLoader 该类负责检索和处理项目中定义的spider类。
1318 0