当前位置: 首页 > news >正文

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对比:

ChromiumChrome
开源项目不是开源项目
开发版,更新速度快,会添加新功能,性能稍低是正式版,更新速度慢,比较稳定,性能高
没有自动更新联网可以检测更新

四、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的第三方库

  1. Pychrome调用简单,但是版本较老,很久没有维护,(网捕手也集成这个库)
  2. 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,并进行了一些代码修改&#xff0…...

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…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

PHP和Node.js哪个更爽?

先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...