V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
resolvewang
V2EX  ›  分享创造

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

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

    项目地址: 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 感动,笔芯
    chenqh
        25
    chenqh  
       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=1522175127&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   ·   我们的愿景   ·   实用小工具   ·   5407 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 07:53 · PVG 15:53 · LAX 00:53 · JFK 03:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.