移除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中元类用法实例
Oct 10 Python
在Python中操作字符串之startswith()方法的使用
May 20 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
Jun 14 Python
Python中的is和==比较两个对象的两种方法
Sep 06 Python
python 实现数字字符串左侧补零的方法
Dec 04 Python
python实现简单flappy bird
Dec 24 Python
如何用C代码给Python写扩展库(Cython)
May 17 Python
python 整数越界问题详解
Jun 27 Python
python 微信好友特征数据分析及可视化
Jan 07 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
May 22 Python
Python通过队列来实现进程间通信的示例
Oct 14 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
Mar 03 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
PHP5中使用DOM控制XML实现代码
2010/05/07 PHP
PHP var_dump遍历对象属性的函数与应用代码
2010/06/04 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
2014/07/22 PHP
php通过执行CutyCapt命令实现网页截图的方法
2016/09/30 PHP
js中的escape及unescape函数的php实现代码
2007/09/04 Javascript
在线编辑器中换行与内容自动提取
2009/04/24 Javascript
jQuery实现点击标题输入详细信息
2013/04/16 Javascript
Jquery validation remote 验证的缓存问题解决方法
2014/03/25 Javascript
jQuery中insertAfter()方法用法实例
2015/01/08 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
2016/09/08 Javascript
JQuery和PHP结合实现动态进度条上传显示
2016/11/23 Javascript
Angular使用ng-messages与PHP进行表单数据验证
2016/12/28 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
JS中将多个逗号替换为一个逗号的实现代码
2017/06/23 Javascript
swiper 解决动态加载数据滑动失效的问题
2018/02/26 Javascript
javascript系统时间设置操作示例
2019/06/17 Javascript
使用typescript构建Vue应用的实现
2019/08/26 Javascript
微信小程序图片加载失败时替换为默认图片的方法
2019/12/09 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
2020/04/24 Javascript
前端开发基础javaScript的六大作用
2020/08/06 Javascript
Python的time模块中的常用方法整理
2015/06/18 Python
详解Python的Django框架中inclusion_tag的使用
2015/07/21 Python
Python爬取网页中的图片(搜狗图片)详解
2017/03/23 Python
Python正则表达式经典入门教程
2017/05/22 Python
详解python实现读取邮件数据并下载附件的实例
2017/08/03 Python
详细解读tornado协程(coroutine)原理
2018/01/15 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
python、Matlab求定积分的实现
2019/11/20 Python
在pytorch中对非叶节点的变量计算梯度实例
2020/01/10 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
Python如何使用ConfigParser读取配置文件
2020/11/12 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
opencv实现图像平移效果
2021/03/24 Python
低碳环保演讲稿
2014/08/28 职场文书
2015年财务试用期工作总结
2014/12/24 职场文书
Python anaconda安装库命令详解
2021/10/16 Python