移除Selenium中window.navigator.webdriver值


Posted in Python onJune 10, 2022

有不少朋友在开发爬虫的过程中喜欢使用Selenium + Chromedriver,以为这样就能做到不被网站的反爬虫机制发现。

先不说淘宝这种基于用户行为的反爬虫策略,仅仅是一个普通的小网站,使用一行Javascript代码,就能轻轻松松识别你是否使用了Selenium + Chromedriver模拟浏览器。

我们来看一个例子。

使用下面这一段代码启动Chrome窗口:

现在,在这个窗口中打开开发者工具,并定位到Console选项卡,如下图所示。

from selenium.webdriver import Chrome
driver = Chrome()

移除Selenium中window.navigator.webdriver值


现在,在这个窗口输入如下的js代码并按下回车键:

window.navigator.webdriver

可以看到,开发者工具返回了 true。如下图所示。

移除Selenium中window.navigator.webdriver值

但是,如果你打开一个普通的Chrome窗口,执行相同的命令,可以发现这行代码的返回值为 undefined,如下图所示:

移除Selenium中window.navigator.webdriver值

所以,如果网站通过js代码获取这个参数,返回值为 undefined说明是正常的浏览器,返回 true说明用的是Selenium模拟浏览器。一抓一个准。这里给出一个检测Selenium的js代码例子:

webdriver = window.navigator.webdriver;
if(webdriver){
    console.log('你这个小可爱你以为使用Selenium模拟浏览器就可以了?')
} else {
    console.log('正常浏览器')
}

网站只要在页面加载的时候运行这个js代码,就可以识别访问者是不是用的Selenium模拟浏览器。如果是,就禁止访问或者触发其他反爬虫的机制。

那么对于这种情况,在爬虫开发的过程中如何防止这个参数告诉网站你在模拟浏览器呢?

可能有一些会js的朋友觉得可以通过覆盖这个参数从而隐藏自己,但实际上这个值是不能被覆盖的:

移除Selenium中window.navigator.webdriver值

对js更精通的朋友,可能会使用下面这一段代码来实现:

Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});

运行效果如下图所示:

移除Selenium中window.navigator.webdriver值

确实修改成功了。这种写法就万无一失了吗?并不是这样的,如果此时你在模拟浏览器中通过点击链接、输入网址进入另一个页面,或者开启新的窗口,你会发现, window.navigator.webdriver又变成了 true。

如下图所示。

移除Selenium中window.navigator.webdriver值

那么是不是可以在每一个页面都打开以后,再次通过webdriver执行上面的js代码,从而实现在每个页面都把 window.navigator.webdriver设置为 undefined呢?也不行。

因为当你执行: driver.get(网址)的时候,浏览器会打开网站,加载页面并运行网站自带的js代码。

所以在你重设 window.navigator.webdriver之前,实际上网站早就已经知道你是模拟浏览器了。

接下来,又有朋友提出,可以通过编写Chrome插件来解决这个问题,让插件里面的js代码在网站自带的所有js代码之前执行。

这样做当然可以,不过有更简单的办法,只需要设置Chromedriver的启动参数即可解决问题。

在启动Chromedriver之前,为Chrome开启实验性功能参数 excludeSwitches,它的值为 [‘enable-automation’],

完整代码如下:

from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option)

此时启动的Chrome窗口,在右上角会弹出一个提示,不用管它,不要点击 停用按钮。

再次在开发者工具的Console选项卡中查询 window.navigator.webdriver,可以发现这个值已经自动变成 undefined了。并且无论你打开新的网页,开启新的窗口还是点击链接进入其他页面,都不会让它变成 true。运行效果如下图所示。

移除Selenium中window.navigator.webdriver值

以上就是移除Selenium中window.navigator.webdriver值的详细内容,更多关于window.navigator.webdriver值移除的资料请关注三水点靠木其它相关文章!


Tags in this post...

Python 相关文章推荐
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
Apr 08 Python
对python判断是否回文数的实例详解
Feb 08 Python
python3 property装饰器实现原理与用法示例
May 15 Python
python字符串和常用数据结构知识总结
May 21 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
Aug 12 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
Jun 02 Python
Python while true实现爬虫定时任务
Jun 08 Python
python根据字典的键来删除元素的方法
Aug 16 Python
termux中matplotlib无法显示中文问题的解决方法
Jan 11 Python
Python基础之元类详解
Apr 29 Python
pycharm部署django项目到云服务器的详细流程
Jun 29 Python
python中pycryto实现数据加密
Apr 29 Python
Django框架模板用法详解
Jun 10 #Python
python库Tsmoothie模块数据平滑化异常点抓取
使用Django框架创建项目
Jun 10 #Python
Python实现信息管理系统
Jun 05 #Python
python实现学员管理系统(面向对象版)
Jun 05 #Python
python实现学生信息管理系统(面向对象)
Jun 05 #Python
Python使用pyecharts控件绘制图表
Jun 05 #Python
You might like
无线电的诞生过程
2021/03/01 无线电
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
2008/11/18 PHP
php类中private属性继承问题分析
2012/11/01 PHP
关于php内存不够用的快速解决方法
2013/10/26 PHP
PHP实现带重试功能的curl连接示例
2016/07/28 PHP
php unicode编码和字符串互转的方法
2020/08/12 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
nodejs实用示例 缩址还原
2010/12/28 NodeJs
JS仿flash上传头像效果实现代码
2011/07/18 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
大型JavaScript应用程序架构设计模式
2016/06/29 Javascript
详解vue slot插槽的使用方法
2017/06/13 Javascript
JavaScript中各数制转换全面总结
2017/08/21 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
angularJS的radio实现单项二选一的使用方法
2018/02/28 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
layui radio单选限制下一个radio单选的实例
2019/09/03 Javascript
关于layui表单中按钮自动提交的解决方法
2019/09/09 Javascript
vue多个元素的样式选择器问题
2019/11/29 Javascript
JavaScript实现串行请求的示例代码
2020/09/14 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
[04:20]DOTA2-DPC中国联赛 正赛 VG vs LBZS 选手采访 1月19日
2021/03/11 DOTA
在Python中使用模块的教程
2015/04/27 Python
Python简单获取二维数组行列数的方法示例
2018/12/21 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
Django1.11配合uni-app发起微信支付的实现
2019/10/12 Python
节日快乐! Python画一棵圣诞树送给你
2019/12/24 Python
台湾深度自由行旅游平台:Tripbaa趣吧
2017/10/10 全球购物
美国宠物用品网站:Value Pet Supplies
2018/03/17 全球购物
比驿:全球酒店比价网
2018/06/20 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
欢迎标语大全
2014/06/21 职场文书
机关驾驶员违规检讨书
2014/09/13 职场文书
python编程实现清理微信重复缓存文件
2021/11/01 Python
MySQL表类型 存储引擎 的选择
2021/11/11 MySQL