想用 selenium 做一个爬虫,为了绕开访问限制,使用 ip 池。同时为了效率,selenium 的 chrome instance 打算复用,所以基本的架构是
graph LR
selenium-->mitmproxy-->proxypool-->webserver
mitmproxy 会拦截 request 请求,当请求 url 满足条件时,将上游的代理设置从 proxypool 里取得的代理。当代理失效的时候,调用 proxypool refresh 就可以用了。
selenium 设置代理为 mitmproxy 所对应的地址,这样就不需要每次访问的时候重新打开一个 chrome instance 。
有几个问题没有办法实现
或者还有其他的代理软件可以支持动态的修改 upstream server 。
1
dotudeth 224 天前
v2fly 可以根据域名分流。我们项目基于 v2fly 改了一下可以在同一个目标网站按网站的账号进行分流。
|
2
guoguobaba OP @dotudeth 这个没法用动态的代理池以及编程实现啊
|
3
chrawsl 224 天前
感觉可以接一下 v2fly 的 api ,自动更新出口 ip
|
4
retanoj 224 天前
为何要在中间接入 mitmproxy ?
|
5
teaegglove 224 天前 via Android
之前用 Go 实现了一个一模一样的,mitmproxy 那里支持编程修改 request response 还支持 basic auth 。有偿的话联系 v : d2hzYW45MTM=
|
6
zeusho871 224 天前
mitmproxy 好像 ja3 会被检测
|
7
teaegglove 224 天前 via Android
@zeusho871 确实,但可以通过编程改 ja3
|
8
ClericPy 224 天前
隧道代理吗?在公司里用 Asyncio 手撸了一个(因为也有自定义条件策略,如域名负载均衡,检验代理连通性可用性以及淘汰策略)
如果不想自己弄,gost 有隧道代理,不过想自定义转发策略还是得自己折腾。你这直接说实现看的人迷糊,能直接说需求么 |
9
dotudeth 224 天前
v2fly 有多负载模式。
|
10
NoOneNoBody 224 天前
中间代理不需要加密,原文送过去就是了,http 足够,加密的事浏览器已经做了
况且爬虫保密的是人身安全(ip 指纹之类),数据安全不需要理会吧 |
11
guoguobaba OP @ClericPy 就是找个代理,能够通过接口的方式动态修改 upstream proxy ,并且能支持 https 的 connect
|
12
guoguobaba OP @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 - ``` |
13
pagxir 224 天前
你的需求在 linux 上大概率用 shell/iptables/socat 就可以实现了。
|
14
huifukejian 217 天前
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 设置节点出口 |
15
guoguobaba OP |