使用selenium模拟浏览器进行数据抓取无疑是当下最通用的数据采集方案,它通吃各种数据加载方式,能够绕过客户JS加密,绕过爬虫检测,绕过签名机制。它的应用,使得许多网站的反采集策略形同虚设。由于selenium不会在HTTP请求数据中留下指纹,因此无法被网站直接识别和拦截。

这是不是就意味着selenium真的就无法被网站屏蔽了呢?非也。selenium在运行的时候会暴露出一些预定义的Javascript变量(特征字符串),例如"window.navigator.webdriver",在非selenium环境下其值为undefined,而在selenium环境下,其值为true(如下图所示为selenium驱动下Chrome控制台打印出的值)。

除此之外,还有一些其它的标志性字符串(不同的浏览器可能会有所不同),常见的特征串如下所示:

  1. webdriver
  2. __driver_evaluate
  3. __webdriver_evaluate
  4. __selenium_evaluate
  5. __fxdriver_evaluate
  6. __driver_unwrapped
  7. __webdriver_unwrapped
  8. __selenium_unwrapped
  9. __fxdriver_unwrapped
  10. _Selenium_IDE_Recorder
  11. _selenium
  12. calledSelenium
  13. _WEBDRIVER_ELEM_CACHE
  14. ChromeDriverw
  15. driver-evaluate
  16. webdriver-evaluate
  17. selenium-evaluate
  18. webdriverCommand
  19. webdriver-evaluate-response
  20. __webdriverFunc
  21. __webdriver_script_fn
  22. __$webdriverAsyncExecutor
  23. __lastWatirAlert
  24. __lastWatirConfirm
  25. __lastWatirPrompt
  26. $chrome_asyncScriptInfo
  27. $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处理脚本:

  1. 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在访问以及解决方案参考一相关推荐

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

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

  2. 实现一个spring webservice服务端二:创建一个可以访问的webservice

    在文章中,我学习了spring-ws基本的知识,在文章最后我也实现一个简单的项目,访问可以看到wsdl文件,但是我也遇到了一个问题,无法通过soap UI的测试,经过这一段业余时间的学习,这个问题解决 ...

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

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

  4. react ssr 服务端渲染入门

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

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

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

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

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

  7. skywalking服务端_skywalking部署

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

  8. 利用空闲服务器搭建frps服务端-实现穿透代理

    利用frps代理Tcp或者udp或其它类型的连接 1.什么是frps/frpc frps是代理的服务端.frpc是代理的客户端,使用方数据传输到服务端,服务端再将数据传输到提供方,从而达到相互访问的目 ...

  9. python udp socket解决服务端响应时间长的指数退避算法

    UDP连接是一个不可靠的连接,也就是说,UDP通信过程中可能出现数据包丢失的情况,或者是服务端宕机后,客户端不知道服务端状态,仍然不停的访问服务端的情况.针对这一情况,UDP客户端必须选择一个等待时间 ...

最新文章

  1. python基础05
  2. 从一个被Tomcat拒绝的漏洞到特殊内存马
  3. 深入理解Java虚拟机——JVM类加载机制(类加载过程和类加载器)
  4. 95-150-045-源码-Sink-Streaming Parquet File
  5. Kubernentes
  6. AIDA64自动监控计算机硬件工作情况
  7. docker rocketmq 安装及使用
  8. 网络RJ45接口详解
  9. 软件测试报告费计什么科目,软件记什么会计科目
  10. 串口通信基础(一)——串行与并行通信,同步与异步通信
  11. OceanBase部署observer启动后log日志狂写问题
  12. 哈希算法(哈希函数)基本
  13. 酪氨酸激酶的抑制剂——白血病的靶向研究
  14. 数字图像处理学习笔记4第四章 图像变换 附实验
  15. Flutter的圆形头像四种简单用法
  16. c语言流动字体显示的程序,1602字符液晶显示屏程序详解(C语言详细解说)
  17. python数据库开发 dga_利用Python实现DGA域名检测
  18. suse安装readline-devel
  19. 最新php蓝奏云直链api接口源代码
  20. 下一次我还来,三星新品发布从未让人失望!

热门文章

  1. bootstrap内容部分API解读(1)
  2. python爬取数据
  3. 数据结构题:由逆置数组方法——逆置线性表L的所有元素
  4. 前端协商缓存强缓存如何使用_前端强缓存和协商缓存
  5. mixamo网站_超全面的素材网站推荐
  6. php中mysql和mysqli_PHP中mysql和mysqli的区别
  7. php ci rest,在CodeIgniter框架中使用RESTful服务
  8. Linux系统xshell常用指令,linux系统安装数据库时,xshell工具常用MySQL(5.5)相关命令...
  9. python命令行进入帮助模式_python命令行模式直接查看帮助
  10. python openstack rabbitmq_OpenStack--Rabbitmq组件消息队列