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 = :5555/random #服务器的IP
COOKIES_URL = :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,爬取队列
至此:分布式爬虫部署成功。