Scrapy框架结合scrapy-reids组件实现分布式机群爬虫

分布式概念:
使用多台机器搭建一个分布式机群,在分布式机群中共同运行同一组程序,让其对同一个网站资源进行联合数据爬取。
 
原生的Scrapy框架是无法实现分布式的,原因有两点:
1.调度器无法被分布式机群共享
2.管道无法被共享
 
如何实现分布式?
使用Scrapy结合这scrapy-redis组件实现分布式
 
scrapy-redis组件的作用:
1.给scrapy提供可以被共享的管道和调度器
2.安装:pip install scrapy_redis
 
实现流程:
1.创建工程
2.cd 工程
3.创建爬虫文件(基于CrawlSpider的爬虫文件)
4.修改爬虫文件:
① 导包:from scrapy_redis.spiders import RedisCrawlSpider
② 修改当前爬虫类的父类:RedisSpider
③ 删除start_urls,添加一个新属性:redis_key = ‘xxx’,可以被共享的调度器队列的名称
④ 基于常规的操作获取url发送请求解析数据
⑤ 修改settings.py配置文件:
—-指定调度器
#增加了一个去重容器类配置,作用:使用Redis的set集合来存储请求的指纹数据 DUPEFILTER_CLASS=’scrapy_redis.dupefilter.RFPDupeFilter’ #使用scrapy-redis组件自己的调度器,指定scheduler队列 SCHEDULER=’scrapy_redis.scheduler.Scheduler’ #队列中的内容是否持久保存,为False的时候,关闭redis的同时会清空redis数据 SCHEDULER_PERSIST=True
—-指定管道
ITEM_PIPELINES = { ‘scrapy_redis.pipelines.RedisPipeline’:400, }
—-指定redis服务器
REDIS_HOST=’127.0.0.1′
REDIS_PORT=6379
# 或者:REDIS_URL=’redis://127.0.0.1:6379′
⑥ 对redis的配置文件进行配置(redis.windows.conf
取消默认绑定(注释bind 127.0.0.1
关闭保护模式(protexted-mode yes:将yes改为 no)

⑦ 启动reids的服务端和客户端
⑧ 执行分布式程序(日志输出会卡住,直到接收到起始的url为止)
⑨ 向调度器的队列中扔入一个起始的url,即:lpush 爬虫名字 网址

bind 127.0.0.1表示reids只可以本机访问,如果想要让其他机器访问就需要注释掉;保护模式表示,其它的服务器可以访问reids服务器,不能写入数据。

具体的实现效果参考:scrapy_redis通过RedisSpider类实现分布式爬虫-当当图书分布式爬虫演示

发表评论