问一个代理的实现

230 天前
 guoguobaba

想用 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 。

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

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

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

3. 支持 https connect 而不是 mitm

找了一圈,暂时还没有满足要求的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1038818

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX