官方站点:https://github.com/rolando/scrapy-redis

scrapy-redis的官方文档写的比较简洁,没有提及其运行原理,所以如果想全面的理解分布式爬虫的运行原理,还是得看scrapy-redis的源代码才行。

scrapy-redis工程的主体还是是redis和scrapy两个库,工程本身实现的东西不是很多,这个工程就像胶水一样,把这两个插件粘结了起来。下面我们来看看,scrapy-redis的每一个源代码文件都实现了什么功能,最后如何实现分布式的爬虫系统:

  1. connection.py

负责根据setting中配置实例化redis连接。被dupefilter和scheduler调用,总之涉及到redis存取的都要使用到这个模块。

# 这里引入了redis模块,这个是redis-python库的接口,用于通过python访问redis数据库,
# 这个文件主要是实现连接redis数据库的功能,这些连接接口在其他文件中经常被用到import redis
import sixfrom scrapy.utils.misc import load_objectDEFAULT_REDIS_CLS = redis.StrictRedis# 可以在settings文件中配置套接字的超时时间、等待时间等
# Sane connection defaults.
DEFAULT_PARAMS = {'socket_timeout': 30,'socket_connect_timeout': 30,'retry_on_timeout': True,
}# 要想连接到redis数据库,和其他数据库差不多,需要一个ip地址、端口号、用户名密码(可选)和一个整形的数据库编号
# Shortcut maps 'setting name' -> 'parmater name'.
SETTINGS_PARAMS_MAP = {'REDIS_URL': 'url','REDIS_HOST': 'host','REDIS_PORT': 'port',
}def get_redis_from_settings(settings):"""Returns a redis client instance from given Scrapy settings object.This function uses ``get_client`` to instantiate the client and uses``DEFAULT_PARAMS`` global as defaults values for the parameters. You canoverride them using the ``REDIS_PARAMS`` setting.Parameters----------settings : SettingsA scrapy settings object. See the supported settings below.Returns-------serverRedis client instance.Other Parameters----------------REDIS_URL : str, optionalServer connection URL.REDIS_HOST : str, optionalServer host.REDIS_PORT : str, optionalServer port.REDIS_PARAMS : dict, optionalAdditional client parameters."""params = DEFAULT_PARAMS.copy()params.update(settings.getdict('REDIS_PARAMS'))# XXX: Deprecate REDIS_* settings.for source, dest in SETTINGS_PARAMS_MAP.items():val = settings.get(source)if val:params[dest] = val# Allow ``redis_cls`` to be a path to a class.if isinstance(params.get('redis_cls'), six.string_types):params['redis_cls'] = load_object(params['redis_cls'])# 返回的是redis库的Redis对象,可以直接用来进行数据操作的对象return get_redis(**params)# Backwards compatible alias.
from_settings = get_redis_from_settingsdef get_redis(**kwargs):"""Returns a redis client instance.Parameters----------redis_cls : class, optionalDefaults to ``redis.StrictRedis``.url : str, optionalIf given, ``redis_cls.from_url`` is used to instantiate the class.**kwargsExtra parameters to be passed to the ``redis_cls`` class.Returns-------serverRedis client instance."""redis_cls = kwargs.pop('redis_cls', DEFAULT_REDIS_CLS)url = kwargs.pop('url', None)if url:return redis_cls.from_url(url, **kwargs)else:return redis_cls(**kwargs)

