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

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


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

  • 基于Scrapy和Redis的分布式爬虫,用作IP抓取和校验,对应于项目的crawler
  • 基于Redis实现的分布式任务调度工具,对应于项目的schedulerredis_util.py

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

haipproxy workflow
  • 启动调度器,包括代理爬虫调度器和校验爬虫调度器。调度器会读取rules.py中待抓取的网站,将其编排成任务存入各个任务队列中
  • 启动各个爬虫,包括IP抓取和校验程序。项目中爬虫和调度器都是高可用的,可以根据实际情况进行分布式部署,无需改动代码。由于本文的目标不是写成该项目的详细使用文档,所以省略了如指定启动爬虫类型和调度器类型的介绍
  • 代理IP采集爬虫启动后会到对应的任务队列中获取任务并执行,再把获取到的结果存入一个init队列中
  • init队列由一个特殊的校验器HttpbinInitValidator进行消费,它会过滤掉透明代理,再把可用代理输入各个Validated队列中
  • 调度器会定时从Validated队列中获取代理IP,再将其存入一个临时的队列。这里用一个临时队列是为了让校验更加公平,如果直接从Validated队列中获取资源进行校验,那么会增大不公平性
  • 这时候各个校验器(非init校验器)会从对应的临时队列中获取待校验的IP并对其进行校验,此处省略校验细节
  • 校验完成后再将其放回到Validated队列中,等待下一轮校验
  • 请求成功率(体现为分数)、响应速度和最近校验时间满足settings.py所配置要求的代理IP将会被爬虫客户端所消费
  • 为了屏蔽各个调用语言的差异性,目前实现的客户端是squid客户端,它可以作为爬虫客户端的中间件

到此,整个流程便完了。


效果测试

以单机模式部署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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容