大家都知道scrapy是一个快速高效爬去网页信息的爬虫框架,但是当面对大量的信息大量的url(几千几万等以上),用一个服务器爬还是很慢的,所以尼就出现了一个项目多个服务器共同爬去的方法,就是分布式,即主从服务器,一个主机控制运行暂停等操作,多个从属服务器爬去数据,从属服务器只是用来帮忙爬去数据,从主机服务器那里拿url,再返回响应(包含信息或者新的url),那每个从属服务器每次拿的url怎么保证不一样,也就是说不爬去重复的数据或者重复的url,scrapy_redis就可以避免这个问题,那redis是什么东西尼?redis是一个非关系性数据库,内部是key_values存储系统。redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。
那scrapy_redis是怎么用和部署尼?
1.首先下载安装包scrapy_redis
(如果想使用的虚拟环境练习这个分布式,需要进入虚拟环境再下载这个包)
2.配置你要使用分布式项目的相关setting配置
配置1:调度器使用scrapy_redis的调度器,因为redis的调度器可以防止有重复的url
配置2:调用redis中的去重类,以防url重复
两个配置如下箭头所指:
3.修改你的爬虫文件
首先因为这里我们用的是redis的爬虫所以要把scrapy_redis中的RedisSpider引入,并把爬虫类的父类修改为redis的类
还有一点就是start_urls我们不再需要,因为redis用的redis_key获取url,所以我们在注释start_urls后,不要忘记加上一句:redis_key='key:starts_urls', key处可以随意填,但是最好是项目有关名字,后面会用到,当爬虫文件执行时,该redis_key会被自动调用,从redis里自动获取url地址,所以配置如下图所示!
4:如果你想让其他服务器连接到你的数据库例如mysql你的开启mysql,一般情况下,本机的mysql是关闭的,你可以点开自己的本机里面的mysql,在mysql里面找到user,里面host列root对应的那个应该填写时localhost,把这个改为%,意思是可以被其他远程服务器连接,ctrl+s保存一下,然后右击‘本机’,里面有一个有选项的‘刷新’,刷新里点击’权限‘,并且点击弹出的小框的’确定‘。过程如下:
5:然后我们要配置一下存数据的数据库,下面我写了两个数据库配置即mysql和redis
6:cmd启动redis,找到redis目录下,然后启动redis服务:redis-server.exe redis.windows.conf
如果出现如下的错误,登陆:redis-cli 然后shutdown 最后退出exit 这样再重新执行启动命令出现如下大图案就对了
7:然后把该项目发给其他服务器,还有别的电脑上的redis如果想要访问你的redis,你的redis就需要解除保护模式,即登陆redis-cli然后输入config set protected-mode "no" 如图所示:
还有就是你的redis文件里的redis.winddows.conf文件里有一个bind要改为0.0.0.0意思是让所有人可以访问到你的redis,如下所示:
然后你的防火墙记得一点要关闭,不然别人一样不能访问连接你的redis
最后你可以让其他电脑redis测试连接一下你的地址,出现如下情况即成功连接:
8:如果是你的服务器作为从属服务器,去帮忙别人的服务器爬去,连接别人的数据库即:
9:最后让其他服务器运行项目,然后你进入redis运行添加爬虫地址,即刚才的start_urls(redis服务必须在启动着即上面的第六步)
先连接本地redis客户端:redis-cli.exe
添加爬虫地址:lpush recri:start_urls https://www.liepin.com/zhaopin/?sfrom=click-pc_homepage-centre_searchbox-search_new&d_sfrom=search_fp&key=python
就是 lpush 加上 刚刚爬虫文件里配置的redis_key 再加上注释掉的起始url地址
最后出现integer就对了,后面的数字代表的是添加的urls的个数 如下所示:
然后每一台连接的电脑都会有数据出来(除非你的url太少,一个电脑就够了,可以多添加点url让电脑跑起来),而且每个电脑爬去的数据是不一样的哦!!
上述就是实现分布式爬虫的大致过程了,但是很明显有我们这样做还是有点麻烦,要把我们的项目发给我们的其他集群,那么怎么才能让我们的项目不用传输就能一起运行爬去尼?没错就是scrapyd与gerapy的结合!下一个笔记再更新!
上述内容纯属自己上课学完下课总结的,所以很有可能有错误或者解释不到位,请大神看到在评论区指教,谢谢!