Python语言与信息数据获取和机器学习Python文集我的Python之旅

高可用分布式代理IP池:架构篇

2018-02-27  本文已影响262人  resolvewang

历时大致两个月,到现在终于完成了高可用分布式代理IP池,目前开源在了Github上。写这个项目的原因主要有两点,一是自己平时的部分工作需要和爬虫打交道,代理IP在有的时候可以发挥非常重要的作用,调研过一些开源的代理IP采集程序,发现在抓取、解析、校验、资源调度等这些方面总有一些不尽人意的地方;二是和一个网友(不严格的说算得上是伯乐)的交流让我有了关于使用Scrapy来写分布式爬虫的一些想法,正好可以借助这个机会来尝试证实这些想法。


这篇文章的目的是阐述haipproxy的主要架构和流程。该项目关键部分是

Crawler分为代理抓取和校验,两者实现思想类似,主要使用Scrapy的spider_idle信号和DontCloseSpider异常来阻止Scrapy在没有数据的时候关闭,灵感来自scrapy-redis。为了方便阐述,我画了一张包含各个组件的流程图,如下

haipproxy workflow

到此,整个流程便完了。


效果测试

以单机模式部署haipproxy测试代码,以知乎为目标请求站点,
每一万条成功请求为统计结果,实测抓取效果如下

请求量 时间 耗时 IP负载策略 客户端
0 2018/03/03 22:03 0 greedy py_cli
10000 2018/03/03 11:03 1 hour greedy py_cli
20000 2018/03/04 00:08 2 hours greedy py_cli
30000 2018/03/04 01:02 3 hours greedy py_cli
40000 2018/03/04 02:15 4 hours greedy py_cli
50000 2018/03/04 03:03 5 hours greedy py_cli
60000 2018/03/04 05:18 7 hours greedy py_cli
70000 2018/03/04 07:11 9 hours greedy py_cli
80000 2018/03/04 08:43 11 hours greedy py_cli

可见haipporxy的代理效果还算不错,在开始的时候可以达到1w/hour的请求量,几个小时候请求量请求量
降为了5k/hour。降低的结果可能有三个: (1)随着数据量的增大,Redis的性能受到了一定的影响(2)知乎校验器在把Init Queue中的代理消费完之后,由于是定时任务,所以导致某段时间内新鲜的IP空缺。而免费IP大多数都是短效的,所以这段时间出现了IP的空缺;(3)由于我们采用的是greedy模式调用IP,它的调用策略是: 高质量代理IP会一直被调用直至该代理IP不能用或者被封,而低应速度IP会轮询调用。这也可能导致高质量IP的空缺。
可见IP校验和调用策略还有很大的优化空间。希望志同道合的朋友加入进来一起优化,这也挺有意思的。

项目地址: https://github.com/SpiderClub/haipproxy

欢迎star和fork,也欢迎大家交流和PR。

上一篇 下一篇

猜你喜欢

热点阅读