chrome类浏览器、web.view动态更换代理IP的两种方式(纯讨论)
问题背景:想实现一个打开换IP,清缓存、清cookie的浏览器,使用CDP控制浏览器,新建全新浏览器(设置userdir为一个新目录)时,加载非常慢,且非常耗CPU,就像这样:
,于是转换思路,缓存和cookie可以通过CDP清除,但是换IP就非常头痛了,网上最好的方式是使用插件,但是插件与程序通讯也不方便。以下是我目前使用的两种方法:
首先,需要了解设置代理IP的方式,在命令行增加参数 --proxy-server=127.0.0.1:8081,chrome类浏览器还支持--proxy-server=pac链接,注意:edge及web.view支持--proxy-pac-url=pac链接,与chrome参数不一样
1、本地搭建一个转发器,将浏览器的代理IP设置为固定的IP,如:127.0.0.1:8081,通过转发器将请求转发到不同的代理IP,参考代码:https://www.chengxu.xyz/t/508
2、第二种方式就是在pac链接上做文章,我们想办法让浏览器去及时的重新加载pac链接。在浏览器内部链接chrome://net-internals/#proxy中,有一个Re-apply settings按钮,可以让浏览器重新加载pac文件,如图:
,跟踪代码,是调用chrome.send('reloadProxySettings');此步有两点注意事项:
1、经验证,其它非chrome内部页面,chrome没有send函数。
2、此代码必须在此页面调用,浏览器才会重新加载pac,其它chrome内部页面调用后不触发浏览器动作。
接下来就好处理了,只需要使用CDP在此页面调用chrome.send('reloadProxySettings')就行了,以下是简略代码,下次上传完整代码:
ws.Network.enable(); ws.Runtime.enable(); ws.Network.clearBrowserCookies() //清cookie ws.Network.clearBrowserCache() //清缓存 //重新加载pac ws.Runtime.evaluate( expression = `chrome.send('reloadProxySettings');`; returnByValue = true; )
当然,我们还需要做一个动态的pac链接,随时返回最新的代理IP
登录后方可回帖
你需要一个代理池中间件吧,像文中的方案一,github上有很多
https://github.com/search?q=%E4%BB%A3%E7%90%86