移除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简单实现获取当前时间
Aug 27 Python
Python 多线程的实例详解
Sep 07 Python
Python 实现选择排序的算法步骤
Apr 22 Python
对Python模块导入时全局变量__all__的作用详解
Jan 11 Python
详解python数据结构和算法
Apr 18 Python
详解Python下载图片并保存本地的两种方式
May 15 Python
将python文件打包成EXE应用程序的方法
May 22 Python
Python爬虫 urllib2的使用方法详解
Sep 23 Python
Python函数生成器原理及使用详解
Mar 12 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 Python
Python Socketserver实现FTP文件上传下载代码实例
Mar 27 Python
使用TensorBoard进行超参数优化的实现
Jul 06 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
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
2014/09/23 PHP
List Information About the Binary Files Used by an Application
2007/06/11 Javascript
比较简单的一个符合web标准的JS调用flash方法
2007/11/29 Javascript
密码框显示提示文字jquery示例
2013/08/29 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
js onload处理html页面加载之后的事件
2013/10/30 Javascript
JavaScript怎么判断图片是否加载完成以便获取其尺寸
2014/05/08 Javascript
使用nodejs开发cli项目实例
2015/06/03 NodeJs
跟我学习javascript的Date对象
2015/11/19 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
2016/12/02 Javascript
jQuery实现两列等高并自适应高度
2016/12/22 Javascript
一个简易的js图片轮播效果
2017/07/22 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
Angular2进阶之如何避免Dom误区
2018/04/02 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
微信小程序使用自定义组件导航实现当前页面高亮
2020/01/02 Javascript
vue开发中遇到的问题总结
2020/04/07 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
python实现事件驱动
2018/11/21 Python
Python实现打砖块小游戏代码实例
2019/05/18 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
python调用win32接口进行截图的示例
2020/11/11 Python
Clarks英国官方网站:全球领军鞋履品牌
2016/11/26 全球购物
体验完美剃须:The Art of Shaving
2018/08/06 全球购物
办理生育手续介绍信
2014/01/14 职场文书
2014年元旦促销活动方案
2014/02/22 职场文书
文化活动实施方案
2014/03/28 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
大学辅导员述职报告
2015/01/10 职场文书
邀请书格式范文
2015/02/02 职场文书
Jackson 反序列化时实现大小写不敏感设置
2021/06/29 Java/Android
Java 轮询锁使用时遇到问题
2022/05/11 Java/Android
CSS中使用grid布局实现一套模板多种布局
2022/07/15 HTML / CSS