源码分析参考:Connection相关推荐

  1. 源码分析参考:Spider

    spider.py 设计的这个spider从redis中读取要爬的url,然后执行爬取,若爬取过程中返回更多的url,那么继续进行直至所有的request完成.之后继续从redis中读取url,循环这 ...

  2. 源码分析参考:Scheduler

    scheduler.py 此扩展是对scrapy中自带的scheduler的替代(在settings的SCHEDULER变量中指出),正是利用此扩展实现crawler的分布式调度.其利用的数据结构来自 ...

  3. 源码分析参考:Pipelines

    pipelines.py 这是是用来实现分布式处理的作用.它将Item存储在redis中以实现分布式处理.由于在这里需要读取配置,所以就用到了from_crawler()函数. from scrapy ...

  4. 源码分析参考:Dupefilter

    dupefilter.py 负责执行requst的去重,实现的很有技巧性,使用的Redis的设定数据结构.但是注意调度并不使用其中用于在这个模块中实现的dupefilter键做请求的调度,而是使用qu ...

  5. 源码分析参考:Queue

    queue.py 该文件实现了几个容器类,可以看这些容器和redis交互频繁,同时使用了我们上边picklecompat中定义的序列化器.这个文件实现的几个容器大体相同,只不过一个是队列,一个是栈,一 ...

  6. PPP协议工作流程,结合ppp-2.4.9 源码分析

    ppp-2.4.9 源码分析 文章目录 ppp-2.4.9 源码分析 PPP协议工作流程 ppp-2.4.9 源码分析 全局变量和结构体说明 第一阶段 初始化 第二阶段 开始链接 第三阶段 建立PPP ...

  7. SpringMVC异常处理机制详解[附带源码分析]

    SpringMVC异常处理机制详解[附带源码分析] 参考文章: (1)SpringMVC异常处理机制详解[附带源码分析] (2)https://www.cnblogs.com/fangjian0423 ...

  8. 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | LoadedApk 源码分析 )

    文章目录 一.LoadedApk 源码分析 二.LoadedApk 源码 makeApplication 方法分析 dex 解密时 , 需要将 代理 Application 替换为 真实 Applic ...

  9. 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | ActivityThread 源码分析 )

    文章目录 一.ActivityThread 源码分析 二.ActivityThread 部分代码示例 dex 解密时 , 需要将 代理 Application 替换为 真实 Application ; ...

最新文章

  1. 机器学习第6天:数据可视化神器--Matplotlib
  2. 华北理工大学815c语言程序设计,2017年华北理工大学信息工程学院815C程序设计考研冲刺密押题...
  3. 前端学习(3014):vue+element今日头条管理--自定义验证
  4. JavaScript 操作 HTML DOM (文档对象模型) 相关知识点
  5. OpenJudge NOI 3.3 3340:RPN Calculator
  6. 手机测评系列之vivox23
  7. c语言自由存储区,C/C++ 内存分区以及自由存储区和堆的区别
  8. 华为架构师_华为首席架构师刘敏:5G商业落地 中小企业如何分一杯羹?
  9. Spring源码之ApplicationContext(九)初始化剩余的单例
  10. win10恢复出厂设置_手机如何恢复出厂设置
  11. 功能强大的pdf控件,用户无需安装任何软件即可使用
  12. 使用螺旋桨PaddleHelix完成RNA结构预测竞赛的前置基础知识整理
  13. 网络序、主机序、点分十进制的IP地址转换
  14. 60个经典的电脑技巧!每一个都超实用!
  15. 基于SSM中小型企业手机配件销售管理系统
  16. 淘宝/天猫API:seller_info-获得淘宝店铺详情
  17. MT6572平台加入呼吸灯功能——控制芯片SN3112-12简介
  18. java se7 if_Java SE7新特性之在数值型的字面值中使用下划线
  19. www.wwwwwwwwww
  20. 利用python自带的库sympy,求解不同阻尼比的振动方程表达式

热门文章

  1. 如何配置yum源,并安装FTP服务器
  2. Tomcat 8.5 配置 SSL 证书
  3. 锋利的js前端分页之jQuery
  4. 浅谈 Python 中的 __init__ 和 __new__
  5. C# Repeater根据条件后台设置前台行背景色
  6. 一个c++程序员一年前的生活笔记
  7. Docker 安装 MongoDB
  8. InnoDB架构,一幅图秒懂!
  9. 《Spring源码深度解析》 PDF
  10. java getrequest_Java Target.getRequest方法代码示例