selenium工作原理和反爬分析
一、 Selenium
Selenium是最广泛使用的开源Web UI(用户界面)自动化测试套件之一,支持并行测试执行。Selenium通过使用特定于每种语言的驱动程序支持各种编程语言。Selenium支持的语言包括C#,Java,Perl,PHP,Python和Ruby。Selenium支持的浏览器包括Internet Explorer,Mozilla Firefox,Google Chrome和Safari。
二、 Selenium WebDriver
WebDriver是由Selenium主持的W3C的一个标准。利用浏览器原生的API来与浏览器进行交互。使用了Client-Server的模式,还实现了一个基于HTTP的服务,对selenium提供了一套API。不同了浏览器的厂商提供自己对应的webdriver,Chrome的Chromedriver,Firefox就有专门的FirefoxDriver等,但是对外提供的API是一致的。Webdriver可以通过浏览器原生的API,对浏览器进行各种操作,由于是厂商自己提供的,稳定性、可靠性和安全性都是有保障的。
三、浏览器
常见的浏览器IE、Microsoft Edge、Chrome/Chromium、Firefox、Safari等,selenium都支持。Chrome和Chromium对比:
| Chromium | Chrome |
|---|---|
| 开源项目 | 不是开源项目 |
| 开发版,更新速度快,会添加新功能,性能稍低 | 是正式版,更新速度慢,比较稳定,性能高 |
| 没有自动更新 | 联网可以检测更新 |
四、Selenium工作原理

各个浏览器厂商根据WebDriver协议实现各自浏览器的webdriver,webdriver是可以向selenium客户端提供统一http接口的,常见的开发语言都可以实现selenium客户端Python、Java、C#等。
Webdriver协议接口 https://www.w3.org/TR/webdriver1/#list-of-endpoints
以Python selenium为例,实现了相关的接口协议

可以看出selenium支持多种浏览器。

调用Chrome浏览器时,selenium初始化过程中先,将chromedriver作为参数初始化Server类,并且执行start方法。


进到start方法中可以看到,执行了一个CMD的命令,就是在启动chromedriver.exe服务。

在初始化Server过程中起到了给chromedriver指定了一个空闲的端口号。


可以看到后台进程chromedriver进程并且监听51650端口

Selenium 发送http请求给webdriver,启动浏览器(有些网站反爬策略,会监控是否是webdriver驱动的浏览器)

当打开一个网页是调用get方法,其实是给webdriver发送对应的http请求

五、反爬检测
1、 检测浏览器指纹
检测网站 https://bot.sannysoft.com/,左边是selenium启动的chromium,右边是手动启动。


2、 浏览器启动参数
查看命令 wmic process where caption=“chrome.exe” get caption,commandline /value
Selenium通过webdriver启动浏览器参数

手动启动浏览器参数

3、检测浏览器驱动
如果使用webdriver启动的浏览器,会被检测window.navigator.webdriver

4、 检测webdriver特征
Webdriver源码:

检测结果淘宝滑动验证失败:

通过js可以看出对webdriver的特征检测等

六、优化方案
1、 给webdriver添加日志选项,方便出问题时定位分析。

2、 使用undetected_chromedriver隐藏特殊标识
1)、打开浏览器的时,注入js修改webdriver属性值。

3、 修改webdriver二进制文件中的特征值

4、 先启动浏览器,然后再使用webdriver连接控制。
七、扩展(Chrome DevTools Protocol)
谷歌浏览器开发协议,Chrome DevTools 就是一个 Web 服务工具,它通过使用 Chrome DevTools Protocol 与后端进行交互。浏览器启动时加上参数 --remote-debugging-port={port}就可以通过发送http和websocket请求直接控制浏览器。
启动浏览器chrome.exe --remote-debugging-port=9255
发送请求查看浏览器信息,包含websocket连接url。

新建浏览器标签页,其中页包含了新标签页的websocket连接url。

Cdp开源信息 https://github.com/ChromeDevTools/awesome-chrome-devtools 支持的语言和第三方库。

