scrapy进行分布式爬虫
今天,参照崔庆才老师的爬虫实战课程,实践了一下分布式爬虫,并没有之前想象的那么神秘,其实非常的简单,相信你看过这篇文章后,不出一小时,便可以动手完成一个分布式爬虫!
1、分布式爬虫原理
首先我们来看一下scrapy的单机架构:

可以看到,scrapy单机模式,通过一个scrapy引擎通过一个调度器,将Requests队列中的request请求发给下载器,进行页面的爬取。
那么多台主机协作的关键是共享一个爬取队列。
所以,单主机的爬虫架构如下图所示:

前文提到,分布式爬虫的关键是共享一个requests队列,维护该队列的主机称为master,而从机则负责数据的抓取,数据处理和数据存储,所以分布式爬虫架构如下图所示:

那么队列用什么维护呢,这里我们选用Redis队列进行存储,
Redis是一种高效的非关系型数据库,以key-value的形式存储,结构灵活,它是内存中的数据结构存储系统,处理速度快,性能好,同时,提供了队列,集合等多种存储结构,方便队列维护。
另外一个问题,如何去重?这个的意思就是如何避免多台主机访问的request都不同,即让Reques队列中的请求都是不同的,那么就需要用到Redis提供的队列结构。Redis提供集合数据结构,在Redis集合中存储每个Request的指纹,在向Request队列中加入Request时首先验证指纹是否存在。如果存在,则不加入,如果不存在,则加入。
2、环境配置
目前已经有专门的python库实现了分布式架构。Scrapy-Redis库改写了Scrapy的调度器,队列等组件,可以方便的实现Scrapy分布式架构。
Scrapy-Redis链接:https://github.com/rolando/scrapy-redis
不过,想要运用这个库,我们需要安装Redis数据库
(1)windows安装redis
下载地址:https://github.com/MSOpenTech/redis/releases
下载完成后,安装即可,非常简单(其实这里没有用到windows的redis,不过装一装也不麻烦),安装完成后,windows的本地redis服务是默认启动的。
接下来可以继续安装一个redis可视化工具,Redis Desktop Manager
下载地址:https://github.com/uglide/RedisDesktopManager/releases
我们选择一个比较稳定的版本进行下载:

安装完成,我们可以测试一下本地的redis环境,输入我们的连接信息:


(2)linux下安装redis
linux下使用命令 sudo apt-get install redis即可完成安装,redis-server也是默认启动的,接下来,我们需要修改配置文件,使得我们主机可以访问虚拟机的redis数据库:
使用命令:sudo vim /etc/redis/redis.conf 进行修改:
1、将保护模式设置为no:

如果不设置此处的话,windows下访问redis直接崩溃。
2、bind ip注释掉:

如果不注释掉,只有本地可以访问redis,windows是不能访问的。
接下来重启我们的redis服务,使用命令sudo service redis restart
(3)windows下访问虚拟机redis
我们选择使用虚拟机上的redis数据库来维护爬取队列,所以接下来,我们使用windows下的可视化客户端访问虚拟机下的redis:

可以看到,成功访问:

3、代码实现
使用Scrapy-Redis实现分布式爬虫,需要在scrapy的setting.py中添加如下的配置,当然还有很多其他可用配置,这里只需添加如下的几个就可以实现分布是爬取:

SCHEDULER的意思就是使用Scrapy-Redis提供的调度器,DUPEFILTER_CLASS设置了去重机制,而后两个参数设置了下载队列的存储位置,即Redis数据库的位置。
实现的爬虫是百度贴吧的爬虫,这里就不详细说明了
具体代码参见:https://github.com/princewen/python3_crawl (使用python3.5编写)
使用winscp将代码上传到三台虚拟机上,并确保三台虚拟机有python的运行环境.
假设虚拟机上安装了python3,那么使用命令安装如下的依赖库:
sudo apt install python-pip
sudo pip install scrapy
sudo pip install scrapy_redis
sudo pip install pymongo
sudo pip install redis
4、代码运行及效果展示
我们在三台虚拟机上分别运行我们的爬虫代码抓取百度贴吧聊天吧的前100页信息,使用命令
scrapy crawl tieba
可以看到,三台虚拟机同时开始爬取:

而redis中,则维护了一个爬取队列:

短短几分钟,我们就抓取了百度贴吧聊天吧的100页帖子3900+条,存入了本地的mongodb数据库:

至此,分布式爬虫练手完毕!
参考崔大神的博客http://cuiqingcai.com/
scrapy进行分布式爬虫的更多相关文章
- Scrapy 框架 分布式 爬虫
分布式 爬虫 scrapy-redis 实现 原生scrapy 无法实现 分布式 调度器和管道无法被分布式机群共享 环境安装 - pip install scrapy_redis 导包:from sc ...
- 16 Scrapy之分布式爬虫
redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...
- scrapy补充-分布式爬虫
spiders 介绍:在项目中是创建爬虫程序的py文件 #1.Spiders是由一系列类(定义了一个网址或一组网址将被爬取)组成,具体包括如何执行爬取任务并且如何从页面中提取结构化的数据. #2.换句 ...
- scrapy简单分布式爬虫
经过一段时间的折腾,终于整明白scrapy分布式是怎么个搞法了,特记录一点心得. 虽然scrapy能做的事情很多,但是要做到大规模的分布式应用则捉襟见肘.有能人改变了scrapy的队列调度,将起始的网 ...
- 基于scrapy的分布式爬虫抓取新浪微博个人信息和微博内容存入MySQL
为了学习机器学习深度学习和文本挖掘方面的知识,需要获取一定的数据,新浪微博的大量数据可以作为此次研究历程的对象 一.环境准备 python 2.7 scrapy框架的部署(可以查看上一篇博客的简 ...
- 第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询
第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询 1.elasticsearch(搜索引擎)的查询 elasticsearch是功能 ...
- 四十四 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询
1.elasticsearch(搜索引擎)的查询 elasticsearch是功能非常强大的搜索引擎,使用它的目的就是为了快速的查询到需要的数据 查询分类: 基本查询:使用elasticsearch内 ...
- python爬虫--分布式爬虫
Scrapy-Redis分布式爬虫 介绍 scrapy-redis巧妙的利用redis 实现 request queue和 items queue,利用redis的set实现request的去重,将s ...
- 基于Python,scrapy,redis的分布式爬虫实现框架
原文 http://www.xgezhang.com/python_scrapy_redis_crawler.html 爬虫技术,无论是在学术领域,还是在工程领域,都扮演者非常重要的角色.相比于其他 ...
随机推荐
- 零基础逆向工程39_Win32_13_进程创建_句柄表_挂起方式创建进程
1 进程的创建过程 打开系统 --> 双击要运行的程序 --> EXE开始执行 步骤一: 当系统启动后,创建一个进程:Explorer.exe(也就是桌面进程) 步骤二: 当用户双击某一个 ...
- u-boot分析(三)---boot命令实现以及内核的启动
上片博文总结出了u-boot的工作流程,今天我们来分析,u-boot的两个比较重要的内容 1. U-boot命令的实现 2. U-boot如何启动内核 l 命令实现 我们 ...
- 花3分钟了解下C/C++中的函数可变参简单实现
1.可变参函数的原理 C/C++函数的参数是存放在栈区的,并且参数的入栈是从参数的右边开始,即最后一个参数先入栈,而第一个参数最后才入栈,所以,根据栈的后进先出性质,函数总能找到第一个参数.所以,可变 ...
- 如何用代码填充S/4HANA销售订单行项目的数量字段
我的任务是用代码生成S/4HANA销售订单(Sales Order)的行项目,并且填充对应的quantity(数量)值. 最开始我用了下面的代码,把quantity的值写入item字段target_q ...
- 如何把某个网站的SSL Server certificate链导入到ABAP Netweaver系统里
我们在用ABAP代码消费外网的url时会遇到一些异常,比如ICM_HTTP_SSL_PEER_CERT_UNTRUSTED,这是因为请求的url所在的网站的SSL Server certificate ...
- 基于Mybatis的Dao层开发
转自:https://www.cnblogs.com/rodge-run/p/6528398.html 基于Mybatis的Dao层开发 SqlSessionFactoryBuilder用于创建 Sq ...
- c# 语法 字符串内插
结果截屏 参考文章 https://www.cnblogs.com/csproj/p/Interpolated_Strings.html c# 6.0语法 https://www.cnblogs.co ...
- Mybatis中的DataSource配置
dataSource 的类型可以配置成其内置类型之一,如 UNPOOLED,POOLED,JNDI. 1.如果将类型设置成 UNPOOLED,MyBatis 会为每一个数据库操作创建一个新的连接,并关 ...
- mayan 游戏真是毒瘤
如题 真坑呀!!! 可算过了 我率先达到了氧气富有化 先是改变时没有fall.40分 然后是fall函数写慢了 tle 50分 . 上代码 #include<cstdio> #includ ...
- mac 开机白屏,卡进度条,无法进入系统
几个月前我的老Mac又一次的坏掉了,现在想起来就记录一下,哎,话说Apple的东西吧,好用是好用,一般都不会坏,质量保证,但是如果一旦坏了,那就是大问题!(坏了第一时间就应该打电话给apple客服小姐 ...