selenium通过performance log获取状态码,Conten-Type,以及重定向路径
selenium的官方不提供获取状态码,Conten-Type,以及重定向路径的方法,并且官方说这些功能将来也不会有。java - How to get HTTP Response Code using Selenium WebDriver - Stack Overflow
非官方的方法大概有下面几种
1.通过requests重新请求一遍url,获取response里面的状态码
2.通过中间代理服务器来获取,比如selenium-wire,selenium-wire里面内建了一个代理服务器,通过代理服务器可以获取各个请求的状态码
3.通过分析chrome的performance log来获取状态码以及重定向路径
1的方法会多访问一遍网络,并且不能支持mata或js的重定向。2的方法只访问一次网络,但同样不能支持mata或js的重定向,只有3的方法只访问一次网络可以获取所有的状态。
并且1的方法在python环境上打开一些https网站还有如下bug
ssl.SSLError: [SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:1131) · Issue #2653 · urllib3/urllib3 · GitHuby
这个问题的原因是This error comes up when using OpenSSL 3 to connect to a server which does not support it. The solution is to downgrade the cryptography package in python:
python - SSL error unsafe legacy renegotiation disabled - Stack Overflow
要么修改openssl.cnf,要么降级cryptography,要么设置ctx,根据我测试的结果只有修改cnf才能彻底解决,最简单的方法是在cnf后面加上Options = UnsafeLegacyRenegotiation
如果使用docker应该写成这样
RUN echo 'Options = UnsafeLegacyRenegotiation' >> /usr/lib/ssl/openssl.cnf
如何通过performance log来获取状态
performanceLog.py
import jsondef getHeader(headers,header):for key,value in headers.items():if key.lower()==header:return valuereturn ''
def getRedirectPath(driver):redirctPath=[]requestDic={}frameId=Nonefor entry_json in driver.get_log('performance'):entry = json.loads(entry_json['message'])# print(entry)if entry['message']['method'] == 'Network.requestWillBeSent':if entry['message']['params']['loaderId']==entry['message']['params']['requestId'] and (frameId is None or frameId==entry['message']['params']['frameId']):# print(entry)if frameId is None:frameId=entry['message']['params']['frameId']if entry['message']['params']['redirectHasExtraInfo']:# 设置重定向前的状态item=redirctPath[len(redirctPath)-1]item['status']=entry['message']['params']['redirectResponse']['status']item['reason']='location'item['contentType']=getHeader(entry['message']['params']['redirectResponse']['headers'],'content-type')item={'url':entry['message']['params']['request']['url'],'status':'','reason':'','contentType':''}requestDic[entry['message']['params']['requestId']]=itemredirctPath.append(item)elif entry['message']['method'] == 'Network.responseReceived' and entry['message']['params']['requestId'] in requestDic:# print(entry)item=requestDic[entry['message']['params']['requestId']]item['status']=entry['message']['params']['response']['status']item['contentType']=getHeader(entry['message']['params']['response']['headers'],'content-type')elif entry['message']['method'] == 'Page.frameRequestedNavigation' and frameId==entry['message']['params']['frameId']:# print(entry)# 设置重定向前的状态item=redirctPath[len(redirctPath)-1]item['reason']=entry['message']['params']['reason']return redirctPath
后来发现一些网站不能获取contentType,原因是header需要忽略大小写,修改了一下代码。当然你自己修改代码后可以获取任何你需要的header。
各个事件的顺序大致如下
Page.frameStartedLoading
Network.requestWillBeSent
Network.responseReceived
Network.dataReceived
Page.frameNavigated
Network.requestServedFromCache
Network.loadingFinished
Network.resourceChangedPriority
Page.domContentEventFired
Network.loadingFailed
Page.loadEventFired
Page.frameStoppedLoading
注释:Page.frameScheduledNavigation已经被废弃,改成Page.frameRequestedNavigation
官方对performance log的文档很少,在网上也没有找到类似的讨论,上面的代码完全是我根据数据分析出来的,目前看来是对的,如果不对请告诉我。
Chrome DevTools Protocol - version 1-2 - Page domain
测试代码
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import time
from performanceLog import getRedirectPathcaps = DesiredCapabilities.CHROME
caps['goog:loggingPrefs'] = {'performance': 'ALL'}
options = webdriver.ChromeOptions()
# 必须是headless=new,否则download.default_directory不起作用
options.add_argument('--headless=new')
# 下面这些参数是必须的,否则可能出错
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')driver = webdriver.Chrome(options=options,desired_capabilities=caps)driver.get('http://localhost/redirect')
# 必须等待几秒钟,否则metaTagRefresh不起作用
time.sleep(3)print(getRedirectPath(driver))
driver.quit()
输出结果
[{
'url': 'http://localhost/redirect',
'status': 302,
'reason': 'location',
'contentType': 'text/html; charset=utf-8'
}, {
'url': 'http://localhost/static/index3.html',
'status': 200,
'reason': 'scriptInitiated',
'contentType': 'text/html'
}, {
'url': 'http://localhost/static/redirect.html',
'status': 200,
'reason': 'metaTagRefresh',
'contentType': 'text/html'
}, {
'url': 'http://localhost/',
'status': 200,
'reason': '',
'contentType': 'text/html; charset=utf-8'
}]
可以看出这里面有3种不同类型的重定向,location的通常的重定向,后面2种用requests或者代理都无法获取。
location:response header里面的location重定向
scriptInitiated:js重定向
metaTagRefresh:meta tag重定向
相关文章:
selenium通过performance log获取状态码,Conten-Type,以及重定向路径
selenium的官方不提供获取状态码,Conten-Type,以及重定向路径的方法,并且官方说这些功能将来也不会有。java - How to get HTTP Response Code using Selenium WebDriver - Stack Overflow 非官方的方法大概有下面几种 1.通过requests重新请…...

