selenium实战指南:如何防止被浏览器检测?-程序员宅基地

技术标签: python  selenium  chrome  测试工具  大数据  

目录

一、简介

1、浏览器指纹识别

2、行为分析

3、为什么会被浏览器检测呢?

二、如何知道自己已经被检测到

1、使用window.navigator.webdriver属性

2、使用在线网站测试工具查看

2.1、手动打开该网页返回

2.2、使用自动化测试工具打开

三、规避检测解决方案

1、使用无头浏览器

1.1、--headless

1.2、--disable-gpu

1.3、--no-sandbox

2、模拟用户行为

2.1、模拟鼠标和键盘操作

2.2、随机化操作

3、设置浏览器的用户代理(User-Agent)

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

window.navigator.webdriver属性返回参数
描述
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脚本更难被网站检测到。它的主要特点和作用包括:

  1. 随机化配置: undetected_chromedriver会随机化一些配置,比如窗口大小、Chrome版本、ChromeDriver版本等,使得每次启动的浏览器都有些微的差异,从而减少被检测到的风险。

  2. 隐藏WebDriver特征: undetected_chromedriver会尝试隐藏WebDriver特征,比如修改一些JavaScript变量、删除一些WebDriver的特有标志等,以模拟真实用户的行为。

  3. 定期更新: undetected_chromedriver库会定期更新其代码,以适应网站对自动化工具的新检测和防御措施。

  4. 易于使用: 使用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" 这个开关,我们可以让浏览器在请求头中不再显示自动化标志,从而使得自动化行为更难被网站检测到。这有助于提高自动化测试、数据采集等任务的成功率和稳定性。

总之,这行代码的作用是为了规避网站对浏览器自动化的检测,提高自动化脚本的稳定性和可靠性。

...待补充

四、结尾

通过这篇文章给大家分享我在学习过程中的一些经验和心得,希望能够对大家有所帮助,同时也接受大家的建议和意见,共同进步、共同学习。

如果你觉得我的文章对你有所帮助,我诚挚地邀请你关注、点赞和分享。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_51431069/article/details/137957646

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签