高可用性的分布式IP代理池,现在就试试吧。花了大约两个月的时间,到目前为止,高度可用的分布式代理IP池终于完成了,现在已经在Github上开源了。写这个项目主要有两个原因。首先,我的部分工作通常涉及处理网络爬虫,代理IP有时可以发挥非常重要的作用。笔者调查了一些开源的代理IP收集程序,发现这些程序在抓取、解析、检查、资源调度等方面总是存在一些不尽如人意的地方。第二,通过与一位网友(严格意义上不算伯乐)的交流,我产生了一些关于使用Scrapy编写分布式网络爬虫的想法,而这恰好是一个尝试验证这些想法的机会。
本文的目的是解释haipproxy的主要体系结构和过程项目模块。一个基于Scrapy和Redis的分布式网络爬虫,用于IP爬行和检查,对应于项目的爬虫。基于Redis的分布式任务调度工具,对应于项目的调度程序和redis util.py。
爬行器分为代理爬行和验证,实现思路是相似的。它主要使用Scrapy的spider_idle信号和DontCloseSpider异常来防止Scrapy在没有数据时关闭。启动调度程序,包括代理爬虫调度程序和验证爬虫调度程序。调度程序将读取rules.py中要爬取的网站,将它们组织成任务,并将它们存储在每个任务队列中。
启动每一个网络爬虫,包括IP抓取和验证程序。项目中的网络爬虫和调度器具有高可用性,可以根据实际情况进行分布式部署,无需修改代码。由于本文的目的不是为该项目编写详细的使用文档,因此省略了指定启动网络爬虫类型和调度器类型的介绍。
IP收集爬虫启动后,它将从相应的任务队列中获取任务并执行它们,然后将获取的结果存储在一个init队列中。
init队列由一个特殊的验证器HttpbinInitValidator使用,它过滤出透明的代理,然后将可用的代理输入到每个验证的队列中。调度程序将定期从经过验证的队列中获取代理IP,并将其存储在临时队列中。在这里,临时队列被用来使验证更加公平。如果直接从被验证队列中获取资源进行验证,会增加不公平性。
此时,每个验证者(非init验证者)将从相应的临时队列中获取要验证的IP并进行验证。此处省略验证细节。验证完成后,将其放回已验证队列,等待下一轮验证。Web Crawler客户端将使用其请求成功率(以分数表示)、响应速度和最后检查时间满足settings.py中配置的需求的代理IP。