在一部分抓取静态页面的任务里,我们可能会是面对大批量的任务,从而不得不实施分布式爬虫,也就是有一台主机进行分配任务,其他的从节点进行任务爬取,这里用到redis数据库。
说到这里不得不提scrapy框架下是异步执行的,所以针对静态页面爬取的效率也是非常高,当然也要避免爬取过快导致封IP等反爬行为,那么就需要设置IP池,代理池,cookie池等。
好,,,下面上具体流程
这里是crawlspider针对redis进行的分布式爬虫,而大家也都知道redis数据库的数据读写速度也非常快,当然其他数据库也可以用,配置的情况大同小异。
RedisCrawlSpider分布式
其实单说要用此分布式的话,你不必想的太复杂,过程蛮简单的。
首先就是在settings.py文件中配置一些参数
这里提到一点就是设置scrapy_redis的去重组件,不再使用scrapy框架自带的去重组件,需配置如下:
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
调度器,使用scrapy_redis自定的调度器组件,而不在使用scrapy自带的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
断点爬取
SCHEDULER_PERSIST = True
指定主节点的redis服务器的IP,切记这里设置你自己的公网IP
REDIS_HOST = '0.0.0.0'
指定服务端口
REDIS_PORT = 6380
将爬虫端分布式获取的item数据同一存储到redis数据库,数字越小优先级越高
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 400,
}
接着转战继承自crawlspider类的爬虫文件
修改继承的类 ,,,第一步
from scrapy_redis.spiders import RedisCrawlSpider
从redis数据库中获取起始url地址 至此普通scrapy分布式完成! 第二步
class HycrawlSpider(RedisCrawlSpider):
name = 'hycrawl'
allowed_domains = ['hengyan.com']
# start_urls = ['http://top.hengyan.com/mianfei/default.aspx?p=1']
# 从redis数据库中获取起始url地址 至此普通scrapy分布式完成! 第二步
redis_key = 'hycrawl:start_urls'
可以看到我把原来的start_url注释了,现在的话不需要它了;并且我们爬取任务的时候其实是向redis数据库中取任务(url),至此分布式配置完成,可以跑一下代码了!
这时候,,如果正常的话我们启动爬虫是处在等待的状态,这个时候我们还没有给爬虫分布任务,需要在redis数据库中分配任务。
如下:冒号左边是爬虫文件的名字,右边是固定的。
lpush hycrawl:start_urls http://www.dmoz.org/
已经完成了分布式爬虫,那么来说说分布式策略:
Scrapy-Redis分布式策略:
假设有四台电脑:Windows 10、Mac OS X、Ubuntu 16.04、CentOS 7.2,任意一台电脑都可以作为 Master端 或 Slaver端,比如:
Master端(核心服务器) :使用 Windows 10,搭建一个Redis数据库,不负责爬取,只负责url指纹判重、Request的分配,以及数据的存储
Slaver端(爬虫程序执行端) :使用 Mac OS X 、Ubuntu 16.04、CentOS 7.2,负责执行爬虫程序,运行过程中提交新的Request给Master
1.首先Slaver端从Master端拿任务(Request、url)进行数据抓取,Slaver抓取数据的同时,产生新任务的Request便提交给 Master 处理;
2.Master端只有一个Redis数据库,负责将未处理的Request去重和任务分配,将处理后的Request加入待爬队列,并且存储爬取的数据。
Scrapy-Redis默认使用的就是这种策略,我们实现起来很简单,因为任务调度等工作Scrapy-Redis都已经帮我们做好了,我们只需要继承RedisSpider、指定redis_key就行了。
缺点是,Scrapy-Redis调度的任务是Request对象,里面信息量比较大(不仅包含url,还有callback函数、headers等信息),可能导致的结果就是会降低爬虫速度、而且会占用Redis大量的存储空间,所以如果要保证效率,那么就需要一定硬件水平。
最后给win10的伙伴提供个redis安装的方法
win10安装redis方法https://blog.csdn.net/office5845/article/details/78017925
网友评论