1、 分布式爬取概述
当爬虫需要爬取大型网站或多个网站内容时,如果使用单台计算机运行爬虫程序,效率会非常低下。在这种情况下,就需要使用多台计算机,在每台计算机上运行爬虫程序,每台计算机上的爬虫程序负责爬取不同的内容,最后将爬取的内容进行汇总,这种爬取方式也称为分布式爬取。
分布式爬取需要一个调度引擎来调度每台计算机上的爬虫程序,为每个爬虫程序分配URL请求,并汇总爬取的内容。这个调度引擎就是scrapy-redis。

scrapy-redis引擎让让所有爬虫共享一个存在于Redis数据库的请求队列,每个爬虫程序从请求队列中获取请求,下载并解析页面后,将解析出的新请求再添加到请求队列中。
2、 安装Redis数据库
Redis数据库是一个基于键值对的存储系统,支持分布式存储。Redis 以键值形式(key-value)存储数据,其中的值可以分为以下5种类型:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)。
Redis数据库只需安装在一台计算机上即可,Redis数据库可以安装到Windows操作系统,也可以安装到Linux操作系统。
(1)安装到Ubuntu操作系统
在Ubuntu操作系统安装Redis,可以使用apt-get命令:
sudo apt-get install redis-server
安装完成后,Redis服务器会自动启动,可以使用下面的命令来检查Redis服务器是否正常启动。
检查Redis服务系统进程,在终端窗口输入下面的命令:
ps -aux|grep redis
命令执行完成后,会输出类似下面的内容:
redis 4191 0.1 0.4 50188 4616 ? Ssl 01:22 0:00 /usr/bin/redis-server 127.0.0.1:6379 uroot 15075 0.0 0.0 6432 736 pts/0 S+ 01:24 0:00 grep --color=auto redis
使用netstat命令检查Redis服务监听端口,在终端窗口输入下面的命令:
netstat -nlt|grep 6379
命令执行完成后,会输出类型下面的内容:
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN tcp6 0 0 ::1:6379 :::* LISTEN
下面的命令可以启动和停止Redis服务:
启动Redis
sudo service redis-server start
重启Redis
sudo service redis-server restart
停止Redis
sudo service redis-server stop
检查Redis服务监听的IP地址和端口,发现IP地址是127.0.0.1,这是一个本机地址,Redis服务只能监听本机发出的服务请求。如果想让Redis 能被其他计算机访问,需要在配置文件中修改Redis 服务器的监听地址,在Redis 配置文件/etc/redis/redis.conf 中做以下修改:
# 接收来自任意IP的请求 bind 0.0.0.0
配置文件修改完成后,需要重新启动Redis服务,在终端窗口输入下面的命令:
sudo service redis-server restart
重新启动Redis服务后,可以使用netstat命令查看Redis服务监听的IP地址是否已修改为0.0.0.0:
netstat -nlt|grep 6379
现在可以在与安装Redis服务同一网络的计算机上,使用Redis客户端来连接Redis服务:
redis-cli -h 192.168.62.190
其中192.168.62.190是安装Redis服务计算机的IP地址。
(2)安装到Windows操作系统
Redis官方建议将Redis安装到Linux系统,并给出了详尽的文档支持。支持Windows系统的Redis是移植官方的版本,当前最新版本是Redis 5.1.0。
Redis Windows版本下载地址:
https://github.com/tporadowski/redis/releases
Redis 5.1.0只有64位版本,下载zip包,将zip包下载到磁盘任意目录,也可以下载msi安装包。

下载完成后,解压zip包,本课程解压到D盘redis目录。解压后需要将redis目录添加到系统path环境变量,以方便在命令行窗口启动redis服务。
编辑配置文件redis.windows.conf,该配置文件在redis目录下,修改redis服务的监听IP地址,默认的IP地址是127.0.0.1,将IP地址修改为0.0.0,.0,接收来自任何IP的服务请求。
启动命令行窗口,在命令行窗口输入下面的命令启动Redis服务:
redis-server.exe D:\redis\redis.windows.conf
redis.windows.conf配置文件在D盘redis目录内。若Redis服务启动成功,命令行窗口会显示下面的界面:

3、 Redis基本命令
使用Redis编写分布式爬虫程序,需要使用到Redis的一些基本命令,Redis更详细内容请参考Redis相关书籍或官方网站。
Redis基本命令主要包括对5种数据类型的操作,分别是字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)。
字符串操作命令
案例:
在Ubuntu系统启动Redis客户端,分别输入并执行下面的命令,192.168.62.190是安装Redis服务计算机的IP地址:
uroot@userver:~$ redis-cli -h 192.168.62.190 192.168.62.190:6379> set name Perrty OK 192.168.62.190:6379> get name "Perrty"
列表操作命令
Redis的列表能够存储多个值,key对应的value数据类型可以是列表,列表的语法如下:
value value1 …… valuen
列表操作命令描述如下:
在Ubuntu系统Redis客户端,分别输入并执行下面的命令:
192.168.62.190:6379> lpush names Perrty bab Jack (integer) 3 192.168.62.190:6379> lindex names 0 "Jack" 192.168.62.190:6379> llen names (integer) 3 192.168.62.190:6379> lrange names 1 2 1) "bab" 2) "Perrty"
哈希操作命令
哈希允许一个key可以对应多个键值对类,即key对应的值为键值对数据类型。使用哈希命令为key添加键值对时,每次只能添加一个键值对。为防止和key混淆,哈希添加的键值对也称为字段和值。
哈希操作命令描述如下:
在Ubuntu系统Redis客户端,分别输入并执行下面的命令:
192.168.62.190:6379> hset age Pettry 19 (integer) 1 192.168.62.190:6379> hset age Jack 22 (integer) 1 192.168.62.190:6379> hset age bab 21 (integer) 1 192.168.62.190:6379> hget age Jack "22" 192.168.62.190:6379> hgetall age 1) "Pettry" 2) "19" 3) "Jack" 4) "22" 5) "bab" 6) "21"
集合操作命令
key对应集合类型,集合可以存储多个唯一的字符串,集合内的字符串不能重复。
集合操作命令描述如下:
在Ubuntu系统Redis客户端,分别输入并执行下面的命令:
192.168.62.190:6379> sadd color white black yellow (integer) 3 192.168.62.190:6379> smembers color 1) "yellow" 2) "black" 3) "white" 192.168.62.190:6379> scard color (integer) 3 192.168.62.190:6379> sismember color yellow (integer) 1
4、 Python使用Redis
Redis提供了多种API用来对接不同的编程语言,对接Python的API为redis-py,redis-py是为了连接redis服务而实现的 python-redis 客户端,在Windows命令行窗口输入命令:
pip3 install redis
安装完成后,需要测试一下客户端是否能够连接Redis服务,服务连接成功后,再调用Redis命令查看是否能执行成功。在Python的Shell窗口输入下面的语句:
>>> import redis
>>> server = redis.StrictRedis(host='192.168.62.190', port=6379)
>>> server.set('name', 'Petter')
True
StrictRedis()是redis API用于连接服务的方法,该方法有两个参数,参数host是运行Redis服务计算机的IP地址,参数port是Redis服务监听的端口号。获取连接对象后,直接调用Redis命令即可。