问一个代理的实现 - V2EX
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 2024-05-08 16:45:48 +08:00 2884 次点击
    这是一个创建于 524 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    如果不想自己弄,gost 有隧道代理,不过想自定义转发策略还是得自己折腾。你这直接说实现看的人迷糊,能直接说需求么
    dotudeth
        9
    dotudeth  
       2024-05-08 18:13:02 +08:00
    v2fly 有多负载模式。
    NoOneNoBody
        10
    NoOneNoBody  
       2024-05-08 18:48:25 +08:00
    中间代理不需要加密,原文送过去就是了,http 足够,加密的事浏览器已经做了
    况且爬虫保密的是人身安全(ip 指纹之类),数据安全不需要理会吧
    guoguobaba
        11
    guoguobaba  
    OP
       2024-05-08 20:19:29 +08:00
    @ClericPy 就是找个代理,能够通过接口的方式动态修改 upstream proxy ,并且能支持 https 的 connect
    guoguobaba
        12
    guoguobaba  
    OP
       2024-05-08 20:45:21 +08:00
    @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  
       2024-05-08 20:46:23 +08:00
    你的需求在 linux 上大概率用 shell/iptables/socat 就可以实现了。
    huifukejian
        14
    huifukejian  
       2024-05-15 16:36:24 +08:00
    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
       2024-06-07 11:40:08 +08:00
    @huifukejian 目标是
    1. 可以动态的根据 url 选定是否使用代理

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

    3. 支持 https connect 而不是 mitm

    找了一圈,暂时还没有满足要求的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4305 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 10:13 PVG 18:13 LAX 03:13 JFK 06:13
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86