V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
nozer
V2EX  ›  Python

用 Python 撸了个隧道代理程序,拿来给爬虫用,求 star,求提 bug。

  •  
  •   nozer · 2020-02-27 09:51:19 +08:00 · 2217 次点击
    这是一个创建于 1749 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是这样的,去年写爬虫,被 IP 问题困扰,于是就想写个程序来自动处理代理 IP 的问题。

    具体来说思路是这样的:

    1. 提供一个 TCP 服务端,用来接受爬虫发出的请求。
    2. 维护一个代理池,池中存放可用的代理地址。
    3. 服务端接收到爬虫的请求后,从代理池中随机选择一个可用代理,然后进行请求转发。
    4. 代理服务器返回数据后,再将数据返回给爬虫。

    后来我就撸了个隧道代理程序,这个程序自动从某些提供代理的网页上获取可用代理,验证可用后放入代理池。

    昨天我又重新改造了下,实现了简单的插件机制,试了下其实效果还可以的。不过质量还是受限于代理池中代理的质量。

    发上来一方面是想求几个 star。 另一方面是想看看别人的想法,有没有其他质量更高的获取代理的方案。

    项目地址:

    https://github.com/daoye/goudan

    https://github.com/daoye/goudan_plugins

    具体用法就是

    1. 启动 main.py ,然后默认会监听本地 0.0.0.0:1991,1992,1993,1994 端口,这四个端口分别对应 http,https,socks4,socks5 协议类型的代理。
    2. 在爬虫程序上设置代理地址为: http://ip:1991 或 sock5:ip:1994 ... 就可以了。
    22 条回复    2020-04-04 14:51:51 +08:00
    lhx2008
        1
    lhx2008  
       2020-02-27 09:55:44 +08:00 via Android
    令人迷惑的轮子,玩玩还可以。用代理池最基本的需求就是并发爬取,被网站拉黑之后及时更换。
    arcaitan
        2
    arcaitan  
       2020-02-27 10:07:09 +08:00
    不怕被抓?
    itskingname
        3
    itskingname  
       2020-02-27 10:10:56 +08:00
    实际上就是阿布云的做法。
    nozer
        4
    nozer  
    OP
       2020-02-27 10:22:27 +08:00
    @arcaitan 您这话说的,哪有不害怕的。但是你总不能刀的问题,就把生产菜刀的人都抓了吧。。
    nozer
        5
    nozer  
    OP
       2020-02-27 10:26:25 +08:00
    @itskingname 以前不知道,我刚才看了下,确实是一样的。
    他这个价格跟其他卖 IP 的比起来也不算贵。
    长见识了。我现在搞这个估计算是乞丐版。。。。
    zhuyuefeng
        6
    zhuyuefeng  
       2020-02-27 10:28:58 +08:00 via iPhone
    考虑提供一个代理 ip 获取的接口,然后爬虫接入,这些并发爬取效率会好一些吗🤔
    rekulas
        7
    rekulas  
       2020-02-27 10:38:13 +08:00   ❤️ 1
    我之前给团队项目也写过一个代理池,但不是通俗意义上的隧道代理,而是 web 代理 ,支持加密传输,请求的时候同时开 N 个并发随机获取 ip 一起请求,谁先拿到数据就返回谁,然后可以自定义成功标识符,例如可以定义包含"code":1 才为成功,如果不包含则请求的并发会认为请求失败重试,这样使用起来效果很好,已顺利跑了半年多
    nozer
        8
    nozer  
    OP
       2020-02-27 10:38:20 +08:00
    @zhuyuefeng 提供获取 IP 的接口当然是可以的。只是我的本意是封装 IP 切换的过程,让爬虫从切换 IP 的过程中解放出来。如果让爬虫通过接口获取 ip 列表,然后自行切换的话,就感觉有些麻烦了。
    nozer
        9
    nozer  
    OP
       2020-02-27 10:40:52 +08:00
    @rekulas 卧槽,大哥你这个思路靠谱,这样子可以增加成功率。 我现在困扰的问题就是代理的质量参差不齐,导致请求失败的概率高居不下。如果加上你这种方案的话,可以极大提高请求的成功率。
    rekulas
        10
    rekulas  
       2020-02-27 10:51:48 +08:00
    @nozer 那你可以试试,我用这种方案基本不会遇到失败的情况,当然代理池后台也要加专门线程校验,剔除垃圾代理,按响应时间做排行
    nozer
        11
    nozer  
    OP
       2020-02-27 10:57:36 +08:00
    @rekulas 多谢提供思路,我近期看把这个功能加进去,最终效果肯定会好一大截。
    zoikhemlab
        12
    zoikhemlab  
       2020-02-27 12:18:57 +08:00
    代码都不带换行啊?
    >>> import this
    The Zen of Python, by Tim Peters

    Beautiful is better than ugly.
    Explicit is better than implicit.
    Simple is better than complex.
    Complex is better than complicated.
    Flat is better than nested.
    Sparse is better than dense.
    Readability counts.
    Special cases aren't special enough to break the rules.
    Although practicality beats purity.
    Errors should never pass silently.
    Unless explicitly silenced.
    In the face of ambiguity, refuse the temptation to guess.
    There should be one-- and preferably only one --obvious way to do it.
    Although that way may not be obvious at first unless you're Dutch.
    Now is better than never.
    Although never is often better than *right* now.
    If the implementation is hard to explain, it's a bad idea.
    If the implementation is easy to explain, it may be a good idea.
    Namespaces are one honking great idea -- let's do more of those!
    qile1
        13
    qile1  
       2020-02-27 14:21:52 +08:00 via Android
    我想问下代理执行时间是怎么结算的,我想到的就是开始执行设置时间变量,结束设置结束时间变量,两个相减就出来时间了
    nozer
        14
    nozer  
    OP
       2020-02-27 16:06:06 +08:00
    @qile1 确实可以这样计算。从发起请求开始,到收到数据结束。
    locoz
        15
    locoz  
       2020-02-27 23:53:59 +08:00
    说实在的,免费代理的质量真不行...能用免费代理解决的一般也可以用云服务器按量付费开一批解决😂
    yanheqi
        16
    yanheqi  
       2020-02-28 01:18:36 +08:00
    请问这是 抓取 什么内容的?
    nozer
        17
    nozer  
    OP
       2020-02-28 09:09:29 +08:00
    @yanheqi 这个不是爬虫,这个是给爬虫用的隧道代理。它的作用是帮助爬虫随机更换 IP。
    nozer
        18
    nozer  
    OP
       2020-02-28 09:11:15 +08:00
    @locoz 道理我也懂,我就是想不花钱,还能把这事儿给办了。

    其实目前这个版本有一定的可用性,但是用起来感觉不是特别好。等我用 @rekulas 大佬提供的方案再改造下,可用性应该就比较强了。
    rekulas
        19
    rekulas  
       2020-02-28 11:34:04 +08:00
    @locoz 很多情形并不是开几台 vps 就能解决的,例如我有个业务每天需要 1w+ip,你需要开多少台才能满足需求?就算采用性价比最高的共享 IP 方案,每个 ip 每月成本也在 1 元左右,1w 个就是 1 万元,而且还无法保证每天的 ip 是不同的,而采用代理池方案,只需要微量成本(不到 100 元 /月),我就可以每天获得 1w-10w 的有效 ip 请求,至于响应时间平均大概 2s 左右,但我通过提高并发让请求效率得到保证(目前最高大概只有 20/s 左右因为足够了)
    tunecccyyy
        20
    tunecccyyy  
       2020-03-02 01:53:14 +08:00 via iPhone
    获取代理 高质量?很简单啊 自己扫描代理 IP 端口 然后自己自己写一个检测工具 成本也就是 100 来块钱
    nozer
        21
    nozer  
    OP
       2020-03-02 14:57:22 +08:00
    @tunecccyyy 这个我也想过,但是目前没有太多精力,现在先解决有无的问题。 下一步会考虑这方面。
    liangmishi
        22
    liangmishi  
       2020-04-04 14:51:51 +08:00
    老哥,很久没更新了噢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3179 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 00:47 · PVG 08:47 · LAX 16:47 · JFK 19:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.