目录
4、undetected_chromedriver库(推荐)
一、简介
在网络技术飞速发展的今天,自动化测试作为软件质量保证的重要手段,已经越来越受到开发者和运维人员的重视。其中,Selenium以其强大的功能和灵活的跨平台特性,成为了许多开发者进行Web应用自动化测试的首选工具。然而,随着浏览器安全策略的不断完善,如何有效地防止Selenium在自动化测试过程中被浏览器检测到,成为了开发者们面临的一个新的挑战。本文将详细探讨Selenium在防止被浏览器检测方面的技巧,帮助开发者更好地应对这一问题。
1、浏览器指纹识别
浏览器指纹识别技术(Browser Fingerprinting)是一种通过分析用户的浏览器行为、配置和功能来识别用户的在线身份和行为的技术。它利用浏览器中的一些特性,如操作系统、浏览器版本、设备类型、插件和用户活动等,构建一个唯一的“指纹”信息。这些信息可以被网站和服务器用来追踪、定位和分析用户的访问行为,从而实现广告定向、个性化推荐、用户细分等目的。
浏览器指纹识别技术具有以下特点:
- 用户隐私性较低:由于浏览器指纹识别技术可以通过分析用户的浏览器行为来获取用户信息,因此用户的隐私性较低。
- 难以防范:由于浏览器指纹识别技术依赖于浏览器特性,很难完全防范。部分浏览器已经针对这种技术提供了保护措施,但并不能完全消除风险。
- 用户体验影响较小:虽然浏览器指纹识别技术可能会影响用户的隐私和体验,但通常情况下,它不会对用户造成显著的影响。
2、行为分析
浏览行为分析(Behavioral Analysis,BA):这是一种分析用户在浏览器中的行为模式的方法,包括用户的浏览历史、访问的网站类型、停留时间等。通过对这些信息的分析,可以判断操作者是否为真人。
在使用自动化过程中尽量避免快速操作,在进行每个步骤的操作中最好停留一下,最好使用模拟鼠标和键盘来操作
3、为什么会被浏览器检测呢?
- 安全性原因:浏览器通常会对一些恶意行为进行监控和防范,Selenium 模拟浏览器操作的行为可能会被认为是恶意行为。
- 用户体验原因:浏览器的目的是为用户提供一个良好的用户体验,而 Selenium 模拟浏览器操作可能会影响用户的正常使用体验。
- 性能问题:Selenium 模拟浏览器操作可能会导致浏览器性能下降,影响其他用户的正常使用。
- 竞争问题:浏览器厂商通常会限制第三方工具的使用,以避免用户过度依赖这些工具,影响浏览器的稳定性和性能。
二、如何知道自己已经被检测到
1、使用window.navigator.webdriver属性
`window.navigator.webdriver` 是一个属性,它返回一个布尔值,表示当前浏览器是否支持 WebDriver 技术。WebDriver 是一种自动化测试技术,允许开发人员使用类似于操作浏览器的 API 来测试网页应用程序。
打开浏览器,按F12打开控制台,在控制台中输入window.navigator.webdriver
可以看到返回结果是一个false
值 | 描述 |
true | 表示当前浏览器支持 WebDriver |
false | 表示当前浏览器不支持 WebDriver |
undefined | 表示当前浏览器没有提供关于是否支持 WebDriver 的信息 |
这个属性的值对于使用 WebDriver 进行自动化测试非常重要,因为它可以帮助开发人员确定是否能够在浏览器中使用 WebDriver 进行测试。
当手动打开网站的时候返回结果正常都是false or undefined 因为我们是真人进行操作,但是当使用selenium等其他自动化工具打开网站的时候,很有可能会被浏览器检测到是测试机器人在操作,返回true
通俗来讲就是手动操作打开浏览器会返回false 或者 undefined,使用自动化机器人打开浏览器很大几率会出现true,部分高级网站当识别到你的返回值是true就会返回给你一些错误的网站信息来阻止你的自动化行为
2、使用在线网站测试工具查看
这个网站提供了一个在线工具,可以用于测试你的浏览器指纹。具体来说,它可以收集你的浏览器信息,并生成一个独特的浏览器指纹,用于识别你的浏览器。
一些网站和服务利用浏览器指纹识别技术来跟踪用户、进行用户分析、识别欺诈行为等。通过检测你的浏览器指纹,它们可以识别你的设备和浏览器,即使你更换了IP地址或删除了Cookie也能追踪你的活动。
这个在线工具可以帮助用户了解他们的浏览器指纹是什么样的,以及它可能暴露了什么样的信息。对于普通用户来说,这有助于增强对个人隐私的认识,促使他们采取一些措施来降低被跟踪的风险。对于开发者和安全专家来说,这个工具也可以用于测试网站的防御措施,以及评估不同浏览器或代理工具对浏览器指纹的影响。
2.1、手动打开该网页返回
2.2、使用自动化测试工具打开
使用selenium打开
from selenium import webdriver
import time
#打开谷歌浏览器
driver = webdriver.Chrome()
#页面最大化
driver.maximize_window()
#打开网页
driver.get('https://bot.sannysoft.com/')
time.sleep(10)
driver.save_screenshot('ceshi.png')
#关闭浏览器
driver.quit()
返回结果
当网站上的WebDriver(New)部分显示为红色时,通常表示该网站正在检测到你正在使用的浏览器是通过WebDriver控制的,而不是一个真实的人类用户在操作。WebDriver是一种自动化测试工具,通常被用于自动化测试和网页爬取等任务。然而,一些网站会检测到WebDriver的存在,并将其视为不受欢迎的自动化行为,可能会采取一些措施来阻止这种访问,比如弹出验证码、重定向到其他页面,或者直接拒绝服务。
这个时候就需要我们采取一些措施来规避这种检测
三、规避检测解决方案
现在各个浏览器和网站的反爬机制都在不断升级改造,以下方法不一定完全有效,希望对大家的当前困境有所帮助
1、使用无头浏览器
使用无头浏览器是一种常见的方法来规避网站的检测。下面是一个使用Selenium和无头浏览器的Python示例代码:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 创建ChromeOptions对象,配置无头模式
chrome_options = Options()
chrome_options.add_argument('--headless') # 启用无头模式
# 可选:为了进一步模拟真实用户行为,可以添加一些其他的配置
chrome_options.add_argument('--disable-gpu') # 禁用GPU加速
chrome_options.add_argument('--no-sandbox') # 在Linux系统上使用时可能需要添加此选项
# 创建WebDriver对象,指定Chrome浏览器和ChromeOptions
driver = webdriver.Chrome(options=chrome_options)
# 访问网页
driver.get("www.baidu.com")
# 执行其他操作,例如查找元素、点击按钮等
# 关闭浏览器
driver.quit()
这段代码使用了Chrome浏览器的无头模式,在创建WebDriver对象时传递了chrome_options
参数,这样就可以在无头模式下启动Chrome浏览器。通过这种方式,Selenium脚本在后台运行,不会弹出浏览器窗口,从而减少被检测的风险。
请注意,在某些情况下,网站可能会检测到无头浏览器的使用。
1.1、--headless
- 这个选项告诉Chrome浏览器在无头模式下运行,即不显示图形用户界面(GUI),而是在后台执行。无头模式的浏览器会在没有显示的情况下执行JavaScript、渲染页面等操作,通常用于自动化测试和数据爬取等任务。
- 使用无头浏览器可以提高运行效率、节省资源,并且不会打扰用户。
1.2、--disable-gpu
- 这个选项禁用了Chrome浏览器的GPU加速功能。GPU加速可以加快页面渲染速度,但在一些情况下可能会导致问题,尤其是在无头模式下运行时。
- 禁用GPU加速通常用于解决一些在无头模式下出现的渲染问题或性能问题。
1.3、--no-sandbox
- 这个选项禁用了Chrome浏览器的沙箱模式。沙箱模式是Chrome浏览器的一个安全特性,用于隔离浏览器进程和系统,以防止恶意软件对系统的攻击。
- 在一些特殊的情况下,比如在Linux环境下以root权限运行Chrome浏览器时,沙箱模式可能会导致一些问题,例如启动失败或权限错误。因此,禁用沙箱模式可以解决这些问题。
2、模拟用户行为
在实际操作中,如果操作过快也很容易别检测到是非真人操作,所以我们在自动化操作过程中应当尽量模仿出人为操作痕迹
2.1、模拟鼠标和键盘操作
如移动到元素、点击元素、双击元素等,需要输入时通过使用模拟键盘来进行数据最好不使用send_keys()直接输入,可以采用pyautogui库来进行模拟鼠标键盘的操作
2.2、随机化操作
在进行每次操作的过程中可以适当随机停顿一下,这样可以尽量接近真实用户的操作习惯,避免出现规律性的行为被网站检测到
#随机等待1-15秒
time.sleep(random.randint(1,15))
.....还有很多,待补充
总的来说,通过模拟用户行为并尽量模仿真实用户的操作,可以降低被网站检测到的风险。但需要注意的是,即使采取了以上措施,仍然无法保证完全不被检测到,因此在使用Selenium进行自动化任务时,始终需要保持警惕并做好应对各种情况的准备。
3、设置浏览器的用户代理(User-Agent)
设置浏览器的用户代理(User-Agent)字符串为指定的值。用户代理字符串是浏览器发送给网站的一段文本,用于告诉网站它所使用的浏览器类型和版本等信息,从而进行伪装成真实用户操作
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
# 设置用户代理字符串为指定的值
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"
chrome_options.add_argument(f'user-agent={user_agent}')
# 创建WebDriver对象,指定Chrome浏览器和ChromeOptions
driver = webdriver.Chrome(options=chrome_options)
# 访问网页
driver.get("https://bot.sannysoft.com/")
# 执行其他操作,例如查找元素、点击按钮等
driver.save_screenshot('ceshi.png')
# 关闭浏览器
driver.quit()
这段代码的关键是使用add_argument()
方法将指定的用户代理字符串作为参数传递给ChromeOptions对象的user-agent
选项。然后,将ChromeOptions对象传递给webdriver.Chrome()
方法来启动Chrome浏览器,并且在浏览器中设置了指定的用户代理字符串。这样就可以模拟特定浏览器和操作系统的访问行为,以达到模拟用户行为的目的。
4、undetected_chromedriver库(推荐)
undetected_chromedriver 旨在通过使用未被检测到的ChromeDriver来提高Selenium自动化脚本的稳定性和可靠性。当你使用普通的ChromeDriver时,有些网站可能会检测到你的脚本正在使用自动化工具,从而采取一些防御措施,比如弹出验证码、拒绝服务等。
undetected_chromedriver库的作用在于通过一些技巧和方法,使得你的Selenium脚本更难被网站检测到。它的主要特点和作用包括:
-
随机化配置: undetected_chromedriver会随机化一些配置,比如窗口大小、Chrome版本、ChromeDriver版本等,使得每次启动的浏览器都有些微的差异,从而减少被检测到的风险。
-
隐藏WebDriver特征: undetected_chromedriver会尝试隐藏WebDriver特征,比如修改一些JavaScript变量、删除一些WebDriver的特有标志等,以模拟真实用户的行为。
-
定期更新: undetected_chromedriver库会定期更新其代码,以适应网站对自动化工具的新检测和防御措施。
-
易于使用: 使用undetected_chromedriver库只需要简单地替换你原来的ChromeDriver,无需对现有的Selenium代码做任何修改。
总的来说,undetected_chromedriver库的作用是帮助你编写更稳定、更可靠的Selenium自动化脚本,减少被网站检测到的风险,从而提高自动化任务的成功率。
import undetected_chromedriver as uc
#创建谷歌浏览器
browser = uc.Chrome()
#打开网页
browser.get(url="https://bot.sannysoft.com/")
# 执行其他操作,例如查找元素、点击按钮等
browser.save_screenshot('ceshi.png')
# 关闭浏览器
browser.quit()
得到的结果就是已经避开了网站的检测
5、excludeSwitches参数关闭自动化检测
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
#关闭自动化检测
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 创建WebDriver对象,指定Chrome浏览器和ChromeOptions
driver = webdriver.Chrome(options=chrome_options)
# 访问网页
driver.get("https://bot.sannysoft.com/")
# 执行其他操作,例如查找元素、点击按钮等
driver.save_screenshot('ceshi.png')
# 关闭浏览器
driver.quit()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
这行代码的功能和作用是为ChromeOptions对象添加一个实验性选项,该选项用于排除特定的开关,其中"enable-automation"
是要排除的开关名称。
具体来说,这行代码的作用是将 Chrome 浏览器的自动化标志 "enable-automation" 从请求头中排除掉。在正常情况下,Chrome 浏览器会将 "enable-automation" 添加到请求头中,以标识浏览器正在被自动化控制,通常是由Selenium等工具控制。这可能会导致一些网站检测到自动化行为并采取相应的防御措施,比如弹出验证码或拒绝服务。
通过排除 "enable-automation" 这个开关,我们可以让浏览器在请求头中不再显示自动化标志,从而使得自动化行为更难被网站检测到。这有助于提高自动化测试、数据采集等任务的成功率和稳定性。
总之,这行代码的作用是为了规避网站对浏览器自动化的检测,提高自动化脚本的稳定性和可靠性。
...待补充
四、结尾
通过这篇文章给大家分享我在学习过程中的一些经验和心得,希望能够对大家有所帮助,同时也接受大家的建议和意见,共同进步、共同学习。
如果你觉得我的文章对你有所帮助,我诚挚地邀请你关注、点赞和分享。