scrapy-redis分布式爬虫的搭建过程(理论篇)


Posted in Python onSeptember 29, 2020

1. 背景

Scrapy 是一个通用的爬虫框架,但是不支持分布式,Scrapy-redis是为了更方便地实现Scrapy分布式爬取,而提供了一些以redis为基础的组件(仅有组件)。

 2. 环境

  • 系统:win7
  • scrapy-redis
  • redis 3.0.5
  • python 3.6.1

3. 原理

3.1. 对比一下scrapy 和 Scrapy-redis 的架构图。

scrapy架构图:

scrapy-redis分布式爬虫的搭建过程(理论篇)

scrapy-redis 架构图:

scrapy-redis分布式爬虫的搭建过程(理论篇)

多了一个redis组件,主要影响两个地方:第一个是调度器。第二个是数据的处理。 3.2. Scrapy-Redis分布式策略。

scrapy-redis分布式爬虫的搭建过程(理论篇)

作为一个分布式爬虫,是需要有一个Master端(核心服务器)的,在Master端,会搭建一个Redis数据库,用来存储start_urls、request、items。Master的职责是负责url指纹判重,Request的分配,以及数据的存储(一般在Master端会安装一个mongodb用来存储redis中的items)。出了Master之外,还有一个角色就是slaver(爬虫程序执行端),它主要负责执行爬虫程序爬取数据,并将爬取过程中新的Request提交到Master的redis数据库中。

如上图,假设我们有四台电脑:A, B, C, D ,其中任意一台电脑都可以作为 Master端 或 Slaver端。整个流程是:

  • 首先Slaver端从Master端拿任务(Request、url)进行数据抓取,Slaver抓取数据的同时,产生新任务的Request便提交给 Master 处理;
  • Master端只有一个Redis数据库,负责将未处理的Request去重和任务分配,将处理后的Request加入待爬队列,并且存储爬取的数据。

scrapy-redis分布式爬虫的搭建过程(理论篇) 

scrapy-redis分布式爬虫的搭建过程(理论篇)

Scrapy-Redis默认使用的就是这种策略,我们实现起来很简单,因为任务调度等工作Scrapy-Redis都已经帮我们做好了,我们只需要继承RedisSpider、指定redis_key就行了。

缺点是,Scrapy-Redis调度的任务是Request对象,里面信息量比较大(不仅包含url,还有callback函数、headers等信息),可能导致的结果就是会降低爬虫速度、而且会占用Redis大量的存储空间,所以如果要保证效率,那么就需要一定硬件水平。

4. 运行流程

第一步:在slaver端的爬虫中,指定好 redis_key,并指定好redis数据库的地址,比如:

class MySpider(RedisSpider):
  """Spider that reads urls from redis queue (myspider:start_urls)."""
  name = 'amazon'
  redis_key = 'amazonCategory:start_
# 指定redis数据库的连接参数
'REDIS_HOST': '172.16.1.99',
'REDIS_PORT': 6379,

第二步:启动slaver端的爬虫,爬虫进入等待状态,等待 redis 中出现 redis_key ,Log如下:

2017-12-12 15:54:18 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: scrapybot)
2017-12-12 15:54:18 [scrapy.utils.log] INFO: Overridden settings: {'SPIDER_LOADER_WARN_ONLY': True}
2017-12-12 15:54:18 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.logstats.LogStats']
2017-12-12 15:54:18 [myspider_redis] INFO: Reading start URLs from redis key 'myspider:start_urls' (batch size: 110, encoding: utf-8
2017-12-12 15:54:18 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
 'redisClawerSlaver.middlewares.ProxiesMiddleware',
 'redisClawerSlaver.middlewares.HeadersMiddleware',
 'scrapy.downloadermiddlewares.retry.RetryMiddleware',
 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
 'scrapy.downloadermiddlewares.stats.DownloaderStats']
2017-12-12 15:54:18 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
 'scrapy.spidermiddlewares.referer.RefererMiddleware',
 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
 'scrapy.spidermiddlewares.depth.DepthMiddleware']
2017-12-12 15:54:18 [scrapy.middleware] INFO: Enabled item pipelines:
['redisClawerSlaver.pipelines.ExamplePipeline',
 'scrapy_redis.pipelines.RedisPipeline']
2017-12-12 15:54:18 [scrapy.core.engine] INFO: Spider opened
2017-12-12 15:54:18 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2017-12-12 15:55:18 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2017-12-12 15:56:18 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)

第三步:启动脚本,往redis数据库中填入redis_key(start_urls)

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import redis

# 将start_url 存储到redis中的redis_key中,让爬虫去爬取
redis_Host = "172.16.1.99"
redis_key = 'amazonCategory:start_urls'

# 创建redis数据库连接
rediscli = redis.Redis(host = redis_Host, port = 6379, db = "0")

