赞
踩
相关背景:前几天写了个用scrapy爬取知乎用户信息的爬虫(http://blog.csdn.net/qq_40717846/article/details/78950519),今天结合这个爬虫,写一个利用scrapy-redis+scrapyd构建分布式爬取知乎用户信息的爬虫。
win10操作系统,腾讯云服务器,redis,redis dedktop manager,Mongodb
1.在项目开始之前,请确保win10以及服务器都安装了redis以及mongodb,并且以win10为主机,win10的redis能够远程连接服务器的redis。
win 10安装Redis:https://github.com/rgl/redis/downloads
centos 安装Redis:直接运行命令:
yum install redis -y
即可,安装完成后默认启动redis服务器。
2.安装完成之后都需要把redis.conf文件中的bind 127.0.0.1注释掉
修改后,重启redis服务器
systemctl restart redis
3.centos中的redis需要设置密码,用于win10的redis desktop远程连接:
4.用Redis Desktop Manager连接Redis(CentOS):
可参考:https://www.cnblogs.com/h-change/p/6077874.html
scrapy-redis实现分布式,其实从原理上来说很简单,这里为描述方便,我们把自己的核心服务器称为master,而把用于跑爬虫程序的机器称为slave。
我们知 道,采用scrapy框架抓取网页,我们需要首先给定它一些start_urls,爬虫首先访问start_urls里面的url,再根据我们的具体逻辑,对里面的元素、或者是其他的二级、三级页面进行抓取。而要实现分布式,我们只需要在这个starts_urls里面做文章就行了。
我们在master上搭建一个redis数据库(注意这个数据库只用作url的存储,不关心爬取的具体数据,不要和后面的mongodb或者mysql混淆),并对每一个需要爬取的网站类型,都开辟一个单独的列表字段。通过设置slave上scrapy-redis获取url的地址为master地址。这样的结果就是,尽管有多个slave,然而大家获取url的地方只有一个,那就是服务器master上的redis数据库。
并且,由于scrapy-redis自身的队列机制,slave获取的链接不会相互冲突。这样各个slave在完成抓取任务之后,再把获取的结果汇总到服务器上(这时的数据存储不再在是redis,而是mongodb或者 mysql等存放具体内容的数据库了)
这种方法的还有好处就是程序移植性强,只要处理好路径问题,把slave上的程序移植到另一台机器上运行,基本上就是复制粘贴的事情。
1.使用两台机器,一台是win10,一台是centos7的服务器,分别在两台机器上部署scrapy来进行分布式抓取一个网站.
2.centos7的ip地址为139.199.57.248,用来作为redis的slave端,win10的机器作为master.
3.master的爬虫运行时会把提取到的url封装成request放到redis中的数据库:“dmoz:requests”,并且从该数据库中提取request后下载网页,再把网页的内容存放到redis的另一个数据库中“dmoz:items”.
4.slave从master的redis中取出待抓取的request,下载完网页之后就把网页的内容发送回master的redis.
5.重复上面的3和4,直到master的redis中的“dmoz:requests”数据库为空,再把master的redis中的“dmoz:items”数据库写入到mongodb中.
6.master里的reids还有一个数据“dmoz:dupefilter”是用来存储抓取过的url的指纹(使用哈希函数将url运算后的结果),是防止重复抓取的.
1.先从Github上把前几天写的代码,clone到本地:
git clone https://github.com/dik111/Zhihu.git
2.新建分支,以便不影响之前的代码:
git checkout -b distributed#新建分支
git branch#切换到分支
3.修改setting.py文件:
SCHEDULER = "scrapy_redis.scheduler.Scheduler"#修改调度器
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"#用于去重的class
'scrapy_redis.pipelines.RedisPipeline': 301#爬取结果存储到Redis
REDIS_URL = 'redis://root:123456@139.199.57.248:6379'
执行爬虫程序,可以看到Redis中多了zhihu这个文件
其中zhihu:dupefilter就是上文所说的用来存储抓取过的url的指纹(使用哈希函数将url运算后的结果),是防止重复抓取的。
4.把分支代码更新到Github:
git status
git add -A
git commit -m "add distributed"
git push origin distributed
5.把代码部署到服务器:
5.1首先打开mongodb的配置文件mongodb.conf,把blind1270.0.1注释掉,以便远程连接mongodb。
5.2在linux系统下创建新的文件夹,并且把项目clone下来。
sudo git clone https://github.com/Germey/Zhihu.git -b distributed
6.运行爬虫程序
scrapy crawl zhihu
到这里一个简单的分布式框架已经搭建完成啦!
7.因为已经远程连接了mongodb,因此主机上面的redis已经不需要把从机的数据远程过来了,所以把之前的redis pipelines注释掉
#'scrapy_redis.pipelines.RedisPipeline': 301
在上面的例子中,我们是用git来更新部署代码的,但是当主机非常多的时候,这样的操作显示有点繁琐,因此,在这里我推荐使用scrapyd来进行分布式的部署。
1.安装scrapyd:
pip install scrapyd
2.启动scrapyd,并且访问远程端口:
3.修改scrapy.cfg文件:
url = http://http://127.0.0.1:6800/addversion.json
project = zhihuuser
4.安装scrapyd_client
5.启动:scrapyd-deploy
更多相关的用法请到:http://scrapyd.readthedocs.io/en/stable/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。