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
ClericPy
V2EX  ›  Python

批量验证代理 IP 是否可用, 有什么特别快的骚操作吗?

  •  
  •   ClericPy ·
    ClericPy · 2020-05-04 22:14:01 +08:00 · 3646 次点击
    这是一个创建于 1666 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题就是: 有什么特别省流量, 速度特别快, 结果也比较正确的校验一堆免费代理是否健康的通用方式? 这个问题两年前问过, 现在想再看看有没有新的思路

    1. 刚学编程那会, 直接给 requests 无脑挂上代理去请求的

    2. 后来发现可以先用内置的 socket 库去连一连那个代理, timeout 设置的很小就可以先筛一轮无效 IP

    3. 后来觉得为了省流量, 改成 streaming Response 获取 1 ~ 5 KB 就断开

    4. 后来觉得 head 请求或者 options 请求也应该能试试连接是否通畅

    5. 后来觉得应该有一个连接成功率的东西存在, 所以每次发 5 个请求, 计算成功请求的占比

    6. 再后来觉得只发 head 请求不能证明 get 请求是 OK 的... 所以又改为了流式请求比较前 1 KB 的数据, 顺便记录上请求时间

    7. 再后来看了下一些 star 挺多的代理池代码, 貌似大部分人就是普通的对 baidu 发了个 get 请求, 然后也不验证返回的数据, 甚至也没使用 streaming, 就是判断下 status_code 是不是 200

    8. 现在想看看有没有什么特别一点的思路, 比如先对 IP 握个手 SYN?

    第 1 条附言  ·  2020-05-04 23:00:54 +08:00
    就是想找个思路可以验证一个代理 IP 是健康的, 尽可能的流量小 + 耗时短, 如果有什么比较稳定的接口专门用来验证这个就更好了, 因为还要计算耗时来判断代理的连接速度

    之前一直用的接口是 p.3.cn 够快而且抗的住并发 ... 蔷外的是某视频网站的一个很小的 css, 好像 1.3 KB

    简单的说, 希望有个什么途径可以极快地先判断出无效的 IP, 也就是分段验证, 早年间写过代理池, 是普通的 aiohttp 设置 connect_timeout(较小) 和 read_timeout 测试的
    7 条回复    2020-05-04 23:15:22 +08:00
    gaojin
        1
    gaojin  
       2020-05-04 22:27:12 +08:00
    提供个思路。。。可以看看 squid 、nginx 这些是如何验证某个 ip 的质量的
    ClericPy
        2
    ClericPy  
    OP
       2020-05-04 22:30:32 +08:00
    @gaojin #1 感谢, 之前看的都是一些挺一般的代码...
    feelinglucky
        3
    feelinglucky  
       2020-05-04 22:36:50 +08:00
    https://github.com/mingcheng/proxypool 看看我写的?

    其实很简单,开个定时器去轮询检查就可以了。不过不知道你想要用什么技术栈实现,例如 golang 就有原生的代理库支持,所以不用想那么多。
    ClericPy
        4
    ClericPy  
    OP
       2020-05-04 22:53:03 +08:00
    @feelinglucky #3 不是轮询什么的问题, 就只谈验证一个 IP 的健康度, 有什么除了挂上代理真正请求一次以外的其他思路, 可以节省流量而且足够快, 结果又是准确的. golang 的正好最近在学, 我看一下试试
    feelinglucky
        5
    feelinglucky  
       2020-05-04 23:01:07 +08:00   ❤️ 1
    @ClericPy https://github.com/mingcheng/proxypool/blob/master/model/proxy.go#L66

    节省流量角度考虑的话,先看下端口是不是开放,然后测试 HTTP 拿头和 Response Code 是不是 200 就 OK
    了。

    其实,个人觉得这个场景下可用的代理也是有时效性的,所以即便检查了使用的时候也有可能跪了,因此拿到 IP 列表的时候进行弱检查就可以了,使用的时候设置重试切换次数。
    oott123
        6
    oott123  
       2020-05-04 23:12:15 +08:00   ❤️ 2
    别的不知道,但你要响应足够小,可以试试:

    g.cn/generate_204
    www.google.com/generate_204
    www.qualcomm.cn/generate_204

    都是支持 http / https 的,而且都很能扛并发
    ClericPy
        7
    ClericPy  
    OP
       2020-05-04 23:15:22 +08:00
    @oott123 #6 哈哈, 太好了, 连蔷外也可以
    @feelinglucky #5 嗯, 一开始说的用内置 socket 就是验证端口能否连接

    非常感谢二位, 要的就是这些思路
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1057 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:39 · PVG 06:39 · LAX 14:39 · JFK 17:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.