惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
A
About on SuperTechFans
G
Google Developers Blog
B
Blog RSS Feed
F
Fortinet All Blogs
WordPress大学
WordPress大学
Recent Announcements
Recent Announcements
Hugging Face - Blog
Hugging Face - Blog
Y
Y Combinator Blog
MongoDB | Blog
MongoDB | Blog
小众软件
小众软件
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
T
The Blog of Author Tim Ferriss
Jina AI
Jina AI
IT之家
IT之家
P
Proofpoint News Feed
美团技术团队
量子位
Microsoft Azure Blog
Microsoft Azure Blog
Engineering at Meta
Engineering at Meta
B
Blog
有赞技术团队
有赞技术团队
U
Unit 42

老董笔记

尚硅谷机构在哪?尚硅谷培训怎么样?靠谱吗-互联网IT百科 韩顺平介绍,传智讲师,开办泰牛,入尚硅谷等一系列-互联网IT百科 pandas多重索引标准样式(写入excel有空行)-互联网IT百科 cannot join with no overlapping index names-互联网IT百科 pandas多列变多行(即宽表变长表)melt和stack函数-互联网IT百科 pandas多行转多列(长表变宽表)pivot和unstack-互联网IT百科 Index contains duplicate entries, cannot reshape完美解决-互联网IT百科 single positional indexer is out-of-bounds-互联网IT百科 Can only compare identically-labeled Series objects-互联网IT百科 pandas transform用法详解(多个案例)-互联网IT百科 python四舍五入精确实现-互联网IT百科 pandas的groupby使用apply分组排序-互联网IT百科 index 0 is out of bounds for axis 0 with size 0-互联网IT百科 pandas分组过滤filter函数-互联网IT百科 联想Win10系统如何禁用触摸屏关闭触摸-互联网IT百科 groupby分组计算transform转换返回相同长度序列-互联网IT百科 brooks seo教程python教程,brooks seo教程网盘,布鲁seo资源-互联网IT百科 电脑右键文件夹一直转圈电卡死怎么回事-互联网IT百科 施琪嘉的心理成长课(荐)-互联网IT百科 百度SEO公司_SEO推广公司哪家好_SEO外包服务如何选-老董笔记 groupby后agg同1列用多个聚合函数、不同列用不同函数、自定义函数-互联网IT百科 pandas的groupby单列多列分组聚合运算-互联网IT百科 DataFrameGroupBy对象及分组个数、分组大小、组名索引、组数据详解-互联网IT百科 pandas中groupby之Grouper and axis must be same length-互联网IT百科 pandas中groupby的分组原理-互联网IT百科 pandas的groupby的使用详解大全-互联网IT百科 openpyxl单元格自动换行强制换行Alignment(wrapText=True)-互联网IT百科 python教程全套(可就业)-互联网IT百科 联想win10系统CPU显示100%,电脑呼呼响怎么回事-互联网IT百科 如何自制CPU,CPU原理是怎么样的?-互联网IT百科
selenium消除启动特征避免被反爬-互联网IT百科
2021-01-14 · via 老董笔记

  启动特征很多,我们在上一篇文章已经介绍过。如何消除selenium启动特征呢?这个也是因站而异。鄙人作为1个外行真是花了很长时间去测试。

  一:规避简单常规的检测,做到以下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)

  但在高版本的谷歌浏览器下,通过以上方式已经无效了,最新解决办法详情查看window.navigator.webdriver修改设置

  二、通过配置来规避一些webdriver特征

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

  三:较为彻底的规避检测

  如果要彻底干净一些可以借助1段js,通过js注入可以干掉大把的webdriver特征!这段js青南大佬首发分享过,其原始地址是>>这里

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": 生成的js代码
        })

  四:接管本地浏览器

  即使webdriver特征被干掉了,依然有别的渠道检测。万般无奈之下可以用其他思路:在cmd下指定端口手动启动谷歌浏览器,然后在脚本中接管这个浏览器,这样和正常启动浏览器已经非常相似了。详情查看selenium接管本地浏览器

  五:协议层面的指纹

  即使接管本地浏览器,依然是可以被识别!在协议层面,selenium应该也有一些特征可以被识别,这个网上非常难找资料,可能需要C++对浏览器进行重新编译。

  此外,上述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检测,成功提交大众点评网的验证码表单。

很赞哦!

python编程网提示:转载请注明来源www.python66.com。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群 python学习会