GL绘制自定义线条3_自定义线帽
安卓Path搭配Paint可以设置线帽,我想能不能把我自己的线条绘制Demo也加上类似的功能。 线头规则描述: 1、设一个线宽一半的线段,坐标为(0, 0)到(-lineWidth / 2, 0)。 2、设步骤1的线段有一垂直于它的向量(0,1),然后传…...

【AGC】新版鸿蒙崩溃SDK集成使用方法
【背景】 我们知道AGC的Crash SDK都是需要强制集成华为分析SDK的,在使用时的崩溃数据上报都要依靠分析服务来完成,这就容易受到限制,有时出现无数据的情况就要依次排查崩溃SDK与分析SDK,比较麻烦。而就在不久前,鸿蒙崩…...

vue-7:组件库(移动端vant)(PC端element)
移动端vant 插件安装(按需导入) 重启生效 # 通过 npm 安装 npm i unplugin-vue-components -D# 通过 yarn 安装 yarn add unplugin-vue-components -D 导入基于 vite 的项目: 如果是基于 vite 的项目,在 vite.config.js 文件中…...
JavaScript中splice()、slice()、split()三种方法的区别,及使用详细
简介:splice、slice、split是JavaScript中,比较常用的三个数组方法,表面看起来有点相像,用处却大不相同,今天就来分别介绍下它们的用法。 1、splice()方法 splice方法可以用来删除数组中的元素,或者向数组…...
Linux更新操作系统Openssh版本9.3p1(源码编译安装)
Linux更新操作系统Openssh版本9.3p1(源码编译安装) 部署前准备 安装依赖 yum install -y gcc gcc-c glibc make autoconf openssl openssl-devel pcre-devel pam-develyum install -y pam* zlib* openssh-9.3p1.tar.gzopenssl-3.1.0.tar.gz备份文件 cp /etc/pam.d/sshd /etc/…...

