移除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 相关文章推荐
wxpython中自定义事件的实现与使用方法分析
Jul 21 Python
python 捕获 shell/bash 脚本的输出结果实例
Jan 04 Python
Python使用pyh生成HTML文档的方法示例
Mar 10 Python
使用django-guardian实现django-admin的行级权限控制的方法
Oct 30 Python
检测python爬虫时是否代理ip伪装成功的方法
Jul 12 Python
Python实现发票自动校核微信机器人的方法
May 22 Python
Python如何给函数库增加日志功能
Aug 04 Python
Restful_framework视图组件代码实例解析
Nov 17 Python
python中numpy.empty()函数实例讲解
Feb 05 Python
基于Python的EasyGUI学习实践
May 07 Python
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
Apr 14 Python
python实现一个简单的贪吃蛇游戏附代码
Jun 28 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
10条PHP编程习惯助你找工作
2008/09/29 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
php去除头尾空格的2种方法
2015/03/16 PHP
php实现Mongodb自定义方式生成自增ID的方法
2015/03/23 PHP
php 使用curl模拟登录人人(校内)网的简单实例
2016/06/06 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
PHP常见数组排序方法小结
2018/08/20 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
JavaScript 设计模式学习 Singleton
2009/07/27 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
使用Java实现简单的server/client回显功能的方法介绍
2013/05/03 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
JQuery实现带排序功能的权限选择实例
2015/05/18 Javascript
javascript的BOM汇总
2015/07/16 Javascript
javascript倒计时效果实现
2015/11/12 Javascript
jQuery pjax 应用简单示例
2018/09/20 jQuery
element-ui多文件上传的实现示例
2019/04/10 Javascript
基于Vue实现的多条件筛选功能的详解(类似京东和淘宝功能)
2019/05/07 Javascript
jQuery实现的点击显示隐藏下拉菜单功能完整示例
2019/05/17 jQuery
Python模拟百度登录实例详解
2016/01/20 Python
Python提取网页中超链接的方法
2016/09/18 Python
python编辑用户登入界面的实现代码
2018/07/16 Python
Python实现堡垒机模式下远程命令执行操作示例
2019/05/09 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
2019/09/10 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
深入浅析HTML5中的SVG
2015/11/27 HTML / CSS
美国孕妇装品牌:Destination Maternity
2018/02/04 全球购物
ASP.NET中的身份验证有那些
2012/07/13 面试题
Can a struct inherit from another class? (结构体能继承类吗)
2014/07/22 面试题
土木工程毕业生推荐信
2013/10/28 职场文书
个人欠款担保书
2014/05/20 职场文书
植树造林的宣传标语
2014/06/23 职场文书
置业顾问岗位职责
2015/02/09 职场文书
早上好问候语大全
2015/11/10 职场文书
导游词之重庆渣滓洞
2020/01/08 职场文书
springboot读取resources下文件的方式详解
2022/06/21 Java/Android