如何突破网站对selenium的屏蔽

news/2024/5/21 6:40:49/文章来源:https://blog.csdn.net/clf63082/article/details/100223126
本文原创作者:鲲之鹏(http://www.site-digger.com)
本文原始链接:http://www.site-digger.com/html/articles/20180821/653.html

使用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 plain copy to clipboard print ?

  1. # coding: utf-8  

  2. # modify_response.py  

  3.   

  4. import re  

  5. from mitmproxy  import ctx  

  6.     

  7. def response(flow):  

  8.    """修改应答数据 

  9.   """  

  10.    if  '/js/yoda.'  in flow.request.url:  

  11.        # 屏蔽selenium检测  

  12.        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_']:  

  13.           ctx.log.info( 'Remove "{}" from {}.'.format(webdriver_key, flow.request.url))  

  14.           flow.response.text = flow.response.text.replace( '"{}"'.format(webdriver_key),  '"NO-SUCH-ATTR"')  

  15.       flow.response.text = flow.response.text.replace( 't.webdriver',  'false')  

  16.       flow.response.text = flow.response.text.replace( 'ChromeDriver',  '')  

在selnium中使用该代理(mitmproxy默认监听127.0.0.1:8080)访问目标网站,mitmproxy将过滤JS中的特征符串,如下图所示:

经多次测试,该方法可以有效的绕过大众点评的selenium检测,成功提交大众点评网的验证码表单。

 

 

参考文章:

https://stackoverflow.com/questions/33225947/can-a-website-detect-when-you-are-using-selenium-with-chromedriver

http://edmundmartin.com/detecting-selenium/

https://docs.mitmproxy.org/stable/concepts-certificates/



  说明:该文章为 鲲之鹏 (http://www.site-digger.com)原创文章 ,您除了可以发表评论外,还可以转载到别的网站,但是请保留源地址,谢谢!!(尊重他人劳动,我们共同努力)


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30303165/viewspace-2212598/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30303165/viewspace-2212598/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_887084.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

16个小众却很实用的网站(程序员 向)

https://zhuanlan.zhihu.com/p/23005451 3个月以前在知乎上回答一个问题 【有哪些能集实用,装逼于一身的冷门网站?】得到很多小伙伴的喜爱,一直到现在都还陆陆续续收到大家的赞,谢谢大家。 于是,我就想,现在…

简单爬取京东网站

简单爬取京东网站的图片 正则表达式为京东图片的地址

AST对抗某网站的Js抽取型混淆

因为网站比较敏感, 所以具体网站就不说了, 直接说逻辑部分 为了降低数据提取的错误率, 所以使用了python的slimit库对js代码进行提取处理 对网站源码的JavaScript进行分析后, 发现在其中一个script标签内的js代码是利用抽取混淆的, 并用flashvars开头的变量存储 首先用python…

KNN算法学习-实现海伦约会网站与手写体识别实验

文章目录 前言一、实验介绍二:实验过程:1.数据准备2.分析数据3.归一化数值4.测试算法5.使用算法 三、实验:实现手写识别系统sklearn数据集 总结 前言 一、K-近邻算法是什么? 简而言之,k-近邻算法就是采用测量不同特征…

(网页加载慢)浏览器访问网站时发现建立连接( Initial connection)时巨慢,需要 20 多 s的追查

今天公司网站上线,结果首页的访问速度出奇的卡。chrome里查了下网站的加载速度 Initial connection 什么鬼,竟然20多秒 其实测试时就已经发现这个问题了,一直以为是发布后网站(IIS)第一次加载特别慢的原因,…

【python网络爬虫与NLP系列】一、利用scrapy+redis实现新闻网站增量爬取

写在前头:为了督促自己完成2018上半年的个人小任务,决定在平台上记录和分享完成的过程和心得。时间有限,但尽量详细具体吧。 简述一下整个系列的任务:(1)精选几个自己感兴趣的外文网站;&#x…

SEO入门知识篇

SEO(Search Engine Optimization):通过已知的搜索引擎算法,优化网站的内部和外部网站,使网站满足搜索引擎的索引排名需求,提高搜索引擎中的关键字排名,从而为网站带来精确的用户,获得…

网站SEO不得不关注的四大问题

原博主链接:https://blog.csdn.net/cc321001   相信各位参与过网站建设的小伙伴都知道,网站优化中的SEO方法是比较稳定和有效的。不过对于刚开始接触SEO工作的小白站长来说,特别是利用网站模板快速建站的小白站长,总会遇到多多少…

企业网站建设的核心点和优化策略

摘要 企业网站建设的核心优化策略主要在于架构设计,而架构设计又包含了js代码优化、flash的减少、框架优化、图形优化等等,比如说静态或者伪静态页面更适合企业站点的优化。 越来越多的公司在创建网站时缺乏创新精神,而公司网站却表现平平。…

一个完整的网站建设需要哪些流程?

摘要 网站建设流程并不复杂,大致流程就是域名和服务器的购买,网站设计和开发,内容的补充,但在这些环境中,有很多需要注意的小细节。 1、针对对象,用户调研 在设计网站前,必须告诉网站所针对的…

浅谈网站建设的优化问题

越来越多的公司在创建网站时缺乏创新精神,而公司网站却表现平平。这种情况导致访问者无法浏览网站,也没有新鲜感。 这给公司留下了不太好的印象,也影响了信息交流。因此,有必要找到并优化网站建设的核心。非著名网站开发员让大家…

网站建设需要怎么做?个人网站建设教程

摘要 网站建设教程,从域名、服务器的购买,再到数据库的购买与配置,再到网站CMS系统的挑选以及上传安装。总的来说网站建设并不难,难的是运营,比如,如何写好文章,添加好的产品,如何让…

Arp欺骗截cookies入侵“中国黑客”网站(图)

放假回家,暂时没有自己的电脑,只能跑网吧。打开ie就看见网吧主页。。。这个网吧是我家附近作的最好的。在这里玩过几次,也提醒过老板一些漏洞。不过漏洞天天更新么~ 是个2级域名111.lzbiz.com。换成www,竟然是个黑客网站。。。名…

为ASP.NET 2.0网站生成唯一程序集

为ASP.NET 2.0网站生成唯一程序集 为ASP.NET 2.0网站生成唯一程序集 作者:veryhappy(wx.net) 在Visual Studio 2003下开发网站的都知道ASP.NET 1.1网站生成后都是一个唯一命名的程序集(项目名称.DLL),但是这种情况在Visual Studio…

使用httpwebrequest发送数据到网站

怎样通过HttpWebRequest 发送 POST 请求到一个网页服务器&#xff1f;例如编写个程序实现自动用户登录&#xff0c;自动提交表单数据到网站等。 假如某个页面有个如下的表单&#xff08;Form&#xff09;&#xff1a; <form name"form1" action" http://www.…

妙用HOST:屏蔽网站建立网站映射

最初想到利用Hosts文件是基于学校跨网段访问网页时用IP地址访问带来的不便&#xff1a;学校教学网系统分成四个网段&#xff0c;包括三个学生机房网段和一个办公室教师用机网段&#xff0c;服务器没有使用DNS。办公室教师机有的开了PWS(个人Web服务器)&#xff0c;教师在同一网…

Web设计师应该收藏的11个网站

今天&#xff0c;本文与大家分享11个Web设计师应该收藏的网站&#xff0c;这些都是我最喜爱的寻找设计灵感的网站。我很喜欢Dribbble&#xff0c;可以花很长的时间只是为了浏览网页&#xff0c;欣赏那些耀眼的设计&#xff0c;也很喜欢One Page Love&#xff0c;这是我见过的最…

宝塔面板网站搭建实战——Wordpress搭建教程

搭建之前 成功部署截图 但是&#xff01;不能直接点访问站点&#xff0c;因为这个站点是虚拟的&#xff0c;是不存在的。 按照下面方法打开网站&#xff1b; 主菜单点击网站&#xff0c;找到刚刚创建的网站点击设置 把那个假的删掉再点击访问就可以了 开始安装 成功进入Word…

Django实现网站用户信息管理

Django实现网站用户信息管理 Django中View是非常重要的一个环节&#xff0c;在接收到用户请求后&#xff0c;我们的View会通过路径来判断进行什么样的逻辑处理&#xff0c;并且返回给对应路径的网页或者数据。 Django流程图 1、定义视图、处理业务 首先我们要在模块中的vie…

Outlook 使用anywhere 提示安全证书上的名称无效或与网站的名称不相符

使用anywhere方式配置outlook 2013时&#xff0c;提示安装证书的名称无效或与网站的名称不相符 查看证书&#xff0c;或命令行 查看证书的名称&#xff1a;get-exchangecertifacate, 根据上面的ES提示我就不截图了&#xff0c;和ECP中的证书设置的主题有所不同&#xff0c;中的…