Python的第三方库
- Pychrome调用简单,但是版本较老,很久没有维护,(网捕手也集成这个库)
- Pyppeteer是用python改写官方提供的js代码,支持异步,使用广泛容易被反爬策略识别。
相关文章:
selenium工作原理和反爬分析
一、 Selenium Selenium是最广泛使用的开源Web UI(用户界面)自动化测试套件之一,支持并行测试执行。Selenium通过使用特定于每种语言的驱动程序支持各种编程语言。Selenium支持的语言包括C#,Java,Perl,PHP,Python和Ru…...
windows电脑安装系统后固态硬盘和机械硬盘的盘符号顺序显示错乱,解决方法
一、场景 由于电脑磁盘是SSD固态硬盘自己拓展的1T机械硬盘组成,固态硬盘分为C、D两个盘区,机械硬盘分为E、F两个盘区。为了提升运行速度,系统安装在C盘,安装完成后按照习惯盘区顺应该为C、D、E、F,但实际情况却是D、E…...
自定义控件的子控件布局(onLayout()方法)
onLayout()方法用于指定布局中子控件的位置,该方法通常在自定义的ViewGroup容器中重写。 重写onLayout()方法中的常用方法: getChildCount() 获取子控件数量 getChildAt( int index ) 获取指定index的子控件,返回View view.getVisibilit…...
vscode提取扩展出错xhr
在 Visual Studio Code (VSCode) 中提取扩展出现 XHR 错误通常意味着在下载扩展或进行扩展管理操作时出现了网络请求问题。XHR (XMLHttpRequest) 是一种用于在浏览器中进行 HTTP 请求的技术,通常用于获取数据或资源。在 VSCode 中,它也可用于管理扩展的下…...
Docker 笔记(上篇)
Docker 概述 Docker 概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之…...
python自动化测试(六):唯品会商品搜索-练习
目录 一、配置代码 二、操作 2.1 输入框“运动鞋” 2.2 点击搜索按钮 2.3 选择品牌 2.4 选择主款 2.5 适用性别 2.6 选择尺码 2.7 选择商品:(通过css的属性去匹配) 2.8 点击配送地址选项框 一、配置代码 # codingutf-8 from selen…...
深度强化学习用于博弈类游戏-基础测试与说明【1】
深度强化学习用于博弈类游戏-基础【1】 1. 强化学习方法2. 强化学习在LOL中的应⽤2.1 环境搭建2.2 游戏特征元素提取1)小地图人物位置:2)人物血量等信息3)在整个图像上寻找小兵、防御塔的位置4)自编码器提取3. 策略梯度算法简介参考资料1. 强化学习方法 伴随着人工智能的潮起…...
通过requests库使用HTTP编写的爬虫程序
使用Python的requests库可以方便地编写HTTP爬虫程序。以下是一个使用requests库的示例: import requests# 发送HTTP GET请求 response requests.get("http://example.com")# 检查响应状态码 if response.status_code 200:# 获取响应内容html response.…...
550MW发电机变压器组继电保护的整定计算及仿真
摘要 电力系统继电保护设计是根据系统接线图及要求选择保护方式,进行整定计算,电力系统继电保护的设计与配置是否合理直接影响到电力系统的安全运行。如果设计与配置不当,保护将不能正确工作,会扩大事故停电范围,造成…...
Linux 命令|服务器相关
1. 在公共 linux 上创建 python 虚拟环境 【精选】在公共Linux服务器上创建自己的python虚拟环境_服务器创建自己的环境-CSDN博客 2. 查看现存的状态,看有没有程序在跑 nvidia-smi命令详解-CSDN博客 3. 上传本地文件到服务器 在本地 Mac 计算机的终端中&#x…...
node 第十三天 express初见
express概念 Fast, unopinionated, minimalist web framework for Node.js 快速、独立、极简的 Node.js Web 框架。 express相当于前端的jquery, 在不更改不侵入原生node的基础上封装了大量易用且实用的服务端api, express框架的封装原理就是前面第十天我们自己封装的简易服务器…...
Python selenium模块简介
视频版教程:一天掌握python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium 有些网站的数据是js动态渲染的,我们无法通过网页源码直接找到数据,只能通过找接口方式来获取数据,但是很多时候,数据又是json格式的…...
DIY相机(一)libcamera库
相机选型 DIY相机首先是要确定使用的相机型号。兼容树莓派,画质好一些的,目前主要有两款:一是Raspberry Pi Camera Module 3,二是Raspberry Pi HQ Camera。 下图是Raspberry Pi Camera Module 3的相关特性。支持自动对焦和HDR等…...
PHP简单实现预定义钩子和自定义钩子
在PHP中,钩子(Hooks)是一种机制,允许开发人员在特定的时机插入自定义代码。通过使用钩子,开发人员可以在应用程序的特定事件发生时执行自定义的功能或逻辑 钩子有两种类型:预定义钩子和自定义钩子。 预定…...
笔记本电脑的摄像头找不到黑屏解决办法
这种问题一般来说就是缺少驱动,就要下载驱动。 问题: 解决办法: 1.进入联想官网下载驱动 网站:https://newsupport.lenovo.com.cn/driveDownloads_index.html?v9d9bc7ad5023ef3c3d5e3cf386e2f187 2.下载主机编号检测工具 3.下…...
【Git】HEAD detached from xxx 问题及解决方案
问题背景 最近用git的时候遇到了一个问题,场景是这样的。 我有一个分支main,其中有两个commit A和B,A是最新commit,B是历史commit。我先切到B看了看之前的代码,然后切到A,并进行了一些代码修改࿰…...
Cannot connect to the Docker
执行docker基础命令失败! Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 原因:docker服务没有启动。 解决方法:执行 systemctl start docker 即可。...
校园物业报修小程序开发笔记一
背景 校园规模和复杂性: 大型学校和校园通常拥有众多的建筑物、设施和设备,需要有效的维护和报修系统,以满足学生、教职员工和校园管理人员的需求。 学生和员工需求: 学生和员工在校园内可能遇到各种维修问题,如故障的…...
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
🧸注:不要看我的文件多,那是我的其他项目,这个项目所用的文件我会全部用红框框起来,没框的部分不用管,前端两个文件,后端一个文件 📜 目录 首先,定义前后端交互接口 然…...
FFmpeg5.1.3编译动态库踩坑之旅(基于Linux虚拟机)
准备工作 环境准备 1.Windows安装Oracle VM VirtualBox 7.0.10,安装ubuntu-22.04.3。 坑一:无法往虚拟机里拖放复制文件,解决办法:登录Ubuntu虚拟机时切换到xorg方式登录,参考地址:Ubuntu Desktop 22.04…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
