python 使用seleniumwire获取响应数据以及请求参数

seleniumwire 是一个在 Selenium WebDriver 基础上扩展的库,它允许你在使用 Selenium 进行网页自动化测试或爬虫时捕获和修改 HTTP 请求和响应。这对于需要分析网页数据或进行更复杂的网络交互的自动化任务特别有用。
以下是如何使用 seleniumwire 来获取响应数据的步骤:

1. 安装 seleniumwire

首先,确保你已经安装了 Selenium。然后,你可以通过 pip 安装 seleniumwire:

pip install seleniumwire

2. 编写代码

使用 seleniumwire 类似于使用 Selenium,但你需要从 seleniumwire 而不是 selenium 导入 WebDriver。
a.获得某一接口的请求参数

from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
import urllib.parse

# 设置 WebDriver 的路径(如果使用的是 ChromeDriver)
# 注意:根据你的系统环境,这里的路径可能需要调整
executable_path = 'path/to/your/chromedriver'
print(executable_path)
service = Service(executable_path=executable_path)

# 初始化 WebDriver
driver = webdriver.Chrome(service=service)

# 访问一个网页
driver.get('http://example.com')

# 获取请求数据
for request in driver.requests:
    if '你的接口url' in request.url:#if 'https://fp.tongdun.net/web3_8/profile.json?' in request.url:
        params_ = dict(
            urllib.parse.parse_qsl(urllib.parse.urlsplit(request.url).query))
        print(params_)


# 获取并打印页面源代码(作为响应体的一部分)


# 关闭浏览器
driver.quit()


a.获得某一接口的响应数据

简单版:

from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service

import urllib.parse

# 设置 WebDriver 的路径(如果使用的是 ChromeDriver)
# 注意:根据你的系统环境,这里的路径可能需要调整
executable_path = 'path/to/your/chromedriver'
print(executable_path)
service = Service(executable_path=executable_path)

# 初始化 WebDriver
driver = webdriver.Chrome(service=service)

# 访问一个网页
driver.get('http://example.com')

# 获取请求数据
for request in driver.requests:
    if '你的接口url' in request.url:#if 'https://fp.tongdun.net/web3_8/profile.json?' in request.url:
        if request.response:
            print(
                request.url,
                request.response.status_code,
                request.response.headers['Content-Encoding'],#检查响应头中的Content-Encoding字段来确定响应内容是否被什么格式压缩

                request.response.headers['Content-Type'],
                len(request.response.body)#request.response.body.decode('utf-8') 有些情况需要加上编码格式
            )


# 获取并打印页面源代码(作为响应体的一部分)


# 关闭浏览器
driver.quit()

上面简单版有时候会报错:

Traceback (most recent call last):
  File "C:\limeixue\workspace\offical_crawl_hx\hx_offical_crawl_yidun\apps\test\tt.py", line 26, in <module>
    len(request.response.body.decode('utf-8'))#request.response.body.decode('utf-8') 有些情况需要加上编码格式
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

这个时候需要观察 request.response.headers[‘Content-Encoding’]返回的值是否有被压缩过。如果有,假如是:gzip

修改后的代码

from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service


import gzip
import io


# 设置 WebDriver 的路径(如果使用的是 ChromeDriver)
# 注意:根据你的系统环境,这里的路径可能需要调整
executable_path = 'path/to/your/chromedriver'

service = Service(executable_path=executable_path)

# 初始化 WebDriver
driver = webdriver.Chrome(service=service)

# 访问一个网页
driver.get('http://example.com')

