• 0
  • 0
分享
  • Selenium 最强反反爬方案来了!——软件测试圈
  • 橙子 2024-06-14 11:56:11 字数 2304 阅读 849 收藏 0

  提到目前网上的反检测方法几乎都是掩耳盗铃,因为模拟浏览器有几十个特征可以被检测,仅仅隐藏 webdriver 这一个值是没有任何意义的。

  今天我们就来说说应该如何正确解决这个问题。

  我们首先给出解决方案,然后再说明这个解决方案,我是通过什么方式找到的。

  解决这个问题的关键,就是一个 js 文件,叫做stealth.min.js,稍后我会说明如何生成这个文件。

  我们需要设定,让 Selenium 或者 Pyppeteer 在打开任何页面之前,先运行这个 Js 文件。

  这里,我以 Selenium 为例来说明如何操作,我们编写如下代码:

  import time
  from selenium.webdriver import Chrome
  from selenium.webdriver.chrome.options import Options
  chrome_options = Options()
  chrome_options.add_argument("--headless")
  chrome_options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36')
  driver = Chrome('./chromedriver', options=chrome_options)
  with open('/Users/kingname/test_pyppeteer/stealth.min.js') as f:
      js = f.read()
  driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": js
  })
  driver.get('https://bot.sannysoft.com/')
  time.sleep(5)
  driver.save_screenshot('walkaround.png')
  # 你可以保存源代码为 html 再双击打开,查看完整结果
  source = driver.page_source
  with open('result.html', 'w') as f:
      f.write(source)

  运行截图如下:

1-1.png

  可以看到,虽然我使用的是无头模式,但是能够被识别的特征都被成功隐藏。大家还可以双击打开保存下来的 html 文件,看看是不是结果跟普通浏览器几乎一样。

  如果你使用的是 Pyppeteer,那么可以根据我上面文章中给出的方法,试着加载一下这个 js 文件,看看是不是也能成功隐藏特征。

  那么,这个stealth.min.js文件是怎么来的呢?这就要说到puppeteer了。我们知道,Python 版本的pyppeteer已经很久没有人维护了,但是Node.js 版本的 puppeteer持续有人维护,并且在持续更新,生态也越来越好。

  有开发者给 puppeteer 写了一套插件,叫做puppeteer-extra。其中,就有一个插件叫做puppeteer-extra-plugin-stealth。这个东西,就来专门用来让 puppeteer 隐藏模拟浏览器的指纹特征。

  这个东西是专门给 puppeteer 用的。所以,如果你使用的是 puppeteer,那么你可以根据它的 Readme说明,直接使用。

  那么,我们用 Python 的人怎么办呢?实际上也有办法。就是把其中的隐藏特征的脚本提取出来,做成一个单独的 js 文件。然后让 Selenium 或者 Pyppeteer 在打开任意网页之前,先运行一下这个 js 文件里面的内容。

  puppeteer-extra-plugin-stealth的作者还写了另外一个工具,叫做extract-stealth-evasions。这个东西就是用来生成stealth.min.js文件的。

  如果你在国外,并且网速足够快的话。那么你根据它的 Readme,首先安装 Node.js,然后安装 Npm,接着运行如下命令:

  npx extract-stealth-evasions

  就会在你执行命令的文件夹下面生成一个stealth.min.js文件。然后你就可以正常使用了。

  如果你在国内,那么执行这个命令的过程中,会有一个下载 Chromium 的过程,速度非常慢,虽然只有130MB,但是可能会下载好几个小时。

  此时,你需要把它的package.json和index.js两个文件保存到本地。然后打开package.json文件,修改其中的dependencies这一项,把里面的puppeteer改成puppeteer-core,如下图所示:

1-2.png

  然后修改index.js,给.launch()函数增加一个参数executablePath,指向你电脑上的 Chrome 浏览器,如下图所示:

1-3.png

  修改完成以后。首先执行yarn install安装依赖包。然后执行node index.js运行程序。1秒钟以后就会生成stealth.min.js了。


作者:kingname    

来源:http://www.51testing.com/html/78/n-7796778.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   一般我们的软件项目类型分为三种  一、敏捷产品开发模式:持续收集客户需求,以固定的短周期不断更新Saas产品功能并发布到线上给客户使用。(平台化产品)  二、交付项目模式:根据客户合同定义的需求,制定完整的项目计划,在合同规定的时间内完成项目交付。  三、运维项目模式:产品或者项目不再进行功能更新,只解决一些线上问题。  针对于如上三种项目类型,JIRA里对应有两种面板:  Scrum  Scrum的核心概念——冲刺(Sprint),也可以称作为迭代,冲刺是用2到4周的时间来完成一定量的工作。Sprint有助于将项目范围分解为更容易管理的故事和任务,并频繁地交付正常运行的软件。Scrum侧...
            0 0 1099
            分享
          •   业务需求  假设公司领导现在给你分配了一个性能测试需求如下:  1:公司有1000人在上班时间段会登录平台进行打卡操作,可能会登录打卡多次  2:业务高峰时间段在8:00-8:30,半小时  3:需要保证90%用户的响应时间在1s以内  4:保证在半小时内支撑5000笔打卡业务完成,同时90%业务时间不超过1s,半小时内最大系统并发数能达到多少?每秒最大用户并发能达到多少?  分析需求  a.1000人在30分钟内完成登录,那么每分钟有1000/30=33的人登录,每秒有0.56人登录,也就是2s中有1个人登录;  b.5000笔打卡业务在30分钟内完成,那么每秒中需要完成5000/(30...
            7 7 4013
            分享
          • 前言本文主要是记录Pycharm创建支持appium模块的项目时,如何安装Appium-Python-Client以及通过一个简单的脚本实现自动点击操作的过程。步骤1.创建python项目使用Pycharm新建一个项目,这里取名test,如下图创建完以后,会自动生成一些文件,如下图:2.添加Appium-Python-Client2.1 打开Settings对话框在项目的菜单中选择File->Settgings(或者直接按快捷键Ctrl+Alt+S)2.2 安装Appium-Python-Client选择Project:test(test为项目名,不同项目不一样)下的Project In...
            13 13 2593
            分享
          •   假如你是一位测试主管,去评价一名测试工程师是否优秀,那么你将如何去判断呢?你最看重的是哪方面的能力呢?  对于这个问题,是不能一概而论的,要分为两种情况,情况不同,答案一定是不同的。  我先给你举个例子,听完这个例子之后,你就知道我为什么这样说了。  你去商场买一件东西,比如说手机,首先你会选择正规大商场去购买,然后会选择大品牌。  为什么这么说呢,因为你肯定知道,选购手机的时候,只能短暂的体验,想全方面了解,只能买到手里以后慢慢用才行。所以,手机的品牌、口碑、产品参数等等这些能看得到的数据就是重要的参考依据了。  但是,一旦买到手,成为了你的手机之后,你的想法立马会不同。你会希望它好用、...
            0 0 968
            分享
          •   Pytest简介  Pytest is a mature full-featured Python testing tool that helps you write better programs.The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries.  通过官方网站介绍我们可以了解到,pytest是一个非常成熟的全功能的python测试框架,主要有以...
            0 0 940
            分享
      • 51testing软件测试圈微信