分布式爬虫
目录
分布式爬虫
相关的参考资料
依赖环境
相关介绍
分布式问题
项目中(settings和爬虫文件.py)代码的配置
MySQL和redis的配置
开始分布式爬虫
重启分布式爬虫
相关的参考资料
scrapy-redis库GitHub地址:github地址点击打开
本博客的总结和示例代码下载地址:https://download.csdn.net/download/qq_33472765/10547511
之前关于redis的介绍(包括工具的安装使用)的博客:https://blog.csdn.net/qq_33472765/article/details/80655845
redis操作创建和卸载参考:https://www.cnblogs.com/oneTOinf/p/7928033.html
redis操作的菜鸟教程学习参考:http://www.runoob.com/redis/redis-tutorial.html
依赖环境:
Scrapy >= 1.1
Redis >= 2.8
附:查看ip的命令如下图:
相关介绍:
分布式爬虫:将一个项目拷贝到多台电脑上,同时爬取数据。
1. 必须保证所有电脑上的代码是相同的配置。
2. 在其中一台电脑上启动redis和mysql的数据库服务。
3. 同时将所有的爬虫项目运行起来。
4. 在启动redis和mysql数据库的电脑上,向redis中添加起始的url。
q = queue()
url = q.get() # 如果队列是空的,那么get()方法会一直阻塞,直到能够获取一个url,才会继续向下执行。
单机爬虫:一台电脑运行一个项目。去重采用了set()和queue(),但是这两个都是在内存中存在的。1>其他电脑是无法获取另外一台电脑内存中的数据的。2>程序终止,内存消失。
分布式问题:
1. 多台电脑如何统一的对URL进行去重?
2. 多台电脑之间如何共用相同的队列?多台电脑获取的request,如何在多台电脑之间进行同步?
3. 多台电脑运行同一个爬虫项目,如果有机器爬虫意外终止,如何保证可以继续从队列中获取新的request,而不是从头开始爬取?
前两个问题:可以基于redis实现。相当于将set()和queue()从scrapy框架中抽离出来,将其保存在一个公共的平台中(redis)。
第三个问题:scrapy_redis已经实现了,重启爬虫不会从头开始重新爬取,而是会继续从队列中获取request。不用担心爬虫意外终止。
多台电脑的爬虫项目连接同一个redis数据库。
scrapy_redis第三方库实现分布的部署:
分布式爬虫:只需要在众多电脑中,选择其中一台开启redis服务,目的就是在redis中创建公用的queue和公用的set,然后剩余电脑只需要连接redis服务即可,剩余电脑不需要开启redis-server服务。
项目中的配置
注意:配置是命令有可能需要手敲不能粘贴(拼音和英文有区别!!)
下载的scrapy-redis库,并放在项目根目录下,如下图:
1>在虚拟环境中安装:pip install redis
2>去github上搜索scrapy-redis库,解压,保存到项目根目录下。根据提供的用例,配置我们的项目,大致三部分:
1.settings.py文件;
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 300
}
# myroot: 自定义的redis链接。IP:开启redis-server服务的这台电脑的IP
REDIS_URL = 'redis://@192.168.40.217:6379'
2.jobbole.py文件(注意:继承类RedisSpider);
from scrapy_redis.spiders import RedisSpider
class JobboleSpider(RedisSpider):
name = 'jobbole'
allowed_domains = ['jobbole.com']
# start_urls = ['http://blog.jobbole.com/all-posts/']
# 添加键
redis_key = 'jobbole:start_urls'
相关截图如下:
Settings.py
爬虫文件.py中:
MySQL和redis的配置
3.有关数据库部分,相关数据库中的配置如下;
安装MySQL的时候,默认生成的用户root只有本地登录权限localhost,如果需要远程连接MySQL,需要分配一个拥有远程连接权限的新用户。(MySQL这个相对比较简单:按照顺序操作cmd就好,中间创建的过程有1个warning,可以忽略!!查看数据库中没问题就好!)
开始配置MySQL数据库>>>>
第一步:通过mysql -uroot -p登录MySQL服务。(安装时要配置环境变量,如下图:)
第二步:通过 grant all privileges on *.* to 'myroot'@'%' identified by '123456'; (注意一定要带上分号)。
# *.* 表示所有数据库中的所有表,都能够被远程连接
# '%' 表示任意IP都可以进行链接
# 'myroot' 具有远程链接权限的用户名,自定义。之后就使用这个User进行链接数据库
mysql-> grant all privileges on *.* to 'myroot'@'%' identified by '123456'; 回车即可(注意一定要带上分号)。
第三步:再去修改爬虫项目中有关数据库的配置。
MYSQL_HOST = '192.168.40.217'
MYSQL_DBNAME = 'article_db'
MYSQL_USER = 'myroot'
MYSQL_PASSWORD = '123456'
MYSQL_CHARSET = 'utf8'
(注意 :‘MYSQL_HOST =’是局域网的或公网的ip,
‘MYSQL_DBNAME =’是数据库名,
‘MYSQL_USER =’具有远程连接数据库的用户名,
‘MYSQL_PASSWORD =’密码
‘MYSQL_CHARSET =’ 编码格式)
MySQL相关配置如下图:
3>将配置好的项目,拷贝到不同的机器中;
4> Redis数据库相关配置(比较麻烦!)
开始配置redis>>>>
注意:首先保证有redis数据库,做之前查看redis中相关的文件如下图:
查看计算机管理->服务:
如果服务中没有redis(主要是因为卸载之前的配置造成的)可以在cmd中使用命令:
redis-server --service-install redis.windows.conf
在配置过程中要关闭这个服务(鱼与熊掌的问题)不要自己打开,否则在配置时执行了cmd开启命令:
redis-server.exe redis.windows.conf后再来开启就会报如下错误:
会陷入自己的纠结症中!!——可以开启可能是在修改配置后重新启动redis之后命令行Ctrl+C关闭就可以自行手动在服务中打开了,自己没验证过!!!
开始配置!!!!!!!!!!!!!!!!
重要——选择其中一台机器,开启redis-server服务,并修改redis.windows.conf(也可以同时修改:redis.windows-service.conf文件)配置文件:
# 配置远程IP地址,供其他的电脑进行连接redis
bind: (当前电脑IP) 192.168.40.217
# 关闭redis保护模式
protected-mode: no
注意:上面是示例ip,以及修改时别搞错了!!!!
运行cmd命令如下:
进入redis文件:cd redis文件目录
卸载服务命令(之前使用过redis配置的情况!):redis-server --service-uninstall
卸载后需要在服务中安装redis:redis-server --service-install redis.windows.conf(结合卸载来使用)
启动命令:redis-server.exe redis.windows.conf
启动后:连接redis服务
进入redis项目目录:cd 目录名
连接命令:redis-cli -h 192.168.70.126 -p 6379 (注意:更换ip(公网或局域网的ip),端口一般不变:6379)
在连接成功后查看redis的内部相关存入的信息输入:192.168.70.126> keys *
不关闭窗口然后输入7中的命令配置爬虫的起始url:lpush bole:start_urls http://blog.jobbole.com/all-posts/ (注意:更换url和配置键名,参考7下面的图!!)
启动后的命令如下图:
5>其中一台电脑启动redis-server服务
开始分布式爬虫
6>让所有爬虫项目都运行起来,由于没有起始的url,所有爬虫会暂时处于停滞状态
7>所有爬虫都启动之后,部署redis-server服务的电脑,通过命令redis-cli:
lpush bole:start_urls http://blog.jobbole.com/all-posts/向redis的queue中添加起始的url
注意:先启动爬虫让爬虫开始等待,然后输入上述命令!!
8>所有爬虫开始运行,爬取数据,同时所有的数据都会保存到该爬虫所连接的远程数据库以及远程redis中
注意:不能关闭cmd窗口,如下!!
重启分布式爬虫
9〉下次关机后如果需要再次开启,依次执行以下操作:
- 进入计算机管理》服务中查看redis服务是否开启(开启的需要关闭!)
Cmd命令进入redis项目目录:cd redis项目目录
启动命令:redis-server.exe redis.windows.conf (下面很熟悉!!!)
- 打开新窗口创建连接如****意:删除之前使用过的键!!--dupefilter)
进入redis项目目录:cd 目录名
连接命令:redis-cli -h 192.168.70.126 -p 6379 (注意:更换ip(公网或局域网的ip),端口一般不变:6379)
在连接成功后查看redis的内部相关存入的信息输入:192.168.70.126> keys *
注意:删除之前与该爬虫相关的键(使用过的!!)
不关闭窗口再输入7中的命令配置爬虫的起始url:lpush bole:start_urls http://blog.jobbole.com/all-posts/ (注意:更换url和配置键名)
注意:不能关闭cmd窗口!!