RedisCrawlSpider分布式爬虫 – Python量化投资

RedisCrawlSpider分布式爬虫

在一部分抓取静态页面的任务里,我们可能会是面对大批量的任务,从而不得不实施分布式爬虫,也就是有一台主机进行分配任务,其他的从节点进行任务爬取,这里用到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


image.png

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

https://www.jianshu.com/p/77f1811fd4e0

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论