# 先将redis中的requests全部清空
flushdbRes = rediscli.flushdb()
print(f"flushdbRes = {flushdbRes}")
rediscli.lpush(redis_key, https://www.baidu.com)

scrapy-redis分布式爬虫的搭建过程(理论篇)

第四步:slaver端的爬虫开始爬取数据。Log如下:

2017-12-12 15:56:18 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
parse url = https://www.baidu.com, status = 200, meta = {'download_timeout': 25.0, 'proxy': 'http://proxy.abuyun.com:9020', 'download_slot': 'www.baidu.com', 'download_latency': 0.2569999694824219, 'depth': 7}
parse url = https://www.baidu.com, status = 200, meta = {'download_timeout': 25.0, 'proxy': 'http://proxy.abuyun.com:9020', 'download_slot': 'www.baidu.com', 'download_latency': 0.8840000629425049, 'depth': 8}
2017-12-12 15:57:18 [scrapy.extensions.logstats] INFO: Crawled 2 pages (at 2 pages/min), scraped 1 items (at 1 items/min)

第五步:启动脚本,将redis中的items,转储到mongodb中。

这部分代码,请参照:scrapy-redis分布式爬虫的搭建过程(代码篇)

5. 环境安装以及代码编写

5.1. scrapy-redis环境安装

pip install scrapy-redis

scrapy-redis分布式爬虫的搭建过程(理论篇) 

scrapy-redis分布式爬虫的搭建过程(理论篇)

代码位置:后面可以进行修改定制。

scrapy-redis分布式爬虫的搭建过程(理论篇) 

5.2. scrapy-redis分布式爬虫编写

第一步,下载官网的示例代码,地址:https://github.com/rmax/scrapy-redis (需要安装过git)

git clone https://github.com/rmax/scrapy-redis.git

scrapy-redis分布式爬虫的搭建过程(理论篇)

官网提供了两种示例代码,分别继承自 Spider + redisCrawlSpider + redis

scrapy-redis分布式爬虫的搭建过程(理论篇)

第二步,根据官网提供的示例代码进行修改。

到此这篇关于scrapy-redis分布式爬虫的搭建过程(理论篇)的文章就介绍到这了,更多相关scrapy redis分布式爬虫搭建内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
详解Python的Django框架中inclusion_tag的使用
Jul 21 Python
简单掌握Python中glob模块查找文件路径的用法
Jul 05 Python
python 2.6.6升级到python 2.7.x版本的方法
Oct 09 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
python自动化报告的输出用例详解
May 30 Python
Python爬虫包BeautifulSoup异常处理(二)
Jun 17 Python
TensorFlow Session使用的两种方法小结
Jul 30 Python
对python中的float除法和整除法的实例详解
Jul 20 Python
导入tensorflow时报错:cannot import name 'abs'的解决
Oct 10 Python
如何基于Python Matplotlib实现网格动画
Jul 20 Python
python解决12306登录验证码的实现
Apr 18 Python
pytorch中的numel函数用法说明
May 13 Python
python ssh 执行shell命令的示例
Sep 29 #Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
Sep 29 #Python
浅析python 字典嵌套
Sep 29 #Python
详解基于Scrapy的IP代理池搭建
Sep 29 #Python
Python 创建守护进程的示例
Sep 29 #Python
Python 解析xml文件的示例
Sep 29 #Python
Python 字典一个键对应多个值的方法
Sep 29 #Python
You might like
在PHP中养成7个面向对象的好习惯
2010/07/17 PHP
PHP的autoload自动加载机制使用说明
2010/12/28 PHP
探讨Hessian在PHP中的使用分析
2013/06/13 PHP
php中使用PHPExcel读写excel(xls)文件的方法
2014/09/15 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
2016/04/15 PHP
Laravel框架实现定时Task Scheduling例子
2019/10/22 PHP
Javascript学习笔记7 原型链的原理
2010/01/11 Javascript
cnblogs TagCloud基于jquery的实现代码
2010/06/11 Javascript
按给定几率进行随机抽取的js代码
2010/12/28 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
2014/11/08 Javascript
教你如何使用node.js制作代理服务器
2014/11/26 Javascript
JavaScript中的逻辑判断符&&、||与!介绍
2014/12/31 Javascript
PageSwitch插件实现100种不同图片切换效果
2015/07/28 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
2015/11/19 Javascript
jQuery实现简单的DIV拖动效果
2016/02/19 Javascript
AngularJS辅助库browserTrigger用法示例
2016/11/03 Javascript
认识less和webstrom的less配置方法
2017/08/02 Javascript
vue 设置路由的登录权限的方法
2018/07/03 Javascript
JS实现星星海特效
2019/12/24 Javascript
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
在Python中使用异步Socket编程性能测试
2014/06/25 Python
Python 用Redis简单实现分布式爬虫的方法
2017/11/23 Python
python实现简易通讯录修改版
2018/03/13 Python
python构造函数init实例方法解析
2020/01/19 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
2020/02/07 Python
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
莫斯科绝对前卫最秘密的商店:SVMoscow
2017/10/23 全球购物
业务经理的岗位职责
2013/11/16 职场文书
质检部部长职责
2013/12/16 职场文书
社区庆八一活动方案
2014/02/02 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
环境保护标语
2014/06/20 职场文书
纪念九一八事变演讲稿1000字
2014/09/14 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书
六年级作文之预言作文
2019/10/25 职场文书
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电