guoguobaba
V2EX  ›  Python

问一个代理的实现

By guoguobaba at 2024 年 5 月 8 日 · 5717 次点击

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

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

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

3. 支持 https connect 而不是 mitm

找了一圈,暂时还没有满足要求的。
推荐学习书目
› 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
© 2026 V2EX · 37ms · 3.9.8.5