分布式爬虫原理之Scrapy分布式实现
接下来,我们会利用Scrapy-Redis来实现分布式的对接。
一、准备工作
请确保已经成功实现了Scrapy新浪微博爬虫,Scrapy-Redis库已经正确安装。
二、搭建Redis服务器
要实现分布式部署,多台主机需要共享爬取队列和去重集合,而这两部分内容都是存于Redis数据库中的,我们需要搭建一个可公网访问的Redis服务器。
推荐使用Linux服务器,可以购买阿里云、腾讯云、Azure等提供的云主机,一般都会配有公网IP,具体的搭建方式可以参考第1章中Redis数据库的安装方式。
Redis安装完成之后就可以远程连接了,注意部分商家(如阿里云、腾讯云)的服务器需要配置安全组放通Redis运行端口才可以远程访问。如果遇到不能远程连接的问题,可以排查安全组的设置。
需要记录Redis的运行IP、端口、地址,供后面配置分布式爬虫使用。当前配置好的Redis的IP为服务器的IP 120.27.34.25,端口为默认的6379,密码为foobared。
三、部署代理池和Cookies池
新浪微博项目需要用到代理池和Cookies池,而之前我们的代理池和Cookies池都是在本地运行的。所以我们需要将二者放到可以被公网访问的服务器上运行,将代码上传到服务器,修改Redis的连接信息配置,用同样的方式运行代理池和Cookies池。
远程访问代理池和Cookies池提供的接口,来获取随机代理和Cookies。如果不能远程访问,先确保其在0.0.0.0这个Host上运行,再检查安全组的配置。
如我当前配置好的代理池和Cookies池的运行IP都是服务器的IP,120.27.34.25,端口分别为5555和5556,如下图所示。
接下来我们要修改Scrapy新浪微博项目中的访问链接,如下所示:
PROXY_URL = 'http://120.27.34.25:5555/random'
COOKIES_URL = 'http://120.27.34.25:5556/weibo/random'复制代码
具体的修改方式根据实际配置的IP和端口做相应调整。
四、配置Scrapy-Redis
配置Scrapy-Redis非常简单,只需要修改一下settings.py配置文件即可。
1. 核心配置
首先最主要的是,需要将调度器的类和去重的类替换为Scrapy-Redis提供的类,在settings.py里面添加如下配置即可:
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"复制代码
2. Redis连接配置
接下来配置Redis的连接信息,这里有两种配置方式。
第一种方式是通过连接字符串配置。我们可以用Redis的地址、端口、密码来构造一个Redis连接字符串,支持的连接形式如下所示:
redis://[:password]@host:port/db
rediss://[:password]@host:port/db
unix://[:password]@/path/to/socket.sock?db=db复制代码
password
是密码,比如要以冒号开头,中括号代表此选项可有可无,host
是Redis的地址,port
是运行端口,db
是数据库代号,其值默认是0。
根据上文中提到我的Redis连接信息,构造这个Redis的连接字符串如下所示:
redis://:foobared@120.27.34.25:6379复制代码
直接在settings.py里面配置为REDIS_URL
变量即可:
REDIS_URL = 'redis://:foobared@120.27.34.25:6379'复制代码
第二种配置方式是分项单独配置。这个配置就更加直观明了,如根据我的Redis连接信息,可以在settings.py中配置如下代码:
REDIS_HOST = '120.27.34.25'
REDIS_PORT = 6379
REDIS_PASSWORD = 'foobared'复制代码
这段代码分开配置了Redis的地址、端口和密码。
注意,如果配置了REDIS_URL
,那么Scrapy-Redis将优先使用REDIS_URL
连接,会覆盖上面的三项配置。如果想要分项单独配置的话,请不要配置REDIS_URL
。
在本项目中,我选择的是配置REDIS_URL
。
3. 配置调度队列
此项配置是可选的,默认使用PriorityQueue
。如果想要更改配置,可以配置SCHEDULER_QUEUE_CLASS
变量,如下所示:
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.FifoQueue'
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.LifoQueue'复制代码
以上三行任选其一配置,即可切换爬取队列的存储方式。
在本项目中不进行任何配置,我们使用默认配置。
4. 配置持久化
此配置是可选的,默认是False
。Scrapy-Redis默认会在爬取全部完成后清空爬取队列和去重指纹集合。
如果不想自动清空爬取队列和去重指纹集合,可以增加如下配置:
SCHEDULER_PERSIST = True复制代码
将SCHEDULER_PERSIST
设置为True
之后,爬取队列和去重指纹集合不会在爬取完成后自动清空,如果不配置,默认是False
,即自动清空。
值得注意的是,如果强制中断爬虫的运行,爬取队列和去重指纹集合是不会自动清空的。
在本项目中不进行任何配置,我们使用默认配置。
5. 配置重爬
此配置是可选的,默认是False
。如果配置了持久化或者强制中断了爬虫,那么爬取队列和指纹集合不会被清空,爬虫重新启动之后就会接着上次爬取。如果想重新爬取,我们可以配置重爬的选项:
SCHEDULER_FLUSH_ON_START = True复制代码
这样将SCHEDULER_FLUSH_ON_START
设置为True
之后,爬虫每次启动时,爬取队列和指纹集合都会清空。所以要做分布式爬取,我们必须保证只能清空一次,否则每个爬虫任务在启动时都清空一次,就会把之前的爬取队列清空,势必会影响分布式爬取。
注意,此配置在单机爬取的时候比较方便,分布式爬取不常用此配置。
在本项目中不进行任何配置,我们使用默认配置。
6. Pipeline配置
此配置是可选的,默认不启动Pipeline。Scrapy-Redis实现了一个存储到Redis的Item Pipeline,启用了这个Pipeline的话,爬虫会把生成的Item存储到Redis数据库中。在数据量比较大的情况下,我们一般不会这么做。因为Redis是基于内存的,我们利用的是它处理速度快的特性,用它来做存储未免太浪费了,配置如下:
ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 300
}复制代码
本项目不进行任何配置,即不启动Pipeline。
到此为止,Scrapy-Redis的配置就完成了。有的选项我们没有配置,但是这些配置在其他Scrapy项目中可能用到,要根据具体情况而定。
五、配置存储目标
之前Scrapy新浪微博爬虫项目使用的存储是MongoDB,而且MongoDB是本地运行的,即连接的是localhost。但是,当爬虫程序分发到各台主机运行的时候,爬虫就会连接各自的的MongoDB。所以我们需要在各台主机上都安装MongoDB,这样有两个缺点:一是搭建MongoDB环境比较繁琐;二是这样各台主机的爬虫会把爬取结果分散存到各自主机上,不方便统一管理。
所以我们最好将存储目标存到同一个地方,例如都存到同一个MongoDB数据库中。我们可以在服务器上搭建一个MongoDB服务,或者直接购买MongoDB数据存储服务。
这里使用的就是服务器上搭建的的MongoDB服务,IP仍然为120.27.34.25,用户名为admin,密码为admin123。
修改配置MONGO_URI
为如下:
MONGO_URI = 'mongodb://admin:admin123@120.27.34.25:27017'复制代码
到此为止,我们就成功完成了Scrapy分布式爬虫的配置。
六、运行
接下来将代码部署到各台主机上,记得每台主机都需要配好对应的Python环境。
每台主机上都执行如下命令,即可启动爬取:
scrapy crawl weibocn复制代码
每台主机启动了此命令之后,就会从配置的Redis数据库中调度Request,做到爬取队列共享和指纹集合共享。同时每台主机占用各自的带宽和处理器,不会互相影响,爬取效率成倍提高。
七、结果
一段时间后,我们可以用RedisDesktop观察远程Redis数据库的信息。这里会出现两个Key:一个叫作weibocn:dupefilter,用来储存指纹;另一个叫作weibocn:requests,即爬取队列,如下图所示。
随着时间的推移,指纹集合会不断增长,爬取队列会动态变化,爬取的数据也会被储存到MongoDB数据库中。
八、本节代码
本节代码地址为:https://github.com/Python3WebSpider/Weibo/tree/distributed,注意这里是distributed分支。
九、结语
本节通过对接Scrapy-Redis成功实现了分布式爬虫,但是部署还是有很多不方便的地方。另外,如果爬取量特别大的话,Redis的内存也是个问题。在后文我们会继续了解相关优化方案。
本资源首发于崔庆才的个人博客静觅: Python3网络爬虫开发实战教程 | 静觅
如想了解更多爬虫资讯,请关注我的个人微信公众号:进击的Coder
weixin.qq.com/r/5zsjOyvEZ… (二维码自动识别)
分布式爬虫原理之Scrapy分布式实现相关推荐
- 三十五 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy分布式爬虫要点
1.分布式爬虫原理 2.分布式爬虫优点 3.分布式爬虫需要解决的问题 转载于:https://www.cnblogs.com/meng-wei-zhi/p/8182813.html
- 第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理...
第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-深度优先与广度优先原理 网站树形结构 深度优先 是从左到右深度进行爬取的,以深度为准则从左到右的执行(递归方式实现)Scrapy默认 ...
- Python爬虫大战、 Scrapy分布式原理以及分布式部署
Python爬虫大战 爬虫与发爬虫的厮杀,一方为了拿到数据,一方为了防止爬虫拿到数据,谁是最后的赢家? 重新理解爬虫中的一些概念 爬虫:自动获取网站数据的程序 反爬虫:使用技术手段防止爬虫程序爬取数据 ...
- 分布式爬虫原理之分布式爬虫原理
我们在前面已经实现了Scrapy微博爬虫,虽然爬虫是异步加多线程的,但是我们只能在一台主机上运行,所以爬取效率还是有限的,分布式爬虫则是将多台主机组合起来,共同完成一个爬取任务,这将大大提高爬取的效率 ...
- 第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作、增、删、改、查...
第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)基本的索引和文档CRUD操作.增.删.改.查 elasticsearch(搜索引擎)基本的索引 ...
- 三十七 Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中...
Python分布式爬虫打造搜索引擎Scrapy精讲-将bloomfilter(布隆过滤器)集成到scrapy-redis中,判断URL是否重复 布隆过滤器(Bloom Filter)详解 基本概念 如 ...
- 第三百六十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本概念...
第三百六十节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)的基本概念 elasticsearch的基本概念 1.集群:一个或者多个节点组织在一起 2.节点 ...
- 第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图...
第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲-爬虫和反爬的对抗过程以及策略-scrapy架构源码分析图 1.基本概念 2.反爬虫的目的 3.爬虫和反爬的对抗过程以及策略 scra ...
- 学习python-day02-25---转自Python分布式爬虫打造搜索引擎Scrapy精讲
第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)用Django实现搜索功能 Django实现搜索功能 1.在Django配置搜索结果页的路由映 ...
- 学习python-day02-24---转自Python分布式爬虫打造搜索引擎Scrapy精讲
第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-用Django实现搜索的自动补全功能 elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.e ...
最新文章
- 使用Tensorflow实现残差网络ResNet-50
- [case12]演进式架构
- 节能信标组比赛过程中直流电源设置
- php判断日期为空值,php判断值是否为空实例代码
- 第五周实践项目6 数制转换(栈)
- Nginx的启动和停止
- 基于keras的深度学习基本概念讲解——深度学习之从小白到入门
- 一个简单的你好,世界! 使用 Boost.MPI 消息传递的示例
- MongoDB警告信息
- 回顾频谱图卷积的经典工作:从ChebNet到GCN
- 计算机集成声卡输出通道,电脑如何屏蔽集成声卡使用独立声卡?
- 通过在路由器上安装Tomato来提高网络性能
- 数据结构大作业-家庭记账系统
- 远程控制家里电脑的N种方案
- Matplotlib学习笔记3
- 什么是3G工程师,3G工程师知识储备
- Excel使用Alt+Enter在单元格内换行
- QT中文字体的显示方法
- 二、谷歌阻止苹果,谁来阻止谷歌
- 微信小程序:超强大微信小程序源码下载内含几十款功能王者战力查询,游戏扫码登录,王者巅峰信息查询等等支持流量主收益和CPS收益
热门文章
- joomla 1.5 笔记
- goto语句会引起程序混乱?使用goto解决实际问题
- Tensor基本操作
- SpringData JPA整理
- 译注(1): 为什么大多数编程语言里,= 号被用来做赋值操作符?
- eclipse中的TODO和FIXME
- 使用apktool.jar工具反编译和回编译Android APK 终端命令模式
- BZOJ 1230: [Usaco2008 Nov]lites 开关灯( 线段树 )
- NHibernate剖析:Mapping篇之Mapping-By-Code(2):运用ModelMapper
- 推荐 ADO.NET Entity Framework (EDM) 相关技术文章