专栏首页python前行者一行js代码识别Selenium+Webdriver

一行js代码识别Selenium+Webdriver

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

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

我们来看一个例子。

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

from selenium.webdriver import Chrome
driver = 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}});
 js = r"Object.defineProperty(navigator, 'webdriver', {get: () => undefined,});"                           
self.driver.execute_script(js)   

运行效果如下图所示:

确实修改成功了。这种写法就万无一失了吗?并不是这样的,如果此时你在模拟浏览器中通过点击链接、输入网址进入另一个页面,或者开启新的窗口,你会发现,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 ChromeOptions 

option = 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 直接登录知乎,会弹出验证码;先使用本文的方法再登录知乎,能够成功伪装成真实的浏览器,不会弹出验证码。

实际上,Selenium + Webdriver能被识别的特征不止这一个。

参考:https://blog.csdn.net/weixin_33816821/article/details/88590077

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [748]linux下sqlite3可视化工具

    1.介绍:sqlite3是linux上的小巧的数据库,一个文件就是一个数据库。 2.安装: 要安装sqlite3,可以在终端提示符后运行下列命令:

    周小董
  • webcron

    一个定时任务管理器,基于Go语言和beego框架开发。用于统一管理项目中的定时任务,提供可视化配置界面、执行日志记录、邮件通知等功能,无需依赖*unix下的cr...

    周小董
  • python3和python2中的filter区别

    python3中的filter与python2中的是不一样的 其中,在python2中

    周小董
  • Android浏览器跨域数据窃取和Intent Scheme攻击

    我们接下来要介绍的这个漏洞,其影响了Android版本4.4以下的自带浏览器和一些其他特定的Android浏览器,它允许黑客读取sqlite格式的cookie数...

    FB客服
  • memcached缓存知识简单梳理

    memcached工作原理 基本概念:slab,page,chunk。 slab,是一个逻辑概念。它是在启动memcached实例的时候预处理好的,每个slab...

    洗尽了浮华
  • 如果你想写自己的Benchmark框架

    使用过JMH的同学一定会惊叹它的神奇。JMH作为一个优秀的Benchmark框架带给了我们无数的欢乐。作为一个有极客精神的程序员,那么有没有想过去自己实现一个B...

    程序那些事
  • 抖音超火的旋转时间轮盘,电脑Mac手机安排

    昨天分享的时间轮盘有很多小伙伴还是带有疑问,来统一回答下。抖音超火的旋转时间轮盘,时间都去哪儿了?不想看解答可以往下翻翻有电脑版的时间轮盘教程给安排上了,还附上...

    IT小侠公社
  • python爬虫-简单使用xpath下载

      值的注意的是:在爬取接口时,要仔细看看 ,当时用的谷歌浏览器  当然也可以借用工具 EditPlus 这个比较好使,看个人喜好吧 用浏览器或Ediutplu...

    py3study
  • 动态规划——用二进制表示集合的状态压缩DP

    今天文章的内容是动态规划当中非常常见的一个分支——状态压缩动态规划,很多人对于状态压缩畏惧如虎,但其实并没有那么难,希望我今天的文章能带你们学到这个经典的应用。

    TechFlow-承志
  • Cloud Studio 2.0 正式上线

    今日,CODING 创始人兼 CEO 张海龙受邀出席由极客邦科技和 InfoQ 中国 主办的顶级技术盛会 GMTC ,并在大会开幕时做了主题分享,向大家隆重推出...

    CODING研发管理系统

扫码关注云+社区

领取腾讯云代金券