MS COCO数据集介绍
MS COCO数据集介绍 MS COCO全称是Microsoft Common Objects in Context,是由微软开发维护的大型图像数据集,包括不同检测任务: Object Detection([主要处理人、车、大象等]) DensePose(姿态密度检测&…...

Java之线程池
目录 一.上节复习 1.阻塞队列 二.线程池 1.什么是线程池 2.为什么要使用线程池 3.JDK中的线程池 三.工厂模式 1.工厂模式的目的 四.使用线程池 1.submit()方法 2.模拟两个阶段任务的执行 五.自定义一个线程池 六.JDK提供线程池的详解 1.如何自定义一个线程池? 2.创…...
让你的网站变得更智能 - B2 Pro主题问答模块新增OpenAI ChatGPT机器人自动回答功能
作为一个网站管理员,你一定会希望能够给你的用户提供更多、更好的服务。那么,你是否曾经想过为你的B2 Pro主题问答模块新增一个智能机器人自动回答功能呢?相信你一定想要这个功能,因为它能够大大提升你网站的用户体验。 现在,我们为你提供了一个好消息。我们已经为B2 Pro…...

仓库信息管理系统设计与实现
一、数据库设计 1.数据库模型设计概览 2.数据库表设计 ①depository 描述: 该表存储仓库的信息,比如仓库名称,仓库地址和仓库介绍 表结构: 序号 字段名 数据类型 主键 非空 默认值 描述 1 id INT(10) 是 是 2…...

初识Java多线程编程
文章目录 一、线程的状态二、线程的常见属性三、多线程编程Thread类常用构造方法1.继承Thread类2.实现Runnable接口3.匿名内部类实现4.lambda 表达式创建 Runnable 子类对象 四、线程的常见方法 一、线程的状态 //线程的状态是一个枚举类型 Thread.State public class ThreadS…...

最新入河排污口设置论证、水质影响预测与模拟、污水处理工艺分析及典型建设项目入河排污口方案报告书实例分析
随着水资源开发利用量不断增大,全国废污水排放量与日俱增,部分河段已远远超出水域纳污能力。近年来,部分沿岸入河排污口设置不合理,超标排污、未经同意私设排污口等问题逐步显现,已威胁到供水安全、水环境安全和水生态安全&#x…...

awk指令的详细指南
目录 工作原理 命令格式 awk常见的内建变量(可直接用)如下所示 按行输出文本 按字段输出文本 通过管道、双引号调用 Shell 命令 示例 CPU使用率 数组 编辑统计文件的内容出现的次数 使用awk 统计secure 访问日志中每个客户端IP的出现次数? …...

解密Netty中的Reactor模式
文章目录 单线程Reactor模式多线程Reactor模式Reactor模式中IO事件的处理流程Netty中的通道ChannelNetty中的反应器ReactorNetty中的处理器HandlerNetty中的通道Channel和处理器Handler的协作组件Pipeline Reactor(反应器)模式是高性能网络编程在设计和架构方面的基础模式.Doug…...
这是一个黑科技:C++爬虫~(文末报名C/C++领域新星计划)
目录 写在前面 完整代码 这里必看!! 写在最后 写在前面 现在所有人都知道万能的Python可以做机器学习,可以做人工智能,可以爬取各种小网站,但是你不知道,基于C++的正则表达式早就能够爬取各种网络数据啦!!你没猜错,阿玥将在这篇文章中简介怎么用C...

2023 年第八届数维杯数学建模挑战赛 赛题浅析
为了更好地让大家本次数维杯比赛选题,我将对本次比赛的题目进行简要浅析。本次比赛的选题中,研究生、本科组请从A、B题中任选一个 完成答卷,专科组请从B、C题中任选一个完成答卷。这也暗示了本次比赛的难度为A>B>C 选题人数初步估计也…...

Spring Boot单元测试
什么是单元测试? 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证的过程就叫单元测试。 单元测试是开发人员编写的一小段代码,用于检验被测代码的一个很小的、很明确的(代码) 功能是否正确。执行单元测试就是为了证明某…...

实景三维浪潮翻涌,新技术“席卷”石家庄!
5月11日,“全自主、全流程、全覆盖”2023实景三维新技术研讨会石家庄站暨航测与遥感学术交流会在石家庄凯旋金悦大酒店圆满举行。 本次会议由中国测绘学会、中国地理信息产业协会指导,河北省测绘学会、河北省地理信息产业协会主办,武汉大势智…...
【Python】使用小脚本
本文整理了我在学习和工作中用到的实用python脚本,希望也能帮助到需要的小伙伴~ 文章目录 视频格式转换顺序遍历文件夹中的文件 视频格式转换 安装视频处理库moviepy pip install moviepy安装FFmpeg(FFmpeg是一个开源的多媒体框架,moviepy…...
技术日志2023-5-18
1、Java远程调试 可参考:https://kefeng.wang/2018/03/06/idea-remote-debug/ 2、用户中心这样的基础项目有什么用,感觉非常鸡肋。 今天开发讨论中涉及到了用户中心,感觉在项目中使用用户中心只是给业务系统发一个token,业务系…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...

tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...