了解分布式代理IP池的架构
2020-11-26
代理IP能够在爬虫工作中起到重要作用,但像一些开源的代理IP程序,存在一些在使用起来不太满意的地方。于是针对分布式爬虫,搭建了可用分布式代理IP池,下面ipidea全球http同大家了解高可用分布式代理IP池的架构。
阐述haipproxy的主要架构和流程。该项目关键部分是:
根据Scrapy和Redis的分布式爬虫,用作IP抓取和校验,对应于项目的crawler根据Redis实现的分布式任务调度工具,对应于项目的scheduler和redis_util.py
Crawler分为代理抓取和校验,两者实现思想类似,主要使用Scrapy的spider_idle信号和DontCloseSpider异常来防止账号关联Scrapy在没有数据的时候关闭,灵感来自scrapy-redis。
启动调度器,包括代理爬虫调度器和校验爬虫调度器。调度器会读取rules.py中待抓取的网站,将其编排成任务存入各个任务队列中启动各个爬虫,包括IP抓取和校验程序。项目中爬虫和调度器都是高可用的,可以根据实际情况进行分布式部署,无需改动代码。由于本文的目标不是写成该项目的详细使用文档,所以省略了如指定启动爬虫类型和调度器类型的介绍。
代理IP采集爬虫启动后会到对应的任务队列中获取任务并执行,再把获取到的结果存入一个init队列中。
init队列由一个特殊的校验器HttpbinInitValidator进行消费,它会过滤掉透明代理,再把可用代理输入各个Validated队列中。
调度器会定时从Validated队列中获取代理IP,再将其存入一个临时的队列。这里用一个临时队列是为了让校验更加公平,如果直接从Validated队列中获取资源进行校验,那么会增大不公平性。
这时候各个校验器(非init校验器)会从对应的临时队列中获取待校验的IP并对其进行校验,此处省略校验细节。
校验完成后再将其放回到Validated队列中,等待下一轮校验。请求成功率(体现为分数)、响应速度和近校验时间满足settings.py所配置要求的代理IP将会被爬虫客户端所消费。
为了防止账号关联各个调用语言的差异性,目前实现的客户端是squid客户端,它可以作为爬虫客户端的中间件。
声明:本文来自网络投稿,不代表IPIDEA立场,若存在侵权、安全合规问题,请及时联系IPIDEA进行删除。
上一篇:爬虫代理IP为什么会出现超时?