zoukankan      html  css  js  c++  java
  • selenium消除启动特征避免被反爬

    启动特征很多,我们在上一篇文章已经介绍过。如何消除selenium启动特征呢?这个也是因站而异,如果规避常规的检测,做到以下2点就可以。

      1 是消除window.navigator.webdriver的值;

      2 是修改chromedriver.exe的源码,改掉$cdc_xxx的值(用同等数量字符替换即可)。你可以直接加站长微信给你修改。

      以往在防止window.navigator.webdriver被识别时的方法是

    	  from selenium.webdriver import Chrome
    	  from selenium.webdriver import ChromeOptions
    	  option = ChromeOptions()
    	  option.add_experimental_option('excludeSwitches', ['enable-automation'])
    	  driver = Chrome(options=option)

      但在高版本的谷歌浏览器下,通过以上方式已经无效了,最新解决办法详情查看http://www.python66.com/bbs/162.html

      另外,还有一种比较强大的配置可以去除webdriver一些特征。

        # 屏蔽webdriver特征
        option.add_argument("--disable-blink-features")
        option.add_argument("--disable-blink-features=AutomationControlled")

      有些站检测的非常全面,上述做法不能规避检测,怎么办呢?

      如果要彻底干净一些,可以借助1段js,这段js可以干掉所有的webdriver特征!用 相关的检测工具站也检测不出来。感兴趣可以联系站长。

      即使所有特征被干掉了,依然有办法可以检测(了解如何检测可以加站长一起交流),遇到这样的站就可以考虑放弃selenium了。

      如果不想放弃,可以在cmd下指定端口手动启动谷歌浏览器,然后在脚本中接管这个浏览器。这样就和正常启动浏览器无任何区别。详情查看selenium接管本地浏览器

      此外,上述webdriver特征的去除也可以考虑用中间人代理的方式解决,本人从网络上收集了一篇比较靠谱的文章。(原理不难,就是给浏览器找个代理,代理获取网页后把对方页面的一些检测代码修改后再返回给浏览器,有点类似于fiddler、charles这些抓包工具)。

      专业叫法:中间人代理mitmproxy

      大众点评网的验证码表单页,如果是正常的浏览器操作,能够有效的通过验证,但如果是使用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.py  
        
      import re  
      from mitmproxy import ctx  
          
      def 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.python66.com/seleniumjiaocheng/182.html

  • 相关阅读:
    第3次作业:卷积神经网络
    第一次作业:深度学习基础
    CSS基础总结
    Java 9.Spring--AOP
    Java 8.Spring--整合Junit测试
    Java 7.Spring--使用注解
    Java 6.Spring--对象的依赖关系-复杂类型注入
    Java 5.Spring的依赖注入
    Java 4.Spring的对象创建的方法
    Java 3.Spring的对象创建的细节
  • 原文地址:https://www.cnblogs.com/xiaocaicai-cc/p/14841371.html
Copyright © 2011-2022 走看看