selenium爬虫使用代理情况下不设置这几个参数,代理就白加了

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系列我会继续更新相关反反爬措施,敬请期待! 防止失联,关注微信公众号:码道工程。

本文作者:小码哥

本文链接:http://www.tnt0.com/archives/7

版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0许可协议。转载请注明出处!

直接对抗反爬?No!谈一谈数据采集前的思... <<
0 条评论

请先登陆注册

已登录,注销 取消