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