移除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 相关文章推荐
Django实现自定义404,500页面教程
Mar 26 Python
python中关于for循环的碎碎念
Jun 30 Python
Python解决两个整数相除只得到整数部分的实例
Nov 10 Python
一文带你了解Python中的字符串是什么
Nov 20 Python
python调用动态链接库的基本过程详解
Jun 19 Python
python sorted函数的小练习及解答
Sep 18 Python
Python中的 ansible 动态Inventory 脚本
Jan 19 Python
Python for循环通过序列索引迭代过程解析
Feb 07 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
Apr 09 Python
Python实现自动打开电脑应用的示例代码
Apr 17 Python
详解Python 中的容器 collections
Aug 17 Python
Django数据库迁移常见使用方法
Nov 12 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中去除所有js,html,css代码
2010/10/12 PHP
php5.2以下版本无json_decode函数的解决方法
2014/05/25 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
2016/12/14 PHP
Jquery Autocomplete 结合asp.net使用要点
2010/10/29 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
jquery map方法使用示例
2014/04/23 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
Bootstrap3 图片(响应式图片&图片形状)
2017/01/04 Javascript
jQuery动态追加页面数据以及事件委托详解
2017/05/06 jQuery
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
vue单页应用在页面刷新时保留状态数据的方法
2018/09/21 Javascript
微信小程序实现点击图片放大预览
2019/10/21 Javascript
vue 全局环境切换问题
2019/10/27 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
[57:22]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第五场
2018/04/10 DOTA
使用python编写android截屏脚本双击运行即可
2014/07/21 Python
python中的函数用法入门教程
2014/09/02 Python
Python中基本的日期时间处理的学习教程
2015/10/16 Python
python实现读取并显示图片的两种方法
2017/01/13 Python
Python基于time模块求程序运行时间的方法
2017/09/18 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
彻底解决Python包下载慢问题
2020/11/15 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
eDreams澳大利亚:预订机票、酒店和度假产品
2017/04/19 全球购物
.NET remoting中对象激活的两种方式
2015/06/08 面试题
计算机应届毕业生自荐信范文
2014/02/23 职场文书
毕业班联欢会主持词
2014/03/27 职场文书
企业管理标语
2014/06/10 职场文书
表扬稿范文
2015/01/17 职场文书
自我检讨书范文
2015/01/28 职场文书
2015毕业实习推荐信
2015/03/23 职场文书
2016年党员公开承诺书范文
2016/03/24 职场文书