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

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

  •  6
     
  •   resolvewang · 201 天前 · 6850 次点击
    这是一个创建于 201 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目地址: 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 友们今年升职加薪,技术精进一步。

    72 回复  |  直到 2018-04-19 22:23:48 +08:00
        1
    golmic   201 天前 via Android   ♥ 1
    这个赞一个
        2
    Charkey   201 天前   ♥ 1
    赞一个,刚好有这块需求
        3
    resolvewang   201 天前
    @Charkey #2 那赶紧用用,期待宝贵的反馈意见。因为开源比较晚,所以反馈的意见还不够,项目一些细节还能优化
        4
    resolvewang   201 天前
    @golmic #1 感谢捧场 :)
        5
    golmic   201 天前 via Android   ♥ 1
    我是专门做数据抓取的,这个 IP 的需求还是很强烈的,尝试自己搭建过 IP 代理池以及打分系统,效果并不完美,下次有需求试一下你这个项目。多沟通交流~我微信 lujqme
        6
    resolvewang   201 天前
    @golmic #5 好的,有想法的话,可以一起改进。做这个之前,我就是用着别的都不是很舒服。因此集中花了两个多月研究同类项目和其它一些文档,又结合自己的一些想法,实现了 haipproxy。期待你的使用和反馈
        7
    haofly   201 天前
    666,厉害,正好用到
        8
    resolvewang   201 天前
    @haofly #7 哈哈哈,感谢捧场。你当真用了吗
        9
    sw10   201 天前   ♥ 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 实现了。

    赞一个~
        10
    resolvewang   201 天前   ♥ 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 可能就不能用了
        11
    sw10   201 天前
    @resolvewang 思路很赞,谢谢~
        12
    resolvewang   201 天前
    @sw10 #11 客气了。其实 haipproxy 还有一个点做得比同类项目要好,就是它取 IP 的时候看同时参照最近校验时间、响应速度和稳定性。这也是从高度不可用的代理 IP 池中挑选中质量尚可的代理 IP 的一个很重要的策略
        13
    sunwei0325   201 天前
    感谢楼主, git 三库 star, 以表敬意
        14
    resolvewang   201 天前
    @sunwei0325 #13 感谢。希望能用起来,就是最好的
        15
    iamnoten   201 天前   ♥ 1
    支持,最近正需要这方面的东东,谢谢楼主
        16
    resolvewang   201 天前
    @iamnoten #15 欢迎试用。使用过程中有任何问题可以直接提 issue
        17
    xrlin   201 天前   ♥ 1
    支持
        18
    resolvewang   201 天前
    @xrlin #17 感谢捧场
        19
    hunk   201 天前   ♥ 1
    顶,在用 IPProxy,和 scrapy 搭配,还算成。
    收藏研究着
        20
    resolvewang   201 天前
    @hunk 可以对比使用,看看效果,hahahh
        21
    freedot   201 天前 via iPhone   ♥ 1
    支持
        22
    resolvewang   201 天前
    @freedot 欢迎使用哦
        23
    exoticknight   201 天前   ♥ 1
    造福人类。好久没搞爬虫估计用不上,不过还是贡献一个 star ~
        24
    resolvewang   201 天前
    @exoticknight #23 感动,笔芯
        25
    chenqh   201 天前 via iPhone   ♥ 1
    真是大佬,进 tx 了没
        26
    xuxueli   201 天前 via Android
    这里有个 java 版本的爬虫,拥有"多线程、异步、IP 动态代理、分布式、JS 渲染"等特性。提供了自建 ip 代理池的示例代码。

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

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

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

    这里下载

    同时也要注意 IP 池有个预热的过程,大概在半小时到一小时之间,因为刚启动是不可能马上就有已校验的代理 IP 的
        63
    EricInBj   191 天前   ♥ 1
    赞赞,暂时用不着,先收着
        64
    resolvewang   191 天前
    @EricInBj #63 谢谢支持
        65
    salamanderMH   181 天前
    好东西,就是有点担心,用的人多了,代理池取到 ip 的概率会受影响吧
        66
    resolvewang   181 天前
    @salamanderMH #65 嗯,是的,我开源它的主要目的在于分享这种校验和筛选 IP 的策略,虽然现在代理源还算多,但是可能也经不住成千上万的用户同时使用,特别是抓取网站大都相同的情况。正是考虑到你说的这种情况,所以写了几个文档,用以让用户了解所有组件的作用,怎么进行代理源扩展和定制校验器。这样大家可以接入一些项目没包括的代理源,甚至付费代理源。效果肯定是能通过项目的策略来保证的
        67
    iamnoten   180 天前
    @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,设置代理,都没有成功。

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

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

    目前在找工作,精力不是很够。预计下一次大的更新会在几个月之后,可能会扩展一些客户端、添加对一些爬虫框架的原生支持和优化筛选和调度算法
        72
    382601486   157 天前
    @resolvewang 环境安装老是失败,有没有一键安装什么的?谢谢
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1315 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 83ms · UTC 16:44 · PVG 00:44 · LAX 09:44 · JFK 12:44
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1