开源一款高可用的分布式代理 IP 池(附性能测试图) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
resolvewang
V2EX    分享创造

开源一款高可用的分布式代理 IP 池(附性能测试图)

  •  6
     
  •   resolvewang
    ResolveWang 2018-03-06 14:01:41 +08:00 19742 次点击
    这是一个创建于 2845 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    陆陆续续花了近六个月的时间实现了一款高可用的分布式代理 IP 池HAipproxy,它的主要用处是为各类被限制 IP 的爬虫提供基础的代理 IP 支撑。HAipproxy 的高可用有两层含义:(1)代理 IP 资源的高可用;(2)项目各个组件的高可用。HAipproxy 的代理 IP 源均来自互联网公开的资源,项目配置了总计 30+的墙内外代理资源提供网站,所以代理 IP 资源的数量并不是 HAipproxy 主要关心的。它主要关心的是如何从海量高度不可用的代理 IP 资源中提取出高质量低延迟的代理 IP 供爬虫使用。为此,HAipproxy 制定了一些列的校验和 IP 筛选策略。在实现 HAipproxy 之前,楼主也调研过现有的代理 IP 付费方案和开源的代理 IP 方案,付费方案中有一些质量较好的但是费用比较高,其它的和开源的项目的效果都差强人意。免费+高性能,这也是HAipproxy的核心竞争力。

    Talk is cheap,我们来看点实际的东西。下面是楼主近日以知乎为测试对象,单机条件下对 HAipproxy 进行性能测试的测试结果

    haipproxy 性能测试结果

    可以看到请求量最快可以达到 1w+/hour,楼主对一天的请求量进行了统计,有19w,效果还算令人满意。

    V 友们路过的话不妨给个star吧,有使用这个项目的需求则更好了。

    新年新气象,祝看了这篇广告贴和点了star的 V 友们今年升职加薪,技术精进一步。

    76 条回复    2020-02-10 00:00:38 +08:00
    golmic
        1
    golmic  
       2018-03-06 14:07:41 +08:00 via Android   1
    这个赞一个
    Charkey
        2
    Charkey  
       2018-03-06 14:11:33 +08:00   1
    赞一个,刚好有这块需求
    resolvewang
        3
    resolvewang  
    OP
       2018-03-06 14:14:50 +08:00
    @Charkey #2 那赶紧用用,期待宝贵的反馈意见。因为开源比较晚,所以反馈的意见还不够,项目一些细节还能优化
    resolvewang
        4
    resolvewang  
    OP
       2018-03-06 14:15:06 +08:00
    @golmic #1 感谢捧场 :)
    golmic
        5
    golmic  
       2018-03-06 14:18:02 +08:00 via Android   1
    我是专门做数据抓取的,这个 IP 的需求还是很强烈的,尝试自己搭建过 IP 代理池以及打分系统,效果并不完美,下次有需求试一下你这个项目。多沟通交流~我微信 lujqme
    resolvewang
        6
    resolvewang  
    OP
       2018-03-06 14:22:01 +08:00
    @golmic #5 好的,有想法的话,可以一起改进。做这个之前,我就是用着别的都不是很舒服。因此集中花了两个多月研究同类项目和其它一些文档,又结合自己的一些想法,实现了 haipproxy。期待你的使用和反馈
    haofly
        7
    haofly  
       2018-03-06 14:26:15 +08:00
    666,厉害,正好用到
    resolvewang
        8
    resolvewang  
    OP
       2018-03-06 14:28:41 +08:00
    @haofly #7 哈哈哈,感谢捧场。你当真用了吗
    sw10
        9
    sw10  
       2018-03-06 15:40:09 +08:00   1
    简单看了下,是利用 Squid 的 cache_peer ?

    cache_peer {} parent {} 0 no-query weighted-round-robin weight=1 connect-fail-limit=2 allow-miss max-cOnn=5 name=proxy-{}

    squid_path -k reconfigure

    之前写过类似的东西,但是因为权限验证的缘故,重新用 GoLang 实现了。

    赞一个~
    resolvewang
        10
    resolvewang  
    OP
       2018-03-06 15:47:14 +08:00   1
    @sw10 squid 是实现的一个客户端。但是它的效果应该不会有定制的客户端的效果好,比如[client/py_cli]( https://github.com/SpiderClub/haipproxy/blob/master/client/py_cli.py) 原因是 squid 对代理 IP 的使用效果没有一个正负面反馈,而定制的客户端可以对高质量 IP 和低质量 IP 进行直接的反馈,根据反馈,客户端再决定是否将相同 IP 再次传递给爬虫使用。这就是截图中的 greedy 策略。如果是用 robin 策略,那么就和使用 squid 差不多了,即高质量和低质量 IP 轮询。这种方式很可能错过很多高质量 IP,因为网上抓来的 IP 大多是短效的,客户端 IP 池可能还没轮完一轮,某些高质量 IP 可能就不能用了
    sw10
        11
    sw10  
       2018-03-06 15:57:38 +08:00
    @resolvewang 思路很赞,谢谢~
    resolvewang
        12
    resolvewang  
    OP
       2018-03-06 16:03:17 +08:00
    @sw10 #11 客气了。其实 haipproxy 还有一个点做得比同类项目要好,就是它取 IP 的时候看同时参照最近校验时间、响应速度和稳定性。这也是从高度不可用的代理 IP 池中挑选中质量尚可的代理 IP 的一个很重要的策略
    sunwei0325
        13
    sunwei0325  
       2018-03-06 16:12:27 +08:00
    感谢楼主, git 三库 star, 以表敬意
    resolvewang
        14
    resolvewang  
    OP
       2018-03-06 16:14:51 +08:00
    @sunwei0325 #13 感谢。希望能用起来,就是最好的
    iamnoten
        15
    iamnoten  
       2018-03-06 16:21:39 +08:00   1
    支持,最近正需要这方面的东东,谢谢楼主
    resolvewang
        16
    resolvewang  
    OP
       2018-03-06 16:24:36 +08:00
    @iamnoten #15 欢迎试用。使用过程中有任何问题可以直接提 issue
    xrlin
        17
    xrlin  
       2018-03-06 16:49:10 +08:00   1
    支持
    resolvewang
        18
    resolvewang  
    OP
       2018-03-06 16:51:26 +08:00
    @xrlin #17 感谢捧场
    hunk
        19
    hunk  
       2018-03-06 17:02:50 +08:00   1
    顶,在用 IPProxy,和 scrapy 搭配,还算成。
    收藏研究着
    resolvewang
        20
    resolvewang  
    OP
       2018-03-06 17:18:48 +08:00
    @hunk 可以对比使用,看看效果,hahahh
    freedot
        21
    freedot  
       2018-03-06 21:36:49 +08:00 via iPhone   1
    支持
    resolvewang
        22
    resolvewang  
    OP
       2018-03-06 21:49:00 +08:00
    @freedot 欢迎使用哦
    exoticknight
        23
    exoticknight  
       2018-03-06 21:56:08 +08:00   1
    造福人类。好久没搞爬虫估计用不上,不过还是贡献一个 star ~
    resolvewang
        24
    resolvewang  
    OP
       2018-03-06 22:03:51 +08:00
    @exoticknight #23 感动,笔芯
    simple2025
        25
    simple2025  
       2018-03-06 22:07:01 +08:00 via iPhone   1
    真是大佬,进 tx 了没
    xuxueli
        26
    xuxueli  
       2018-03-06 22:15:40 +08:00 via Android
    这里有个 java 版本的爬虫,拥有"多线程、异步、IP 动态代理、分布式、JS 渲染"等特性。提供了自建 ip 代理池的示例代码。

    https://github.com/xuxueli/xxl-crawler
    resolvewang
        27
    resolvewang  
    OP
       2018-03-06 22:41:53 +08:00
    @chenqh #25 资历尚浅,以后有机会一定会试试
    resolvewang
        28
    resolvewang  
    OP
       2018-03-06 22:42:38 +08:00
    哈哈哈,可以试试楼上的同学@ xuxueli 的爬虫框架和 haipproxy 搭配的使用效果
    Cyron
        29
    Cyron  
       2018-03-07 01:27:47 +08:00 via iPhone   1
    hai p proxy 嗨皮代理?
    顺便给大佬舔 jio
    WildCat
        30
    WildCat  
       2018-03-07 09:02:13 +08:00 via iPhone   1
    四个命令有点麻烦 能否来个简单单命令模式?
    resolvewang
        31
    resolvewang  
    OP
       2018-03-07 09:39:01 +08:00
    @Cyron 哥们你真有才。不过这个名字应该是这么读,high available ip proxy,就是帖子上说的高可用代理。都是正经人,也得取个正儿八经的名字
    resolvewang
        32
    resolvewang  
    OP
       2018-03-07 09:42:05 +08:00
    @WildCat 感谢反馈。由于系统组件本身就比较多,包括了代理 IP 抓取程序和校验器,抓取程序定时任务调度工具和校验器定时任务调度工具,这四个命令主要就是启动这四货的。可以在一个 shell 脚本中启动它们。可以参考 [run.sh]( https://github.com/SpiderClub/haipproxy/blob/master/run.sh)。更方便的模式我还没想出来,你要有好的意见可以提一下
    CrazyMelody
        33
    CrazyMelody  
       2018-03-07 13:28:28 +08:00   1
    已 star~
    resolvewang
        34
    resolvewang  
    OP
       2018-03-07 13:33:15 +08:00
    @CrazyMelody 感谢捧场
    tcpdump
        35
    tcpdump  
       2018-03-07 14:09:34 +08:00   1
    没看懂怎么用? 怎么获取代理列表
    resolvewang
        36
    resolvewang  
    OP
       2018-03-07 14:34:48 +08:00   1
    @tcpdump 通过客户端获取。具体来讲就是 py_cli.py 文件的 ProxyFetcher 类,它有个方法叫做 get_proxy(),这是输出当前的一个可用代理(由策略决定)。还有一个 get_proxies()方法,这个是输出代理列表,两者是有一些差别的。

    另外,如果有兴趣和使用需求的话,还望花几分钟读一下  examples/zhihu  的使用示例和 docs 中的文档,因为 haipproxy 提供代理的思路和目前开源出来的项目用 web api 提供的代理列表的思路有一丢丢差别。

    欢迎不懂再问哈
    freedot
        37
    freedot  
       2018-03-07 20:56:01 +08:00 via iPhone
    可以用来刷点击,又一黑产工具
    resolvewang
        38
    resolvewang  
    OP
       2018-03-07 21:10:31 +08:00
    @freedot #37 我们做技术的还是得用道德来约束自己
    liuxu
        39
    liuxu  
       2018-03-08 19:55:49 +08:00
    感谢楼主啊
    resolvewang
        40
    resolvewang  
    OP
       2018-03-08 19:57:56 +08:00
    @liuxu #39 用了吗?效果咋样
    liuxu
        41
    liuxu  
       2018-03-08 20:01:10 +08:00
    @resolvewang 还没用,先收藏明天试试看
    resolvewang
        42
    resolvewang  
    OP
       2018-03-08 20:21:41 +08:00
    @liuxu #41 好的,欢迎反馈意见
    BadReese
        43
    BadReese  
       2018-03-09 19:10:44 +08:00
    @resolvewang 用 docker 方式部署在 VPS 上,顺便修改了 setting 里的密码。本地连接的时候发现密码修改没有生效,用默认的 123456 可以连接上。这个是怎么回事呢?
    另外,获取可用代理列表一直是空的,除了按照 WIKI 里的 docker-compose up 之外,还需要执行其他操作么?
    resolvewang
        44
    resolvewang  
    OP
       2018-03-09 19:24:16 +08:00
    @BadReese #43 github 上已经回复了。还望耐心阅读开发者文档
    BadReese
        45
    BadReese  
       2018-03-09 19:38:25 +08:00
    @resolvewang 好的,谢谢你,这是个很棒的库
    resolvewang
        46
    resolvewang  
    OP
       2018-03-09 20:25:11 +08:00
    @BadReese #45 客气。好用给个 star 或者宣传一下就好了
    Soar360
        47
    Soar360  
       2018-03-10 15:01:50 +08:00 via iPhone
    每到这个时候 我就会来搭一波车
    https://proxy.coderbusy.com
    Soar360
        48
    Soar360  
       2018-03-10 15:15:27 +08:00 via iPhone
    看到了 确实用到了我站的数据源 。。恭喜 你被投毒了……
    resolvewang
        49
    resolvewang  
    OP
       2018-03-10 15:45:03 +08:00
    @Soar360 #48 关系不大,就算 coderbusy 数据源全有问题,其它也够用了
    resolvewang
        50
    resolvewang  
    OP
       2018-03-10 15:47:10 +08:00
    @Soar360 #47 数据源墙内墙外都有很多,只不过需要体力和一些方法去搜集而已
    gamecreating
        51
    gamecreating  
       2018-03-10 17:00:38 +08:00
    这个必须赞一个
    resolvewang
        52
    resolvewang  
    OP
       2018-03-10 17:15:49 +08:00
    @gamecreating 感谢支持
    xiaodaoi
        53
    xiaodaoi  
       2018-03-12 09:33:15 +08:00 via iPhone
    好东西
    resolvewang
        54
    resolvewang  
    OP
       2018-03-12 09:45:37 +08:00
    @xiaodaoi #53 那快用用吧,期待宝贵的用户反馈
    jitongxi
        55
    jitongxi  
       2018-03-13 13:26:03 +08:00   1
    。。。。自己用用就行了, 直接开放出来,最后又要被老外骂作蝗虫了
    resolvewang
        56
    resolvewang  
    OP
       2018-03-13 13:38:30 +08:00
    @jitongxi #55 感谢提醒。老外也有用的。。。当初开源的一个原因是感觉这种验证和筛选策略很有意思,所以就 public 了
    seancheer
        57
    seancheer  
       2018-03-13 14:13:34 +08:00   1
    @jitongxi 这么说就有些过分了,楼主开源这些东西是为了技术之间相互分享,相互学习。。什么叫害怕老外骂蝗虫?如果这是违法违反社区条例的,直接举报就行,搞的好像老外就很高尚,没有爬虫似得
    jitongxi
        58
    jitongxi  
       2018-03-13 14:48:13 +08:00
    @seancheer 可笑,你根本没听懂我在说什么。
    Betsy
        59
    Betsy  
       2018-03-16 00:21:09 +08:00
    [并没有 IP]( )
    Betsy
        60
    Betsy  
       2018-03-16 00:22:15 +08:00
    @resolvewang 如上图所示,所以是哪里错了吗?
    resolvewang
        61
    resolvewang  
    OP
       2018-03-16 09:30:29 +08:00
    @Betsy #60 master 分支更新了一些代码,不向后兼容,目前文档由于精力原因还没更新,你可以下载 release 当中的 0.1 版本进行测试  2.你可以使用 redisdesktopmanager 来查看已抓取到的代理,肯定是没问题的
    resolvewang
        62
    resolvewang  
    OP
       2018-03-16 09:32:09 +08:00
    https://github.com/SpiderClub/haipproxy/releases

    这里下载

    同时也要注意 IP 池有个预热的过程,大概在半小时到一小时之间,因为刚启动是不可能马上就有已校验的代理 IP 的
    EricInBj
        63
    EricInBj  
       2018-03-16 09:42:14 +08:00   1
    赞赞,暂时用不着,先收着
    resolvewang
        64
    resolvewang  
    OP
       2018-03-16 13:29:25 +08:00
    @EricInBj #63 谢谢支持
    salamanderMH
        65
    salamanderMH  
       2018-03-26 18:01:46 +08:00
    好东西,就是有点担心,用的人多了,代理池取到 ip 的概率会受影响吧
    resolvewang
        66
    resolvewang  
    OP
       2018-03-26 19:16:49 +08:00
    @salamanderMH #65 嗯,是的,我开源它的主要目的在于分享这种校验和筛选 IP 的策略,虽然现在代理源还算多,但是可能也经不住成千上万的用户同时使用,特别是抓取网站大都相同的情况。正是考虑到你说的这种情况,所以写了几个文档,用以让用户了解所有组件的作用,怎么进行代理源扩展和定制校验器。这样大家可以接入一些项目没包括的代理源,甚至付费代理源。效果肯定是能通过项目的策略来保证的
    iamnoten
        67
    iamnoten  
       2018-03-27 14:32:13 +08:00
    @resolvewang 不好意思,打扰了,我在虚拟机上搭建环境,但是 sudo docker pull scrapinghub/splash, 总是报错 error pulling image configuration: Get https://dseasb33srnrn.cloudfront.net/registry-v2/docker/registry/v2/blobs/sha256/39/3926e5aac017cdd47961dccb8dcb83fc1789ec1ccfefcaa4f03f81aa4c10a3c8/data?Expires=152217512&Signature=UfxYM9jhI-tqCgvfqfbg8mCpDQErJhxSawpQnX6QWLCUFZrq5xOKHOUdSNC19HnqnjhMi7e7GeNq1tfuxjn7HNLNDYnuDduaF9mG4uwJvbzu9b9~~DOnoWUML207DIS54tV4JCI~ix0PZjuTEtvk1efh3BA-U-Onl0UObJ8ggZQ_&Key-Pair-Id=APKAJECH5M7VWIS5YZ6Q: net/http: TLS handshake timeout
    不知道你有没有遇到过这个问题?
    在网上搜了很多,有说是虚拟机的问题,有说是墙的问题,试了很多办法包括调整 mtu,设置代理,都没有成功。

    谢谢
    resolvewang
        68
    resolvewang  
    OP
       2018-03-28 10:42:18 +08:00
    @iamnoten #67 TLS 这个感觉是网络问题啊,握手失败了。你能用 docker pull 拉取其它镜像吗?如果不行的话,可以搜索一下 docker 镜像加速,比如设置阿里云的 docker 镜像源等

    你也可以尝试另外一台虚拟机或者宿主机上试试啊,我没遇到过这个问题,无法给出建设性的解答,不好意思哈
    resolvewang
        69
    resolvewang  
    OP
       2018-03-28 10:43:04 +08:00
    @iamnoten #67 此外,你也可以将它的镜像下载下来,在本机再打包之类的
    chi1st
        70
    chi1st  
       2018-03-31 01:05:22 +08:00
    谢谢楼主,试用了一下很强大,要是能有直接与 scrapy 对接的接口就好了(
    resolvewang
        71
    resolvewang  
    OP
       2018-03-31 10:26:23 +08:00
    @chi1st #70 感谢支持。可以直接调用 ProxyFetcher,为 scrapy 写一个中间件就行了。

    目前在找工作,精力不是很够。预计下一次大的更新会在几个月之后,可能会扩展一些客户端、添加对一些爬虫框架的原生支持和优化筛选和调度算法
    382601486
        72
    382601486  
       2018-04-19 22:23:48 +08:00
    @resolvewang 环境安装老是失败,有没有一键安装什么的?谢谢
    Berny
        73
    Berny  
       2019-02-15 14:17:25 +08:00
    赞,可以支持自己设定 IP 池么?
    Sum0l
        74
    Sum0l  
       2019-06-04 13:56:15 +08:00
    感谢分享,已经试用了,但目前很多源已经失效,可用的 ip 不多。考虑加入付费啦
    resolvewang
        75
    resolvewang  
    OP
       2019-07-14 10:59:49 +08:00
    @Sum0l 公开源很久没维护了,因此源都失效了,加入付费源效果就很明显了
    Nasser
        76
    Nasser  
       2020-02-10 00:00:38 +08:00
    有国外的源吗?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2531 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 40ms UTC 12:37 PVG 20:37 LAX 04:37 JFK 07:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86