分布式ip代理池,具有高可用性,赶紧试试吧!用了大概两个月的时间,到现在为止,高可用的分布式代理IP池(https://github.com/SpiderClub/haipproxy)终于完成了,现在在Github上开源。写这个项目主要有两个原因。第一,我的部分工作通常需要和网络爬虫打交道,代理IP有时候可以起到非常重要的作用。我调查过一些开源的代理IP收集程序,发现在抓取、解析、检查、资源调度等方面总有不尽如人意的地方。第二,与一位网友(不严格地说是伯乐)的交流,让边肖有了一些用Scrapy编写分布式网络爬虫的想法,而这恰好是一个尝试验证这些想法的机会。
结构化
本文的目的是解释haipproxy的主要架构和流程。项目模块是
一个基于Scrapy和Redis的分布式网络爬虫,用于IP抓取和检查,对应项目的爬虫。
基于Redis实现的分布式任务调度工具,对应于项目的调度器和redis_util.py
爬虫分为代理抓取和验证,实现思路类似。它主要是利用Scrapy的spider_idle信号和DontCloseSpider异常来防止Scrapy在没有数据时关闭。灵感来自Scrapy-redis(https://github . com/rmax/Scrapy-redis)。
启动调度程序,包括代理爬虫调度程序和验证爬虫调度程序。调度器会读取rules.py中要抓取的网站,并整理成任务,存放在各个任务队列中。
启动每个网络爬虫,包括IP抓取和验证程序。项目中的网络爬虫和调度器具有很高的可用性,可以根据实际情况分布式部署,无需修改代码。由于本文的目标不是编写该项目的详细使用文档,因此省略了指定启动网络爬虫类型和调度器类型的介绍。
IP采集爬虫启动后,会从相应的任务队列中获取任务并执行,然后将获取的结果存储在一个init队列中。
init队列由一个特殊的验证器HttpbinInitValidator使用,该验证器过滤掉透明代理,然后将可用的代理输入到每个经过验证的队列中。
调度程序将定期从经验证的队列中获取代理IP,并将其存储在临时队列中。这里,临时队列用于使验证更加公平。如果直接从已验证的队列中获取资源进行验证,会增加不公平性。
此时,每个验证者(非init验证者)都会从对应的临时队列中获取待验证的IP并进行验证,此处省略验证细节。
验证完成后,将其放回已验证的队列中,等待下一轮验证。
请求成功率(以分数表示)、响应速度和最近检查时间满足settings.py配置的要求的代理IP将被网络爬虫客户端消耗。
为了屏蔽各调用语言的差异,目前实现的客户端是squid客户端,也可以作为网络爬虫客户端的中间件。
至此,整个过程完成。