服务端如何识别是selenium在访问以及解决方案参考一
使用selenium模拟浏览器进行数据抓取无疑是当下最通用的数据采集方案,它通吃各种数据加载方式,能够绕过客户JS加密,绕过爬虫检测,绕过签名机制。它的应用,使得许多网站的反采集策略形同虚设。由于selenium不会在HTTP请求数据中留下指纹,因此无法被网站直接识别和拦截。
这是不是就意味着selenium真的就无法被网站屏蔽了呢?非也。selenium在运行的时候会暴露出一些预定义的Javascript变量(特征字符串),例如"window.navigator.webdriver",在非selenium环境下其值为undefined,而在selenium环境下,其值为true(如下图所示为selenium驱动下Chrome控制台打印出的值)。
除此之外,还有一些其它的标志性字符串(不同的浏览器可能会有所不同),常见的特征串如下所示:
- webdriver
- __driver_evaluate
- __webdriver_evaluate
- __selenium_evaluate
- __fxdriver_evaluate
- __driver_unwrapped
- __webdriver_unwrapped
- __selenium_unwrapped
- __fxdriver_unwrapped
- _Selenium_IDE_Recorder
- _selenium
- calledSelenium
- _WEBDRIVER_ELEM_CACHE
- ChromeDriverw
- driver-evaluate
- webdriver-evaluate
- selenium-evaluate
- webdriverCommand
- webdriver-evaluate-response
- __webdriverFunc
- __webdriver_script_fn
- __$webdriverAsyncExecutor
- __lastWatirAlert
- __lastWatirConfirm
- __lastWatirPrompt
- $chrome_asyncScriptInfo
- $cdc_asdjflasutopfhvcZLmcfl_
了解了这个特点之后,就可以在浏览器客户端JS中通过检测这些特征串来判断当前是否使用了selenium,并将检测结果附加到后续请求之中,这样服务端就能识别并拦截后续的请求。
下面讲一个具体的例子。
鲲之鹏的技术人员近期就发现了一个能够有效检测并屏蔽selenium的网站应用:大众点评网的验证码表单页,如果是正常的浏览器操作,能够有效的通过验证,但如果是使用selenium就会被识别,即便验证码输入正确,也会被提示“请求异常,拒绝操作”,无法通过验证(如下图所示)。
分析页面源码,可以找到 https://static.meituan.net/bs/yoda-static/file:file/d/js/yoda.e6e7c3988817eb17.js 这个JS文件,将代码格式化后,搜索webdriver可以看到如下代码:
可以看到它检测了"webdriver", "__driver_evaluate", "__webdriver_evaluate"等等这些selenium的特征串。提交验证码的时候抓包可以看到一个_token参数(很长),selenium检测结果应该就包含在该参数里,服务端借以判断“请求异常,拒绝操作”。
现在才进入正题,如何突破网站的这种屏蔽呢?
我们已经知道了屏蔽的原理,只要我们能够隐藏这些特征串就可以了。但是还不能直接删除这些属性,因为这样可能会导致selenium不能正常工作了。我们采用曲线救国的方法,使用中间人代理,比如fidder, proxy2.py或者mitmproxy,将JS文件(本例是yoda.*.js这个文件)中的特征字符串给过滤掉(或者替换掉,比如替换成根本不存在的特征串),让它无法正常工作,从而达到让客户端脚本检测不到selenium的效果。
下面我们验证下这个思路。这里我们使用mitmproxy实现中间人代理),对JS文件(本例是yoda.*.js这个文件)内容进行过滤。启动mitmproxy代理并加载response处理脚本:
- mitmdump.exe -S modify_response.py
其中modify_response.py脚本如下所示:
# coding:utf-8
# modify_response.pyimport re
from mitmproxy import ctxdef response(flow):"""修改应答数据"""if '/js/yoda.' in flow.request.url:# 屏蔽selenium检测for webdriver_key in ['webdriver', '__driver_evaluate', '__webdriver_evaluate', '__selenium_evaluate', '__fxdriver_evaluate', '__driver_unwrapped', '__webdriver_unwrapped', '__selenium_unwrapped', '__fxdriver_unwrapped', '_Selenium_IDE_Recorder', '_selenium', 'calledSelenium', '_WEBDRIVER_ELEM_CACHE', 'ChromeDriverw', 'driver-evaluate', 'webdriver-evaluate', 'selenium-evaluate', 'webdriverCommand', 'webdriver-evaluate-response', '__webdriverFunc', '__webdriver_script_fn', '__$webdriverAsyncExecutor', '__lastWatirAlert', '__lastWatirConfirm', '__lastWatirPrompt', '$chrome_asyncScriptInfo', '$cdc_asdjflasutopfhvcZLmcfl_']:ctx.log.info('Remove"{}"from{}.'.format(webdriver_key,flow.request.url))flow.response.text=flow.response.text.replace('"{}"'.format(webdriver_key),'"NO-SUCH-ATTR"')flow.response.text=flow.response.text.replace('t.webdriver','false')flow.response.text=flow.response.text.replace('ChromeDriver','')
在selnium中使用该代理(mitmproxy默认监听127.0.0.1:8080)访问目标网站,mitmproxy将过滤JS中的特征符串,如下图所示:
经多次测试,该方法可以有效的绕过大众点评的selenium检测,成功提交大众点评网的验证码表单。
转载自:http://www.site-digger.com/html/articles/20180821/653.html
服务端如何识别是selenium在访问以及解决方案参考一相关推荐
- 服务端如何识别是selenium在访问以及解决方案参考二
有不少朋友在开发爬虫的过程中喜欢使用Selenium + Chromedriver,以为这样就能做到不被网站的反爬虫机制发现. 先不说淘宝这种基于用户行为的反爬虫策略,仅仅是一个普通的小网站,使用一行 ...
- 实现一个spring webservice服务端二:创建一个可以访问的webservice
在文章中,我学习了spring-ws基本的知识,在文章最后我也实现一个简单的项目,访问可以看到wsdl文件,但是我也遇到了一个问题,无法通过soap UI的测试,经过这一段业余时间的学习,这个问题解决 ...
- 魔坊APP项目-15-邀请好友(业务逻辑流程图、服务端提供邀请好友的二维码生成接口、客户端通过第三方识别微信二维码,服务端提供接口允许访问、App配置私有协议,允许第三方应用通过私有协议,唤醒APP)
邀请好友 1.业务逻辑流程图 客户端提供点击"邀请好友"以后的页面frame,html/invite.html,代码: <!DOCTYPE html> <html ...
- react ssr 服务端渲染入门
react ssr 服务端渲染入门 前言 前后端同构,作为针对单页应用 SEO 优化乏力.首屏速度瓶颈等问题而产出的解决方案,近来在 react.vue 等前端技术栈中都得到了支持.当我们正打算抛弃传 ...
- 服务端负载均衡和客户端负载均衡
服务端负载均衡 用户在App访问通过80端口请求nginx,ngin来实现负载均衡,分发请求 客户端负载均衡 Eureka Server注册中心集群部署,goods_services服务提供者启动后向 ...
- 如何在 MacOS 环境下搭建 SVN 服务端环境
文章目录 在服务端创建资源仓库 资源仓库访问权限配置 给资源仓库添加用户 配置用户组及用户的权限 启动 SVN 服务器 停止 SVN 服务器 SVN 是一个使用十分广泛的开放源代码的版本控制系统.在 ...
- skywalking服务端_skywalking部署
文件列表 apache-skywalking-apm-7.0.0.tar.gz:服务端文件 mysql-connector-java-5.1.30.jar:mysql jdbc驱动jar包 需要条件 ...
- 利用空闲服务器搭建frps服务端-实现穿透代理
利用frps代理Tcp或者udp或其它类型的连接 1.什么是frps/frpc frps是代理的服务端.frpc是代理的客户端,使用方数据传输到服务端,服务端再将数据传输到提供方,从而达到相互访问的目 ...
- python udp socket解决服务端响应时间长的指数退避算法
UDP连接是一个不可靠的连接,也就是说,UDP通信过程中可能出现数据包丢失的情况,或者是服务端宕机后,客户端不知道服务端状态,仍然不停的访问服务端的情况.针对这一情况,UDP客户端必须选择一个等待时间 ...
最新文章
- python基础05
- 从一个被Tomcat拒绝的漏洞到特殊内存马
- 深入理解Java虚拟机——JVM类加载机制(类加载过程和类加载器)
- 95-150-045-源码-Sink-Streaming Parquet File
- Kubernentes
- AIDA64自动监控计算机硬件工作情况
- docker rocketmq 安装及使用
- 网络RJ45接口详解
- 软件测试报告费计什么科目,软件记什么会计科目
- 串口通信基础(一)——串行与并行通信,同步与异步通信
- OceanBase部署observer启动后log日志狂写问题
- 哈希算法(哈希函数)基本
- 酪氨酸激酶的抑制剂——白血病的靶向研究
- 数字图像处理学习笔记4第四章 图像变换 附实验
- Flutter的圆形头像四种简单用法
- c语言流动字体显示的程序,1602字符液晶显示屏程序详解(C语言详细解说)
- python数据库开发 dga_利用Python实现DGA域名检测
- suse安装readline-devel
- 最新php蓝奏云直链api接口源代码
- 下一次我还来,三星新品发布从未让人失望!
热门文章
- bootstrap内容部分API解读(1)
- python爬取数据
- 数据结构题:由逆置数组方法——逆置线性表L的所有元素
- 前端协商缓存强缓存如何使用_前端强缓存和协商缓存
- mixamo网站_超全面的素材网站推荐
- php中mysql和mysqli_PHP中mysql和mysqli的区别
- php ci rest,在CodeIgniter框架中使用RESTful服务
- Linux系统xshell常用指令,linux系统安装数据库时,xshell工具常用MySQL(5.5)相关命令...
- python命令行进入帮助模式_python命令行模式直接查看帮助
- python openstack rabbitmq_OpenStack--Rabbitmq组件消息队列