使用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脚本如下所示:

view plaincopy to clipboardprint?

# 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 解决方案 1. 使用Firefox 2. 半自动爬虫 3. 使用pyppeteer 4. Chrome开发工具协议 参考文献 问题描述 使用 selenium ...

  2. seleuium 禁止检测_如何突破网站对selenium的屏蔽

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

  3. 以淘宝为例教你如何突破网站对selenium的屏蔽

    背景介绍: 一般情况下,访问网站都会消耗服务器的资源.而机器人可以做到比人更快的访问速度,更持续的访问时间,这对网站资源占用消耗是远远超过人的,而当服务器资源被大量占用的时候, 就不能为人提供正常的网 ...

  4. 网站链接被微信屏蔽禁止访问的解决办法

    最近网站链接被微信屏蔽禁止访问,微信内打开网址显示如下提醒:已停止访问该网页,网页包含诱导分享.关注等诱导行为内容,被多人投诉,为维护绿色上网环境,已停止访问. 出现这种情况的原因是此域名(包括主域名 ...

  5. 网站被运营商屏蔽的经理和解决方法

    网站被运营商屏蔽的经理和解决方法 参考文章: (1)网站被运营商屏蔽的经理和解决方法 (2)https://www.cnblogs.com/maja/p/10194520.html (3)https: ...

  6. index of rmvb mp3 rm突破网站入口下载

    首先打开Google,在关键词输入框中输入"index of/"inurl:lib(双引号为英文状态下) ,选择"搜索简体中文网页"选项,回车搜索,得到了一些网 ...

  7. 网站识别selenium爬虫的原理以及解决方法

    我们经常会拿selenium进行自动登录来搭建cookie池,对于不想自己网站被爬的站主/开发人员来说,防止自动化脚本操作网站自然是反爬必须要做的工作.那么,他们究竟有哪些手段来检测用户是否是sele ...

  8. python如何登录一个需要第三方验证的网站_python+selenium 之如何跳过登录验证

    忙了一段时间没来学习了,今天学习下如何跳过登录验证码登录 首先我们很多系统的登录机制都会有短信验证或者图形验证等,每次自动化代码走到登录的时候,因为随机的验证码,导致无从下手 其实据我所知是有很多种方 ...

  9. hosts屏蔽网站以及代理越过屏蔽

    用修改hosts的办法屏蔽了一些网站,这样就可以不必分心上网乱逛了. 如 127.0.0.1 news.baidu.com 也就是说ie解析时查看hosts,将news.baidu.com的链接指向1 ...

最新文章

  1. plsql programming 10 日期和时间戳
  2. 【JOURNAL】911的虚惊
  3. java拆装_JAVA线性表拆解
  4. 为iOS 项目引入其它开发包 的方法
  5. Android自定义view之基础知识
  6. 很多人想不通为什么创业失败者众成功者少
  7. 直接插入排序中的监视哨问题
  8. 2021-06-23元素的排列,浮动和display
  9. switchHosts 介绍
  10. 工业相机和镜头基础知识(转载)
  11. 求斐波那契数列的三种方法
  12. 51单片机LED灯闪烁
  13. 行政组织理论-阶段测评4
  14. 美团CAT客户端(windows版)接入指南
  15. 跳转指令JMP(04)和跳转结束指令JME(05)
  16. 如何利用番茄工作法提高学习和工作的效率
  17. 设计师计算机配置,超全面!写给设计师的电脑配置攻略之PS篇
  18. 数据清洗是清洗什么?
  19. JS输入框检验字符数(中文为2个字符,英文为1个字符)
  20. 从键盘输入一个字符,如果是小写字母,则将其转换成大写字母输出;如果是大写字母,则将其转换成小写字母输出;如果是其它字符,则原样输出。

热门文章

  1. python+selenium实现疫情期间全自动打卡
  2. 错过金三银四,找工作4个月,面试15家,终于拿到3个offer,定级P7+
  3. Hexo yilia 主题添加相册功能
  4. 笔记本不显示“选择关闭盖子的功能”
  5. 讲JAVA比较好的直播_有哪些比较好的课程直播平台?
  6. 最新二级域名分发系统网站源码 可商用
  7. 滴!请查收携程机票增值会员团队的一年敏捷账单
  8. 【实用手记】如何在当前终端打开一个相同路径的终端
  9. 微信小程序使用swiper制作左右滑动tabs导航
  10. java oracle 序列_Oracle之序列