# 获取请求数据
for request in driver.requests:
    if 'https://fp.tongdun.net/web3_8/profile.json?' in request.url:#if 'https://fp.tongdun.net/web3_8/profile.json?' in request.url:
        if request.response:
            Content_Encoding = request.response.headers['Content-Encoding']#检查响应头中的Content-Encoding字段来确定响应内容是否被什么格式压缩
            Content_Type= request.response.headers['Content-Type']
            url = request.url
            status_code = request.response.status_code
            print(status_code,Content_Encoding,Content_Type)
            if Content_Encoding=='gzip':
                # 方法一:
                compressed_stream = io.BytesIO(request.response.body)#request.response.body是二进制
                gzipper = gzip.GzipFile(fileobj=compressed_stream)
                decompressed_data = gzipper.read()


                # 现在您可以使用 decompressed_data 变量中的解压缩数据了
                # 例如,您可以将其打印出来(但请注意,它可能是二进制数据或文本,具体取决于原始内容)
                result = decompressed_data.decode('utf-8', errors='ignore') if decompressed_data else ""
                print(result)

                #方法二:

                decompressed_data = gzip.decompress(request.response.body)  #这样写不用去管request.response.body是不是二进制
                # 处理解压后的数据
                data_as_text = decompressed_data.decode('utf-8')
                print(data_as_text)



# 获取并打印页面源代码(作为响应体的一部分)


# 关闭浏览器
driver.quit()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/878757.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt多元素控件——QTreeWidget

文章目录 QTreeWidgetQTreeWidget核心方法及信号QTreeWidgetItem核心属性及方法 QTreeWidget使用示例 QTreeWidget QTreeWidget表示树形控件&#xff0c;里面每个元素都是一个QTreeWidgetItem&#xff0c;每个QTreeWidgetItem可以包含多个文本和图标&#xff0c;每个文本/图标…

SEGGERS实时系统embOS推出Linux端模拟器

SEGGER 发布了两个新的 embOS 仿真模拟器&#xff1a;embOS Sim Linux 和 embOS-MPU Sim Linux。 通过模拟 Linux 主机系统上的硬件&#xff0c;取代物理硬件&#xff0c;为开发人员提供了一种无缝的方式来构建原型和测试应用程序。 embOS Sim Linux 端口支持 32 位和 64 位系…

第313题|解积分不等式题目的5种方法常用方法|武忠祥老师每日一题

解题思路&#xff1a;把多阶次积分和函数值联系起来&#xff0c;应该想到泰勒公式。 本题应该使用带有拉格朗日余项的泰勒公式&#xff1a; 方法一&#xff1a; 等式左右两边进行积分&#xff0c;右边第一项常数项不变&#xff0c;第二项&#xff08;x-1/2&#xff09;积完之…

371. 两整数之和

目录 一&#xff1a;题目&#xff1a; 二&#xff1a;代码&#xff1a; 三&#xff1a;结果&#xff1a; 一&#xff1a;题目&#xff1a; 给你两个整数 a 和 b &#xff0c;不使用 运算符 和 - &#xff0c;计算并返回两整数之和。 示例 1&#xff1a; 输入&#xff1a;…

★ C++进阶篇 ★ 多态

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将继续和大家一起学习C进阶篇第一章----多态 ~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页&#xff1a;椎名澄嵐-CSDN博客 C基础篇专栏&#xff1a;★ C基础篇 ★_椎名澄嵐的博客-CSDN博客 …

Gitea Action 简单配置(CI/CD)

线上pipeline,&#xff08;我使用是本地仓库的&#xff0c;你们使用切换成官网的即可&#xff09; # 工作流的名称name: Build and Push Docker Image deployment-k8s# 触发条件&#xff0c;只在 master 或 main 分支发送推送时触发 on:push:branches:- main# 作业&#xff0c…

深入理解Docke工作原理:UnionFS文件系统详解

在容器技术的世界中&#xff0c;文件系统的设计和实现是其关键组成部分&#xff0c;影响着镜像的构建效率、容器的启动速度以及资源的利用率。**UnionFS&#xff08;联合文件系统&#xff09;**作为Docker的核心文件系统技术&#xff0c;通过其独特的分层结构和写时复制&#x…

mac系统安装最新(截止2024.9.13)Oracle JDK操作记录

文章目录 下载JDK22配置环境变量验证环境变量是否生效整体命令如下 下载JDK22 打开最新版Oracle JDK下载地址 选择想要安装的JDK版本&#xff0c;然后选择适合兼容Mac机器的版本&#xff08;Intel/arm&#xff09;&#xff0c;建议直接下载安装程序&#xff0c;可视化安装 默…

网络安全实训八(y0usef靶机渗透实例)

