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

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

我们来看一个例子。

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

from selenium.webdriver import Chromedriver = Chrome()

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

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

window.navigator.webdriver

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

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

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

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

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

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

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

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

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

运行效果如下图所示:

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

那么是不是可以在每一个页面都打开以后,再次通过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 ChromeOptionsoption = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation']) driver = Chrome(options=option)

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

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

截至2019年02月12日20:46分,本文所讲的方法可以用来登录知乎。如果使用 Selenium 直接登录知乎,会弹出验证码;先使用本文的方法再登录知乎,能够成功伪装成真实的浏览器,不会弹出验证码。

一行js代码识别Selenium+Webdriver及其应对方案 1相关推荐

  1. 一行js代码识别Selenium+Webdriver及其应对方案

    有不少朋友在开发爬虫的过程中喜欢使用Selenium + Chromedriver,以为这样就能做到不被网站的反爬虫机制发现. 先不说淘宝这种基于用户行为的反爬虫策略,仅仅是一个普通的小网站,使用一行 ...

  2. 从敲下一行JS代码到这行代码被执行,中间发生了什么?

    前言 我们每天都在写JS,你是否想过,计算机是怎么识别你的这一行代码,并且执行相应指令?本篇文章为你讲述从敲下一行JS代码到这行代码可以被执行算出正确的结果,都经历了什么. 编译 学过计算器基础的,即 ...

  3. vue项目 一行js代码搞定点击图片放大缩小

    一行js代码搞定xue项目需要点击图片放大缩小,其实主要用的是用到了vue:class的动态切换,内容比较简单.一开始我把维护的需求想得太复杂了,和测试小姐姐聊了一下才反应过来. 两个月不到跟了四个项 ...

  4. 如何在浏览器上跑深度学习模型?并且一行JS代码都不用写

    翻译 | 林椿眄 编辑 | 周翔 2017 年 8 月,华盛顿大学的陈天奇团队发布了 TVM,和 NNVM 一起组成深度学习到各种硬件的完整优化工具链,支持手机.CUDA.OpenCL.Metal.J ...

  5. sts 的js代码不变色_[黑科技] 使用 Laravel Livewire 来构建实时搜索功能(不使用一行 JS 代码)...

    原文链接:https://learnku.com/laravel/t/40775 讨论请前往专业的 Laravel 开发者论坛:https://learnku.com/Laravel 最终结果-完全交 ...

  6. 一行js代码破解百某Du云大文件下载限制

    转自 http://blog.jarjar.cn/one-line-js-crack-baidu-yun/ 最近做了一个直接在下载百某Du云大文件,而不用启动百某Du云客户端的chrome插件,插件核 ...

  7. 一行js代码破解百度云大文件下载限制

    文章转载于链接:http://blog.jarjar.cn/one-line-js-crack-baidu-yun/ 最近发现了一个能直接在下载百度云大文件的时候,而不用启动百度云客户端的chrome ...

  8. 程序员们注意了,警惕JS代码复制陷阱

    程序员们在日常的编程工作中,难免会在网上查找资料.复制一些现成代码使用. 这是很习惯性的操作,但有危险隐含其中,需要提高警惕. 比如,看看下面的操作是不是很神奇: 如上所示,复制了一行JS代码,但粘贴 ...

  9. 在谷歌浏览器中调试js代码

    用谷歌浏览器打开待调试界面,然后鼠标右键,选择检查 浏览器会出现以下界面,选择sources,并选择左侧文件夹中该页面的文件(此时开发页面会分为三栏,最左侧是页面文件,中间是源代码,最右侧是调试窗口栏 ...

最新文章

  1. sklearn中的RandomForestClassifier参数详解
  2. 赠书 | 2021年中国数字政府发展指数排名出炉!你的家乡名列第几?
  3. STM32串口中断接收方式详细比较
  4. 通过案例对 spark streaming 透彻理解三板斧之一: spark streaming 另类实验
  5. Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】...
  6. 【网址收藏】Spark History Server配置及使用
  7. 【CodeForces - 219D 】Choosing Capital for Treeland (树形dp)
  8. oracle linux 图形化,Linux7图形化安装Oracle11g教程,亲测实用有效!
  9. php自动打印小票_php操作 cookie
  10. C#GDI绘制自定义字体
  11. 论文笔记_S2D.45_ORBSLAM-Atlas: 一个稳健和精确的多建图系统
  12. 如何快速学从零开始学习3d建模?
  13. 关于《微习惯》的记录
  14. 小码哥C++_反汇编分析
  15. 20135337朱荟潼 Linux第二周学习总结——操作系统是如何工作的
  16. 饿了么联盟在哪里申请物料
  17. PostgreSQL数据库统计信息——analyze执行函数
  18. MUSIQ: Multi-scale Image Quality Transformer【图像质量评估】
  19. Win10 出现“该文件没有与之关联的程序来执行该操作”解决方法
  20. 用最精炼语言介绍OpenStack网络代码演进的前世今生

热门文章

  1. OpenCV油画效果
  2. OpenCV用代码解释单应性的基本概念
  3. C语言实现方差variance计算(附完整源码)
  4. C语言与C++的区别,从7个角度来区分C语言与C++
  5. 如何找到设备的guid_如何禁止win10自动更新显卡驱动
  6. cmake 指定编译器_我们需要懂得CMake文件
  7. python rpc框架-python使用rpc框架gRPC的方法
  8. lambada表达式
  9. 使用EasyUI Tree异步加载JSON数据 生成树
  10. Oracle实例和服务知识点