有不少朋友在开发爬虫的过程中喜欢使用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。运行效果如下图所示。

本文转载自:https://www.kingname.info/2019/02/12/hide-webdriver/

转载于:https://www.cnblogs.com/chenyibai/p/10610127.html

服务端如何识别是selenium在访问以及解决方案参考二相关推荐

  1. 服务端如何识别是selenium在访问以及解决方案参考一

    使用selenium模拟浏览器进行数据抓取无疑是当下最通用的数据采集方案,它通吃各种数据加载方式,能够绕过客户JS加密,绕过爬虫检测,绕过签名机制.它的应用,使得许多网站的反采集策略形同虚设.由于se ...

  2. java cxf服务端_webservice概述及cxf在Java开发中应用(二) 简单搭建cxf服务端

    首先我们下载cxf的jar包,我这里下载的是apache-cxf-3.0.4这个版本,目前最新的. Eclipse里面新建一个Java project,在工程中引入需要的jar: 这些包里面包含了je ...

  3. CAS 5.1.x 的搭建和使用(四)—— 配置使用HTTP协议访问的服务端

    CAS单点登录系列: CAS 5.1.x 的搭建和使用(一)-- 通过Overlay搭建服务端CAS 5.1.x 的搭建和使用(二)-- 通过Overlay搭建服务端-其它配置说明CAS 5.1.x ...

  4. 魔坊APP项目-15-邀请好友(业务逻辑流程图、服务端提供邀请好友的二维码生成接口、客户端通过第三方识别微信二维码,服务端提供接口允许访问、App配置私有协议,允许第三方应用通过私有协议,唤醒APP)

    邀请好友 1.业务逻辑流程图 客户端提供点击"邀请好友"以后的页面frame,html/invite.html,代码: <!DOCTYPE html> <html ...

  5. 大淘宝服务端技术干货沉淀和总结

    网络基础 TCP三次握手 三次握手过程 客户端--发送带有SYN标志的数据包--服务端 一次握手 Client进入syn_sent状态 服务端--发送带有SYN/ACK标志的数据包--客户端 二次握手 ...

  6. react ssr 服务端渲染入门

    react ssr 服务端渲染入门 前言 前后端同构,作为针对单页应用 SEO 优化乏力.首屏速度瓶颈等问题而产出的解决方案,近来在 react.vue 等前端技术栈中都得到了支持.当我们正打算抛弃传 ...

  7. 服务端负载均衡和客户端负载均衡

    服务端负载均衡 用户在App访问通过80端口请求nginx,ngin来实现负载均衡,分发请求 客户端负载均衡 Eureka Server注册中心集群部署,goods_services服务提供者启动后向 ...

  8. 如何在 MacOS 环境下搭建 SVN 服务端环境

    文章目录 在服务端创建资源仓库 资源仓库访问权限配置 给资源仓库添加用户 配置用户组及用户的权限 启动 SVN 服务器 停止 SVN 服务器 SVN 是一个使用十分广泛的开放源代码的版本控制系统.在 ...

  9. skywalking服务端_skywalking部署

    文件列表 apache-skywalking-apm-7.0.0.tar.gz:服务端文件 mysql-connector-java-5.1.30.jar:mysql jdbc驱动jar包 需要条件 ...

最新文章

  1. perl Encode模块的使用
  2. QT的QDateTimeAxis类的使用
  3. 大数据ab 测试_在真实数据上进行AB测试应用程序
  4. hdu4554 A Famous Game 概率期望
  5. 数据结构之树:树的介绍——9
  6. 苏炳添:发C刊与拿冠军相比,哪个更难?
  7. Matplotlib笔记(1)——文字、绘图、背景(颜色对照表)
  8. C# 获取文件名及扩展名【转】
  9. 渗透测试漏流程(PTES)
  10. 开源Java(JSP) CMS系统源码推荐
  11. oracle form视频,深入浅出Oracle 之Form开发
  12. php 字符查询_php中几个常用的字符串查找函数
  13. 采购工作的基本内容和注意事项
  14. unity退出,从新开始,暂停
  15. 【dubbo系列001】dubbo是什么?dubbo解决什么问题?
  16. 求两圆相交的交点的方法
  17. k8s Nodeport方式下service访问,iptables处理逻辑(转)
  18. 手柄映射键盘_创新设计的多模手柄,北通宙斯T6精英机械游戏手柄体验点评
  19. java hgetall_redis调用 hgetAll方法报错,望迅速解决啊急急急
  20. 艾永亮:以超级产品战略的角度,写一份竞品分析

热门文章

  1. windows7下java配置环境
  2. hdu 4587 2013南京邀请赛B题/ / 求割点后连通分量数变形。
  3. 关于Linux静态库和动态库的分析
  4. 矩阵奇异值分解特征值分解_推荐系统中的奇异值分解与矩阵分解
  5. 代码注释//_您应该停止编写//的五个代码注释,并且//应该开始的一个注释
  6. 自动售货机编程_Rosmaro中基于视觉自动机的编程简介
  7. dhcp动态主机配置协议
  8. mysql回表_到底什么情况下mysql innodb会发生回表操作?
  9. java登陆界面连接数据库_java 登陆界面怎么写,连接数据库后
  10. centos 7.2 yum mysql_20191209_Centos7.2使用yum安装mysql