Scrapy-Redis分布式实现

1. 准备工作

成功实现Scrapy爬虫,Scrapy_Redis库正确安装

2. 搭建Redis服务器

推荐使用Linux服务器(阿里云,腾讯云,Azure等云主机,配有公网IP)

部分商家的服务器需要配置安全组放通Redis运行端口才可以远程访问。

记录Redis的IP,端口,地址,供后面配置分布式爬虫使用。

3. 部署代理池和Cookies池

如没有,可不用设置。

如有,需要代理池和Cookies池放到公网访问的服务器上,上传服务器,修改Redis的连接信息配置,用同样的方式运行代理池和Cookies池

远程访问代理池和Cookies池提供的接口,来获取随机代理和Cookies。

问题排查:如不能远程访问,先确保其在0.0.0.0这个Host上运行,再检查安全组的配置。

访问链接:PROXY_URL = 'http://120.27.34.25:5555/random' #服务器的IP

COOKIES_URL = 'http://120.27.34.25:5556/weibo/random' #新浪微博举例,服务器的IP

4. 配置Scrapy-Redis

配置Scrapy-Redis非常简单,只需要修改一下settings.py配置文件即可。

· 核心配置

将调度器的类和去重的类替换为Scrapy-Redis提供的类

在settings.py的配置

SCHEDULER = "scrapy_redis.scheduler.Scheduler"

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

· Redis 连接配置

两种连接方式

第一种:通过连接字符串配置,用Redis的地址、端口、密码构造一个Redis连接字符串

redis://[:password]@host:port/db

rediss://[:password]@host:port/db

unix://[:password]@/path/to/socket.sock?db=db

说明:password是密码,比如以冒号开头,中括号代表此选项可有可无,host 是Redis地址,port是运行端口,db是数据库代号,其值默认是0

在settings.py设置REDIS_URL变量

REDIS_URL = 'redis://:[email protected]:6379'

第二种:分项单独配置

在settings.py中设置:

REDIS_HOST = '120.27.34.25'

REDIS_PORT = 6379

REDIS_PASSWORD = 'foobared'

· 配置调度队列

可选配置,默认使用PriorityQueue。如果想要更改配置,可以配置SCHEDULER_QUEUE_CLASS变量,任选其一配置。

SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'

SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.FifoQueue'

SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.LifoQueue'

· 配置持久化

可选的配置,默认是False。Scrapy-Redis默认会在爬取全部完成后清空爬取队列和去重指纹集合。

如果不想自动清空爬取队列和去重指纹集合,可以增加如下配置:

SCHEDULER_PERSIST = True

设置为True后爬取队列和去重指纹集合不会在爬取完成后自动清空,如果不配置,默认False,即自动清空。

· 配置重爬

可选配置,默认是False。如果配置了持久化或强制中断了爬虫,那么爬取队列和指纹集合不会被清空,爬虫重新启动后会接着上次爬取。

如果想重新爬取,可以配置重爬的选项:SCHEDULER_FLUSH_ON_START = True

设置为True之后,爬虫每次启动时,爬取队列和指纹集合都会清空。

注意:分布式爬取:必须保证只能清空一次,否则每个爬虫任务在启动时都清空一次,将会把之前的爬取队列清空,势必影响分布式爬取。

此配置在单机爬取时比较方便,分布式爬取不常用此配置。

· Pipeline配置

可选配置,默认不启动Pipeline。Scrapy-Redis实现了一个存储到Redis的Item Pipeline,启用了Pipeline之后,爬虫会把生成的Item存储到Redis数据库。

数据量较大时,一般不这样做。因为Redis基于内存的,利用它处理速度快的特性,做存储太浪费。配置如下:

ITEM_PIPELINES = {

'scrapy_redis.pipelines.RedisPipeline': 300

}

· Scrapy-Redis配置完成

5. 配置存储目标

爬虫程序分发到各台主机的时候,爬虫会链接各自的数据库,需要在每台主机上都安装MongoDB。两个缺点1.搭建数据库环境比较繁琐2.各台主机的爬虫会把数据分散存到各自主机上,不方便统一管理。

最好将存储目标存到同一个地方。

6. 运行

每台主机上执行如下命令,即可启动爬取:

scrapy crawl xxx

7. 结果

Redis数据库信息

两个Key:xxx:dupefilter,用来存储指纹

xxx:requests,爬取队列

至此:分布式爬虫部署成功。


分享到:


相關文章: