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

问一个代理的实现

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

    想用 selenium 做一个爬虫,为了绕开访问限制,使用 ip 池。同时为了效率,selenium 的 chrome instance 打算复用,所以基本的架构是

    graph LR
    selenium-->mitmproxy-->proxypool-->webserver
    

    mitmproxy 会拦截 request 请求,当请求 url 满足条件时,将上游的代理设置从 proxypool 里取得的代理。当代理失效的时候,调用 proxypool refresh 就可以用了。

    selenium 设置代理为 mitmproxy 所对应的地址,这样就不需要每次访问的时候重新打开一个 chrome instance 。

    有几个问题没有办法实现

    1. mitmproxy 对 https 支持好像不能 connect ,导致 https 网站访问会有证书问题,如何像 squid 那样,支持 https connect 操作
    2. https 协议也能跳转到 proxypool

    或者还有其他的代理软件可以支持动态的修改 upstream server 。

    15 条回复    2024-06-07 11:40:08 +08:00
    dotudeth
        1
    dotudeth  
       206 天前
    v2fly 可以根据域名分流。我们项目基于 v2fly 改了一下可以在同一个目标网站按网站的账号进行分流。
    guoguobaba
        2
    guoguobaba  
    OP
       206 天前
    @dotudeth 这个没法用动态的代理池以及编程实现啊
    chrawsl
        3
    chrawsl  
       206 天前
    感觉可以接一下 v2fly 的 api ,自动更新出口 ip
    retanoj
        4
    retanoj  
       206 天前
    为何要在中间接入 mitmproxy ?
    teaegglove
        5
    teaegglove  
       206 天前 via Android
    之前用 Go 实现了一个一模一样的,mitmproxy 那里支持编程修改 request response 还支持 basic auth 。有偿的话联系 v : d2hzYW45MTM=
    zeusho871
        6
    zeusho871  
       206 天前
    mitmproxy 好像 ja3 会被检测
    teaegglove
        7
    teaegglove  
       206 天前 via Android
    @zeusho871 确实,但可以通过编程改 ja3
    ClericPy
        8
    ClericPy  
       206 天前
    隧道代理吗?在公司里用 Asyncio 手撸了一个(因为也有自定义条件策略,如域名负载均衡,检验代理连通性可用性以及淘汰策略)

    如果不想自己弄,gost 有隧道代理,不过想自定义转发策略还是得自己折腾。你这直接说实现看的人迷糊,能直接说需求么
    dotudeth
        9
    dotudeth  
       206 天前
    v2fly 有多负载模式。
    NoOneNoBody
        10
    NoOneNoBody  
       206 天前
    中间代理不需要加密,原文送过去就是了,http 足够,加密的事浏览器已经做了
    况且爬虫保密的是人身安全(ip 指纹之类),数据安全不需要理会吧
    guoguobaba
        11
    guoguobaba  
    OP
       206 天前
    @ClericPy 就是找个代理,能够通过接口的方式动态修改 upstream proxy ,并且能支持 https 的 connect
    guoguobaba
        12
    guoguobaba  
    OP
       206 天前
    @chrawsl
    ```json
    {
    "log": {
    "loglevel": "debug"
    },
    "inbounds": [{
    "port": 18080,
    "listen": "0.0.0.0",
    "tag": "socks-inbound",
    "protocol": "http",
    "settings": {
    "auth": "noauth",
    "udp": false,
    "ip": "0.0.0.0"
    },
    "sniffing": {
    "enabled": true,
    "destOverride": ["http", "tls"]
    }
    }],
    "outbounds": [{
    "protocol": "http",
    "settings": {
    "servers": [
    {
    "address": "127.0.0.1",
    "port": 3128
    }
    ]},
    "tag": "direct"
    }],
    "api":{
    "tag": "api",
    "services": [
    "HandlerService",
    "LoggerService",
    "StatsService"
    ]
    }
    }
    ```

    https connect 能支持,但是 http 协议也变成 connect 了,
    ```
    1715172041.901 0 127.0.0.1 TCP_DENIED/403 3886 CONNECT www.baidu.com:80 - HIER_NONE/- text/html
    1715172042.001 0 127.0.0.1 TCP_DENIED/403 3886 CONNECT www.baidu.com:80 - HIER_NONE/- text/html
    1715172042.202 0 127.0.0.1 TCP_DENIED/403 3886 CONNECT www.baidu.com:80 - HIER_NONE/- text/html
    1715172042.503 0 127.0.0.1 TCP_DENIED/403 3886 CONNECT www.baidu.com:80 - HIER_NONE/- text/html
    1715172055.656 0 127.0.0.1 TCP_DENIED/403 3877 CONNECT www.qq.com:80 - HIER_NONE/- text/html
    1715172055.656 0 127.0.0.1 TCP_DENIED/403 3877 CONNECT www.qq.com:80 - HIER_NONE/- text/html
    1715172055.757 0 127.0.0.1 TCP_DENIED/403 3877 CONNECT www.qq.com:80 - HIER_NONE/- text/html
    1715172055.958 0 127.0.0.1 TCP_DENIED/403 3877 CONNECT www.qq.com:80 - HIER_NONE/- text/html
    1715172056.259 0 127.0.0.1 TCP_DENIED/403 3877 CONNECT www.qq.com:80 - HIER_NONE/- text/html
    1715172101.279 24 127.0.0.1 TCP_MISS/302 433 GET http://www.qq.com/ - HIER_DIRECT/61.241.54.232 text/html
    1715172130.821 63 127.0.0.1 TCP_TUNNEL/200 4349 CONNECT www.qq.com:443 - HIER_DIRECT/61.241.54.232 -

    ```
    pagxir
        13
    pagxir  
       206 天前
    你的需求在 linux 上大概率用 shell/iptables/socat 就可以实现了。
    huifukejian
        14
    huifukejian  
       199 天前
    clash 可以 api 设置出站节点
    /proxies/proxies_name
    请求方法:PUT
    选择特定的代理,需携带数据,格式为'{"name":"日本"}'
    也可以配置成不同的入口对于不同的出口代理

    listeners:
    - name: http-in-0
    type: http
    port: 10000
    proxy: PROXY_10000

    - name: http-in-1
    type: http
    port: 10001
    proxy: PROXY_10001

    每个 selenium 设置对应的 http 入口,还有需求可以通过 api 设置节点出口
    guoguobaba
        15
    guoguobaba  
    OP
       176 天前
    @huifukejian 目标是
    1. 可以动态的根据 url 选定是否使用代理

    2. 可以动态的从代理池选择代理

    3. 支持 https connect 而不是 mitm

    找了一圈,暂时还没有满足要求的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2588 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 03:26 · PVG 11:26 · LAX 19:26 · JFK 22:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.