1、背景
经常有使用selenium的同学在访问网页的过程中发现,程序跑着跑着就被服务器给ban了。
当然对于一般情况下,咱们加个代理继续跑,没毛病。
然后跑着跑着又被封了。
纳尼?开始灵魂发问:
- 是浏览器里关于webdriver的痕迹没有清除?
- 是因为canvas指纹识别真实用户?
- 还是时区和地理位置不一致?
- 其他等等...
今天我们来说另外一种可能,就是其实你加上了代理也等于白加了 因为网页使用了一种叫WebRTC的技术识别出了你本地电脑真实IP
2 什么是WebRTC?
参考维基百科解释webrtc:
我翻译一下: - 说人话就是说浏览器内置了一些API接口,这些API可以用来方便一些网站进行实时通信类的功能开发,比如语音、视频等流媒体网站 - 既然是浏览器接口,网站前端js代码可以直接调用这些浏览器接口,具体js接口大家可以去搜索 - 使用webrtc技术的网站js调用浏览器接口是绕过浏览器代理直接与webrtc服务器建立tcp或者udp连接,我们都知道tcp或者udp肯定是知道通信对方的ip的,这样一来服务器就知道了客户端的真实ip
- 有些不是语言或视频的网站,也使用这项技术从而悄悄的知道客户真实的ip,比如某些广告网站,当然它可以用在反爬上面来
当前支持的浏览器情况:
不看不知道,一看吓一跳,市面上主流的浏览器都支持。
即使科学上网,因为WebRTC也会存在真实ip泄露的情况,所以各位科学上网的同学们也得注意了。
3、解决方案
那么回到最开始的问题,我该怎么做才能关闭浏览器WebRTC避免被一些网站违规收集我的真实ip来达到不可告人的目的?
瓜子板凳准备好,解决方案如下:
- 普通用户
- 贵宾用户..咳咳,跑题了,是selenium用户 在普通解决方案里wiki推荐的Chrome的还只能用插件方式对WebRTC进行关闭 咱们直接大刑……不对,代码伺候(代码都以Chrome为例): 插一句:
我们测试WebRTC是否成功,可以通过访问:https://browserleaks.com/ip
1.1、python版本加上代理(不关闭webrtc)
- 代码
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option(
"excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_argument('lang=zh-CN,zh,zh-TW,en-US,en')
chrome_options.add_argument(
'user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36')
chrome_options.add_argument("proxy-server=socks5://127.0.0.1:1080")
driver = webdriver.Chrome(
"./chromedriver", chrome_options=chrome_options)
driver.get("https://browserleaks.com/ip")
- 测试结果:
可以看到,我们代理ip是美国的以104.224开头的ip,但是WebRTC测试出来我们真实的公共出口ip为110.184开头的中国ip
1.2、python版本加上代理(关闭webrtc)
- 代码
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option(
"excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_argument('lang=zh-CN,zh,zh-TW,en-US,en')
chrome_options.add_argument(
'user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36')
chrome_options.add_argument("proxy-server=socks5://127.0.0.1:1080")
preferences = {
"webrtc.ip_handling_policy": "disable_non_proxied_udp",
"webrtc.multiple_routes_enabled": False,
"webrtc.nonproxied_udp_enabled": False
}
chrome_options.add_experimental_option("prefs", preferences)
driver = webdriver.Chrome(
"./chromedriver", chrome_options=chrome_options)
driver.get("https://browserleaks.com/ip")
- 测试结果:
可以看到,只检测到了我们的代理ip,未检测到我们的真实ip。
4、结论
以上代码均在本机测试通过,测试环境: - 操作系统:MacOS Mojave 10.14.4 - Python版本:Python 3.7.3 - Chrome版本:86.0.4240.111
大家可以看到,咱们在测试中访问的网站不止可以测试WebRTC还包含其他的比如canvas指纹等,反爬手段与日俱增,反反爬手段也日新月异,后续的selenium系列我会继续更新相关反反爬措施,敬请期待! 防止失联,关注微信公众号:码道工程。
请先登陆 或 注册