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

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

以下是如何使用 seleniumwire 来获取响应数据的步骤:

1. 安装 seleniumwire

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

python 复制代码
pip install seleniumwire

2. 编写代码

使用 seleniumwire 类似于使用 Selenium,但你需要从 seleniumwire 而不是 selenium 导入 WebDriver。

a.获得某一接口的请求参数

python 复制代码
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.获得某一接口的响应数据

简单版:

python 复制代码
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()

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

python 复制代码
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

修改后的代码

python 复制代码
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()
相关推荐
2401_894828128 小时前
从原理到实战:随机森林算法全解析(附 Python 完整代码)
开发语言·python·算法·随机森林
B站计算机毕业设计超人8 小时前
计算机毕业设计Python知识图谱中华古诗词可视化 古诗词情感分析 古诗词智能问答系统 AI大模型自动写诗 大数据毕业设计(源码+LW文档+PPT+讲解)
大数据·人工智能·hadoop·python·机器学习·知识图谱·课程设计
玄同7658 小时前
Python「焚诀」:吞噬所有语法糖的终极修炼手册
开发语言·数据库·人工智能·python·postgresql·自然语言处理·nlp
johnny2338 小时前
Python管理工具:包、版本、环境
python
羽翼.玫瑰8 小时前
关于重装Python失败(本质是未彻底卸载Python)的问题解决方案综述
开发语言·python
cdut_suye8 小时前
解锁函数的魔力:Python 中的多值传递、灵活参数与无名之美
java·数据库·c++·人工智能·python·机器学习·热榜
木头左9 小时前
指数期权备兑策略量化实现
python
小镇学者9 小时前
【python】python项目是如何部署到服务器上的
服务器·python·github
weixin_462446239 小时前
使用 jsr:@langchain/pyodide-sandbox 构建 Python 安全沙箱(完整入门教程)
python·安全·langchain·sandbox
Loo国昌10 小时前
【LangChain1.0】第九阶段:文档处理工程 (LlamaIndex)
人工智能·后端·python·算法·langchain