1 信息收集 1.1 扫描靶机IP 1.2 收集靶机的端口开放情况 1.3 探测靶机网站的目录 1.4 发现可疑网站 1.5 打开可疑网站 2 渗透 2.1 使用BP获取请求 2.2 使用工具403bypasser.py探测可疑网页 2.3 显示可以添加头信息X-Forwarded-For:localhost来访问 2.4 添加之后转发&#xff…

Java入门,初识Java

Java背景知识 Java是早期美国 sun 公司&#xff08;Stanford University Network&#xff09;在1995年推出的一门计算机高级编程语言。Java早期称为Oak&#xff08;中文翻译为&#xff1a;橡树&#xff09;&#xff0c;后期改名为Java。&#xff08;因为当时sun公司门口有很多…

使用ENVI之辐射定标

将下载好的遥感影像导入遥感影像处理软件ENVI 5.6中 使用ENVI 5.6的Toolbox中的Radiometric Calibration工具 跳出的Date Input File界面中选中要进行辐射定标的文件选中 再在跳出的Radiometric Calibration界面中将Output Interleave改为BIL再点击Apply FLAASH Settings Soale…

初始爬虫7

针对数据提取的项目实战&#xff1a; 补充初始爬虫6的一个知识点&#xff1a; etree.tostring能够自动补全html缺失的标签&#xff0c;显示原始的HTML结构 # -*- coding: utf-8 -*- from lxml import etreetext <div> <ul> <li class"item-1">…

基于Boost库的搜索引擎开发实践

目录 1.项目相关背景2.宏观原理3.相关技术栈和环境4.正排、倒排索引原理5.去标签和数据清洗模块parser5.1.认识标签5.2.准备数据源5.3.编写数据清洗代码parser5.3.1.编写读取文件Readfile5.3.2.编写分析文件Anafile5.3.2.编写保存清洗后数据SaveHtml5.3.2.测试parser 6.编写索引…

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介 1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 &#xff08;OTA&#xff09; 3在线编程&#xff08;ICP把整个程序都更新掉&#xff09; 1 系统的Bootloader写死了&#xff0c;只能用串口下载到指定的位置&a…

从基础到进阶:利用EasyCVR安防视频汇聚平台实现高效视频监控系统的五步走

随着科技的飞速发展&#xff0c;视频监控技术在社会安全、企业管理、智慧城市构建等领域扮演着越来越重要的角色。一个高效智能的视频监控管理系统不仅能够提升监控效率&#xff0c;还能在预防犯罪、事故预警、数据分析等方面发挥巨大作用。 一、需求分析 在设计视频监控管理…

sql中索引查看是否生效

在pg数据库中有多种索引存在&#xff0c;在一般情况下我们取使用普通索引 以下是一些常见导致索引未命中的原因和优化策略 1.如果查询中的条件与索引字段的顺序不匹配&#xff0c;或者索引字段没有完全包含在查询条件中&#xff0c;索引可能不会被使用。 2.在查询中使用函数…

【Python 数据分析学习】Matplotlib 的基础和应用

题目 1 Matplotlib 主要特性2 Matplotlib 基础知识2.1 导入模块2.2 图形构成2.2.1 图形&#xff08;Figure&#xff09;2.2.2 轴 &#xff08;Axes&#xff09;2.2.3 轴线&#xff08;axis&#xff09; 2.5 中文设置2.5.1 借助rcParams修改字体实现设置2.5.2 增加一个fontprope…

结构体的内存对齐

对⻬规则&#xff1a; 1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处 2.其他成员变量要对⻬到某个数字&#xff08;对⻬数&#xff09;的整数倍的地址处。 对⻬数编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。 但一些编译器下并没有默认对其数 3.结…

Python 解析 JSON 数据

1、有如下 JSON 数据&#xff0c;存放在 data.json 文件&#xff1a; [{"id":1, "name": "小王", "gender": "male", "score": 96.8}, {"id":2, "name": "小婷", "gender&qu…

【踩坑】装了显卡,如何让显示器从主板和显卡HDMI都输出

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 背景介绍 装了显卡后&#xff0c;开机默认是从显卡的HDMI输出&#xff0c;但这很不方便。如何让视频仍然从主板输出&#xff1f;或者说让显卡HDMI和主板…