Logo

郎哥编程

分布式爬取与Redis

2020-12-24 271

1、 分布式爬取概述

当爬虫需要爬取大型网站或多个网站内容时,如果使用单台计算机运行爬虫程序,效率会非常低下。在这种情况下,就需要使用多台计算机,在每台计算机上运行爬虫程序,每台计算机上的爬虫程序负责爬取不同的内容,最后将爬取的内容进行汇总,这种爬取方式也称为分布式爬取。

分布式爬取需要一个调度引擎来调度每台计算机上的爬虫程序,为每个爬虫程序分配URL请求,并汇总爬取的内容。这个调度引擎就是scrapy-redis。

56.png

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安装包。

60.png

下载完成后,解压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服务启动成功,命令行窗口会显示下面的界面:

61.png

3、 Redis基本命令

使用Redis编写分布式爬虫程序,需要使用到Redis的一些基本命令,Redis更详细内容请参考Redis相关书籍或官方网站。

Redis基本命令主要包括对5种数据类型的操作,分别是字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)。

字符串操作命令

62.PNG

案例:

在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

列表操作命令描述如下:

63.PNG

在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混淆,哈希添加的键值对也称为字段和值。

哈希操作命令描述如下:

66.PNG

在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命令即可。

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论