Selenium Wire 扩展Selenium的功能,让您能够检查浏览器发出的请求。
项目描述
Selenium Wire 扩展 Selenium的 Python绑定,为您提供访问浏览器底层请求的能力。您可以用与使用Selenium相同的方式编写代码,但您会获得额外的API来检查请求和响应,并在实时中对它们进行修改。
简单示例
from seleniumwire import webdriver # Import from seleniumwire
# Create a new instance of the Chrome driver
driver = webdriver.Chrome()
# Go to the Google home page
driver.get('https://www.google.com')
# Access requests via the `requests` attribute
for request in driver.requests:
if request.response:
print(
request.url,
request.response.status_code,
request.response.headers['Content-Type']
)
打印
https://www.google.com/ 200 text/html; charset=UTF-8
https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_120x44dp.png 200 image/png
https://consent.google.com/status?continue=https://www.google.com&pc=s×tamp=1531511954&gl=GB 204 text/html; charset=utf-8
https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png 200 image/png
https://ssl.gstatic.com/gb/images/i2_2ec824b0.png 200 image/png
https://www.google.com/gen_204?s=webaft&t=aft&atyp=csi&ei=kgRJW7DBONKTlwTK77wQ&rt=wsrt.366,aft.58,prt.58 204 text/html; charset=UTF-8
...
功能
纯Python,用户友好的API
捕获HTTP和HTTPS请求
截获请求和响应
在实时中修改头部、参数、正文内容
捕获WebSocket消息
支持HAR格式
支持代理服务器
兼容性
Python 3.7+
Selenium 4.0.0+
Chrome、Firefox、Edge和远程Webdriver支持
目录
安装
使用pip安装
pip install selenium-wire
如果您收到无法构建cryptography的错误,您可能正在运行pip的老版本。请尝试使用 python -m pip install --upgrade pip 升级pip,然后重新运行上述命令。
浏览器设置
除了确保您已下载适用于您浏览器的相关webdriver可执行文件并将其放置在系统PATH上的某个位置之外,不需要进行任何特定配置。
OpenSSL
Selenium Wire需要OpenSSL来解密HTTPS请求。这可能在您的系统上已经安装(您可以通过在命令行中运行 openssl version 来检查)。如果没有安装,您可以使用以下方式安装
Linux
# For apt based Linux systems
sudo apt install openssl
# For RPM based Linux systems
sudo yum install openssl
# For Linux alpine
sudo apk add openssl
MacOS
brew install openssl
Windows
不需要安装
创建Webdriver
确保您从 seleniumwire 包导入 webdriver
from seleniumwire import webdriver
然后就像您直接使用Selenium一样实例化webdriver。您可以为任何期望的功能或浏览器特定选项传递参数,例如可执行文件路径、无头模式等。Selenium Wire还有其自己的选项,这些选项可以通过 seleniumwire_options 属性传递。
# Create the driver with no options (use defaults)
driver = webdriver.Chrome()
# Or create using browser specific options and/or seleniumwire_options options
driver = webdriver.Chrome(
options = webdriver.ChromeOptions(...),
seleniumwire_options={...}
)
请注意,对于 webdriver 的子包,您应继续直接从 selenium 导入这些内容。例如,要导入 WebDriverWait
# Sub-packages of webdriver must still be imported from `selenium` itself
from selenium.webdriver.support.ui import WebDriverWait
远程Webdriver
Selenium Wire对使用远程webdriver客户端的支持有限。当您创建远程webdriver实例时,您需要指定运行Selenium Wire的机器(或容器)的主机名或IP地址。这允许远程实例通过其请求和响应与其请求回Selenium Wire。
options = {
'addr': 'hostname_or_ip' # Address of the machine running Selenium Wire. Explicitly use 127.0.0.1 rather than localhost if remote session is running locally.
}
driver = webdriver.Remote(
command_executor='http://www.example.com',
seleniumwire_options=options
)
如果运行浏览器的机器需要使用不同的地址与运行Selenium Wire的机器通信,您需要手动配置浏览器。有关此问题的更多详细信息,请参阅 此问题。
访问请求
Selenium Wire捕获浏览器发出的所有HTTP/HTTPS流量 [1]。以下属性提供了对请求和响应的访问权限。
- driver.requests
按时间顺序排列的捕获请求列表。
- driver.last_request
方便属性,用于获取最近捕获的请求。这比使用 driver.requests[-1] 更有效。
- driver.wait_for_request(pat, timeout=10)
此方法将等待直到看到匹配模式的请求。 pat 属性将在请求URL内进行匹配。pat 可以是一个简单的子串或正则表达式。请注意,driver.wait_for_request() 并不会 发送 请求,它只是 等待 上一个动作发送的请求,并将返回它找到的第一个请求。另外请注意,由于 pat 可以是正则表达式,您必须用斜杠转义特殊字符,例如将问号转义。如果在超时期间没有找到匹配项,将引发 TimeoutException。
例如,要等待在按钮点击后返回的AJAX请求
# Click a button that triggers a background request to https://server/api/products/12345/ button_element.click() # Wait for the request/response to complete request = driver.wait_for_request('/api/products/12345/')
- driver.har
一个JSON格式的HAR存档,包含了已经发生的HTTP交易。HAR捕获默认是关闭的,您必须在使用 driver.har 之前将 enable_har 选项 设置为 True。
- driver.iter_requests()
返回一个捕获请求的迭代器。当处理大量请求时非常有用。
- driver.request_interceptor
用于设置请求拦截器。参见 拦截请求和响应。
- driver.response_interceptor
用于设置响应拦截器。
清除请求
要清除之前捕获的请求和HAR条目,请使用 del
del driver.requests
请求对象
请求对象有以下属性。
- body
请求体,以 bytes 的形式。如果请求没有体,则 body 的值将为空,即 b''。
- cert
以字典格式表示的关于服务器SSL证书的信息。对于非HTTPS请求为空。
- date
请求的日期和时间。
- headers
类似字典的对象,包含请求头。头的大小写不敏感,允许重复。请求 request.headers['user-agent'] 将返回 User-Agent 头的值。如果您想替换一个头,请确保首先使用 del request.headers['header-name'] 删除现有的头,否则您将创建一个重复项。
- host
请求的主机,例如 www.example.com
- method
HTTP方法,例如 GET 或 POST 等。
- params
请求参数的字典。如果请求中存在同名参数,则其在字典中的值将是一个列表。
- path
请求路径,例如 /some/path/index.html
- querystring
查询字符串,例如 foo=bar&spam=eggs
- response
与请求相关联的 响应对象。如果没有响应,则此将为 None。
- url
请求URL,例如 https://www.example.com/some/path/index.html?foo=bar&spam=eggs
- ws_messages
如果请求是websocket握手请求(通常URL以 wss:// 开头),则 ws_messages 将包含发送和接收的任何websocket消息列表。参见 WebSocketMessage 对象。
请求对象有以下方法。
- abort(error_code=403)
使用提供的错误代码触发请求的立即终止。用于请求拦截器内。参见 示例:阻止请求。
- create_response(status_code, headers=(), body=b'')
创建一个响应并返回它,而不向远程服务器发送任何数据。用于请求拦截器内。参见 示例:模拟响应。
WebSocketMessage 对象
这些对象表示浏览器和服务器之间以及相反方向的websocket消息。它们在websocket握手请求的 request.ws_messages 中按列表保存。它们有以下属性。
- content
消息内容,可以是 str 或 bytes。
- date
消息的日期和时间。
- from_client
当消息由客户端发送时为True,当由服务器发送时为False。
响应对象
响应对象具有以下属性。
- body
响应体作为bytes。如果响应没有主体,则body的值将为空,即b''。有时服务器可能会压缩主体。您可以使用disable_encoding 选项来防止这种情况。要手动解码已编码的响应体,您可以进行以下操作:
from seleniumwire.utils import decode
body = decode(response.body, response.headers.get('Content-Encoding', 'identity'))
- date
响应接收的日期时间。
- headers
一个类似于字典的响应头对象。头名称不区分大小写,允许重复。请求response.headers['content-length']将返回Content-Length头的值。如果您想替换一个头,请确保先使用del response.headers['header-name']删除现有头,否则您将创建一个重复项。
- 原因
原因短语,例如OK或Not Found等。
- status_code
响应的状态码,例如200或404等。
截获请求和响应
除了捕获请求和响应之外,Selenium Wire 还允许您使用拦截器动态修改它们。拦截器是一个在请求和响应通过 Selenium Wire 时被调用的函数。在拦截器内部,您可以按需修改请求和响应。
您在使用驱动程序之前使用driver.request_interceptor和driver.response_interceptor属性设置您的拦截器函数。请求拦截器应接受一个参数,即请求。响应拦截器应接受两个参数,一个用于原始请求,一个用于响应。
示例:添加请求头
def interceptor(request):
request.headers['New-Header'] = 'Some Value'
driver.request_interceptor = interceptor
driver.get(...)
# All requests will now contain New-Header
如何检查头是否已正确设置?您可以在页面加载后使用driver.requests打印捕获的请求的头,或者将webdriver指向https://httpbin.org/headers,这将回显请求头到浏览器,以便您可以查看它们。
示例:替换现有请求头
在HTTP请求中允许重复的头名称,因此在设置替换头之前,您必须首先使用del删除现有头,如以下示例所示,否则将存在两个相同名称的头(request.headers是一个特殊的类似于字典的对象,允许重复)。
def interceptor(request):
del request.headers['Referer'] # Remember to delete the header first
request.headers['Referer'] = 'some_referer' # Spoof the referer
driver.request_interceptor = interceptor
driver.get(...)
# All requests will now use 'some_referer' for the referer
示例:添加响应头
def interceptor(request, response): # A response interceptor takes two args
if request.url == 'https://server.com/some/path':
response.headers['New-Header'] = 'Some Value'
driver.response_interceptor = interceptor
driver.get(...)
# Responses from https://server.com/some/path will now contain New-Header
示例:添加请求参数
请求参数与头的工作方式不同,因为它们在设置请求时被计算。这意味着您必须首先读取它们,然后更新它们,最后再将它们写回,如下例所示。参数存储在一个常规字典中,因此具有相同名称的参数将被覆盖。
def interceptor(request):
params = request.params
params['foo'] = 'bar'
request.params = params
driver.request_interceptor = interceptor
driver.get(...)
# foo=bar will be added to all requests
示例:更新POST请求体中的JSON
import json
def interceptor(request):
if request.method == 'POST' and request.headers['Content-Type'] == 'application/json':
# The body is in bytes so convert to a string
body = request.body.decode('utf-8')
# Load the JSON
data = json.loads(body)
# Add a new property
data['foo'] = 'bar'
# Set the JSON back on the request
request.body = json.dumps(data).encode('utf-8')
# Update the content length
del request.headers['Content-Length']
request.headers['Content-Length'] = str(len(request.body))
driver.request_interceptor = interceptor
driver.get(...)
示例:基本认证
如果网站需要用户名/密码,您可以使用请求拦截器向每个请求添加认证凭据。这将阻止浏览器显示用户名/密码弹出窗口。
import base64
auth = (
base64.encodebytes('my_username:my_password'.encode())
.decode()
.strip()
)
def interceptor(request):
if request.host == 'host_that_needs_auth':
request.headers['Authorization'] = f'Basic {auth}'
driver.request_interceptor = interceptor
driver.get(...)
# Credentials will be transmitted with every request to "host_that_needs_auth"
示例:阻止请求
您可以使用request.abort()来阻止请求并向浏览器发送立即响应。可以提供一个可选的错误代码。默认为403(禁止)。
def interceptor(request):
# Block PNG, JPEG and GIF images
if request.path.endswith(('.png', '.jpg', '.gif')):
request.abort()
driver.request_interceptor = interceptor
driver.get(...)
# Requests for PNG, JPEG and GIF images will result in a 403 Forbidden
示例:模拟响应
您可以使用request.create_response()向浏览器发送自定义回复。不会将数据发送到远程服务器。
def interceptor(request):
if request.url == 'https://server.com/some/path':
request.create_response(
status_code=200,
headers={'Content-Type': 'text/html'}, # Optional headers dictionary
body='<html>Hello World!</html>' # Optional body
)
driver.request_interceptor = interceptor
driver.get(...)
# Requests to https://server.com/some/path will have their responses mocked
您有其他认为可能有用的示例吗?请随时提交PR。
取消设置拦截器
要取消设置拦截器,请使用del
del driver.request_interceptor
del driver.response_interceptor
限制请求捕获
Selenium Wire 通过将浏览器流量通过它后台启动的内部代理服务器进行重定向来工作。当请求通过代理流动时,它们会被拦截和捕获。捕获请求可能会稍微减慢速度,但您可以通过做一些事情来限制要捕获的内容。
- driver.scopes
此功能接受一组正则表达式列表,用于匹配要捕获的URL。应在发出请求之前在驱动程序上设置。如果为空(默认值),则捕获所有URL。
driver.scopes = [ '.*stackoverflow.*', '.*github.*' ] driver.get(...) # Start making requests # Only request URLs containing "stackoverflow" or "github" will now be captured
请注意,即使请求超出了范围且未被捕获,它也会通过Selenium Wire传输。
- selemiwire_options.disable_capture
使用此选项关闭请求捕获。请求仍然会通过Selenium Wire和任何配置的上游代理,但不会截获或存储。请求拦截器将不会执行。
options = { 'disable_capture': True # Don't intercept/store any requests } driver = webdriver.Chrome(seleniumwire_options=options)
- selemiwire_options.exclude_hosts
使用此选项完全绕过Selenium Wire。对列在此处的地址发出的任何请求将直接从浏览器发送到服务器,而不涉及Selenium Wire。请注意,如果您已配置上游代理,则这些请求也将绕过该代理。
options = { 'exclude_hosts': ['host1.com', 'host2.com'] # Bypass Selenium Wire for these hosts } driver = webdriver.Chrome(seleniumwire_options=options)
- request.abort()
您可以在请求拦截器中使用 request.abort() 早期终止请求。这将立即向客户端发送响应,而无需请求进一步传输。您可以使用此机制来阻止某些类型的请求(例如图片)以提高页面加载性能。
def interceptor(request): # Block PNG, JPEG and GIF images if request.path.endswith(('.png', '.jpg', '.gif')): request.abort() driver.request_interceptor = interceptor driver.get(...) # Start making requests
请求存储
默认情况下,捕获的请求和响应存储在系统临时文件夹中(Linux上是/tmp,Windows上通常是C:\Users\<username>\AppData\Local\Temp)的名为.seleniumwire的子文件夹中。要更改创建.seleniumwire文件夹的位置,可以使用request_storage_base_dir选项。
options = {
'request_storage_base_dir': '/my/storage/folder' # .seleniumwire will get created here
}
driver = webdriver.Chrome(seleniumwire_options=options)
内存存储
Selenium Wire还支持仅在内存中存储请求和响应,这在某些情况下可能很有用 - 例如,如果您正在运行生命周期较短的Docker容器,并且不希望磁盘持久化带来开销。您可以通过将request_storage选项设置为memory来启用内存存储。
options = {
'request_storage': 'memory' # Store requests and responses in memory only
}
driver = webdriver.Chrome(seleniumwire_options=options)
如果您担心可能消耗的内存量,可以使用request_storage_max_size选项限制存储的请求数量。
options = {
'request_storage': 'memory',
'request_storage_max_size': 100 # Store no more than 100 requests in memory
}
driver = webdriver.Chrome(seleniumwire_options=options)
当达到最大大小时,较老的请求会在新的请求到达时被丢弃。请注意,如果您限制了存储的请求数量,则请求可能会在您使用driver.requests或driver.wait_for_request()等检索它们之前已从存储中消失。
代理
如果您访问的网站位于代理服务器后面,您可以在传递给webdriver的选项中告知Selenium Wire有关该代理服务器。
配置采用以下格式
options = {
'proxy': {
'http': 'http://192.168.10.100:8888',
'https': 'https://192.168.10.100:8888',
'no_proxy': 'localhost,127.0.0.1'
}
}
driver = webdriver.Chrome(seleniumwire_options=options)
要使用HTTP基本身份验证与代理一起使用,请在URL中指定用户名和密码
options = {
'proxy': {
'https': 'https://user:pass@192.168.10.100:8888',
}
}
对于除基本身份验证之外的身份验证,您可以使用custom_authorization选项提供Proxy-Authorization头的完整值。例如,如果您的代理使用Bearer方案
options = {
'proxy': {
'https': 'https://192.168.10.100:8888', # No username or password used
'custom_authorization': 'Bearer mytoken123' # Custom Proxy-Authorization header value
}
}
关于Proxy-Authorization头的更多信息,请参见此处。
代理配置也可以通过名为HTTP_PROXY、HTTPS_PROXY和NO_PROXY的环境变量加载。
$ export HTTP_PROXY="http://192.168.10.100:8888"
$ export HTTPS_PROXY="https://192.168.10.100:8888"
$ export NO_PROXY="localhost,127.0.0.1"
SOCKS
使用SOCKS代理与使用基于HTTP的代理相同,但您将方案设置为socks5。
options = {
'proxy': {
'http': 'socks5://user:pass@192.168.10.100:8888',
'https': 'socks5://user:pass@192.168.10.100:8888',
'no_proxy': 'localhost,127.0.0.1'
}
}
driver = webdriver.Chrome(seleniumwire_options=options)
如果您的代理不需要身份验证,您可以省略user和pass。
除了 socks5,还支持 socks4 和 socks5h 协议。当您希望 DNS 解析在代理服务器上而不是在客户端上进行时,请使用 socks5h。
使用 Selenium Wire 与 Tor 一起
如果您想使用 Tor 运行 Selenium Wire,请查看 此示例。
动态切换
如果您想更改现有驱动实例的代理设置,请使用 driver.proxy 属性。
driver.get(...) # Using some initial proxy
# Change the proxy
driver.proxy = {
'https': 'https://user:pass@192.168.10.100:8888',
}
driver.get(...) # These requests will use the new proxy
要清除代理,请将 driver.proxy 设置为空字典 {}。
此机制还支持 no_proxy 和 custom_authorization 选项。
机器人检测
如果 Selenium Wire 在您的环境中找到它,则会与 undetected-chromedriver 集成。此库将透明地修改 ChromeDriver,以防止它在网站上触发反爬虫措施。
如果您想利用这一点,请确保已安装 undetected_chromedriver。
pip install undetected-chromedriver
然后在您的代码中,导入 seleniumwire.undetected_chromedriver 包。
import seleniumwire.undetected_chromedriver as uc
chrome_options = uc.ChromeOptions()
driver = uc.Chrome(
options=chrome_options,
seleniumwire_options={}
)
证书
Selenium Wire 使用它自己的根证书来解密 HTTPS 流量。通常浏览器不需要信任此证书,因为 Selenium Wire 会告诉浏览器将其添加为例外。这将允许浏览器正常运行,但地址栏中会显示“不安全”消息(以及/或未锁定的锁形标志)。如果您想消除此消息,可以手动安装根证书。
您可以从 这里 下载根证书。下载后,导航到浏览器设置中的“证书”,并在“受信任的根证书颁发机构”部分导入证书。
使用您自己的证书
如果您想使用自己的根证书,可以使用 ca_cert 和 ca_key 选项提供证书和私钥的路径。
如果您指定了自己的证书,请务必手动删除 Selenium Wire 的 临时存储文件夹。这将清除任何可能从前次运行中缓存的现有证书。
所有选项
以下是可以通过 seleniumwire_options 驱动器属性传递给 Selenium Wire 的所有选项的摘要。
- addr
运行 Selenium Wire 的机器的 IP 地址或主机名。默认为 127.0.0.1。如果您正在使用 远程 WebDriver,可能需要将其更改为机器(或容器)的公共 IP 地址。
options = {
'addr': '192.168.0.10' # Use the public IP of the machine
}
driver = webdriver.Chrome(seleniumwire_options=options)
- auto_config
Selenium Wire 是否应该自动配置浏览器以捕获请求。默认值为 True。
- ca_cert
如果更喜欢使用自己的证书而不是默认证书,请提供根(CA)证书的路径。
options = {
'ca_cert': '/path/to/ca.crt' # Use own root certificate
}
driver = webdriver.Chrome(seleniumwire_options=options)
- ca_key
如果使用自己的根证书,请提供私钥的路径。始终在使用自己的证书时提供此密钥。
options = {
'ca_key': '/path/to/ca.key' # Path to private key
}
driver = webdriver.Chrome(seleniumwire_options=options)
- disable_capture
禁用请求捕获。当 True 时,不会拦截或存储任何内容。默认值为 False。
options = {
'disable_capture': True # Don't intercept/store any requests.
}
driver = webdriver.Chrome(seleniumwire_options=options)
- disable_encoding
请求服务器发送未压缩的数据。默认值为 False。当 True 时,此选项将所有出站请求的 Accept-Encoding 标头设置为 identity。请注意,它可能并不总是有效 - 有时服务器可能会忽略它。
options = {
'disable_encoding': True # Ask the server not to compress the response
}
driver = webdriver.Chrome(seleniumwire_options=options)
- enable_har
当 True 时,将保留 HTTP 交易的 HAR 归档,可以使用 driver.har 获取。默认值为 False。
options = {
'enable_har': True # Capture HAR data, retrieve with driver.har
}
driver = webdriver.Chrome(seleniumwire_options=options)
- exclude_hosts
应完全绕过Selenium Wire的地址列表。注意,如果您已配置上游代理,则排除的主机请求也将绕过该代理。
options = {
'exclude_hosts': ['google-analytics.com'] # Bypass these hosts
}
driver = webdriver.Chrome(seleniumwire_options=options)
- ignore_http_methods
应忽略并捕获的HTTP方法列表(指定为大写字符串)。默认为['OPTIONS'],忽略所有OPTIONS请求。要捕获所有请求方法,将ignore_http_methods设置为空列表。
options = {
'ignore_http_methods': [] # Capture all requests, including OPTIONS requests
}
driver = webdriver.Chrome(seleniumwire_options=options)
- port
Selenium Wire后端监听的端口号。通常不需要指定端口号,因为会自动选择一个随机端口号。
options = {
'port': 9999 # Tell the backend to listen on port 9999 (not normally necessary to set this)
}
driver = webdriver.Chrome(seleniumwire_options=options)
- proxy
如果您使用代理,则提供上游代理服务器配置。
options = {
'proxy': {
'http': 'http://user:pass@192.168.10.100:8888',
'https': 'https://user:pass@192.168.10.100:8889',
'no_proxy': 'localhost,127.0.0.1'
}
}
driver = webdriver.Chrome(seleniumwire_options=options)
- request_storage
要使用的存储类型。Selenium Wire默认使用基于磁盘的存储,但可以通过设置此选项为memory来切换到内存存储。
options = {
'request_storage': 'memory' # Store requests and responses in memory only
}
driver = webdriver.Chrome(seleniumwire_options=options)
- request_storage_base_dir
当使用默认基于磁盘的存储时,Selenium Wire存储捕获的请求和响应的基础位置。默认为系统临时文件夹(Linux上的/tmp和Windows上的通常为C:\Users\<username>\AppData\Local\Temp)。将创建一个名为.seleniumwire的子文件夹来存储捕获的数据。
options = {
'request_storage_base_dir': '/my/storage/folder' # .seleniumwire will get created here
}
driver = webdriver.Chrome(seleniumwire_options=options)
- request_storage_max_size
使用内存存储时存储请求的最大数量。默认为无限。此选项在默认基于磁盘的存储中目前没有效果。
options = {
'request_storage': 'memory',
'request_storage_max_size': 100 # Store no more than 100 requests in memory
}
driver = webdriver.Chrome(seleniumwire_options=options)
- suppress_connection_errors
是否抑制与连接相关的回溯。默认为True,意味着有时在浏览器关闭时发生的无害错误不会引起用户警觉。当被抑制时,连接错误消息将在DEBUG级别记录,不带回溯。将此设置为False以允许异常传播并查看完整的回溯。
options = {
'suppress_connection_errors': False # Show full tracebacks for any connection errors
}
driver = webdriver.Chrome(seleniumwire_options=options)
- verify_ssl
是否应验证SSL证书。默认为False,这防止了与自签名证书相关的错误。
options = {
'verify_ssl': True # Verify SSL certificates but beware of errors with self-signed certificates
}
driver = webdriver.Chrome(seleniumwire_options=options)
许可证
MIT
历史记录
5.1.0 (2022-10-15)
停止支持Selenium<4.0.0。
停止支持SSLv2和SSLv3。
修复设置非字符串头值会导致拦截器失败的问题。
5.0.0 (2022-09-26)
为webdriver添加对Microsoft Edge的支持。
停止支持Python 3.6。
修复与PyOpenSSL的兼容性问题。
4.6.5 (2022-07-09)
修复与DesiredCapabilities和较旧版本的Chrome webdriver API的兼容性问题。
修复了verify_ssl会假设传递的布尔值的相反情况(它是反过来的)的问题。
对支持Python 3.10进行的小型更新。
对README的小型更新。
4.6.4 (2022-05-11)
修复设置拦截器会破坏WebSocket请求的bug。
4.6.3 (2022-03-13)
修复了动态切换上游代理的问题。
4.6.2 (2022-02-25)
修复了Selenium>4.1.0中缺少TouchActions的导入错误。
4.6.1 (2022-02-21)
修复了与undetected_chromedriver的兼容性问题。
处理从磁盘加载捕获的请求时偶尔发生的未序列化错误。
4.6.0 (2022-01-10)
可配置根证书和私钥。
修复了无法清除已设置的代理的bug。
4.5.6 (2021-11-26)
修复了使用chrome_options参数会阻止请求捕获的bug。
修复了传递Proxy-Connection头的问题。
4.5.5 (2021-11-13)
修复了缺少‘packaging’模块导致Selenium Wire无法启动的问题。
修复了与desired capabilities的弃用警告。
4.5.4 (2021-10-23)
修复了使用Firefox和Selenium >= 4.0.0时阻止请求捕获的bug。
4.5.3 (2021-10-03)
修复了设置套接字超时会导致SSL握手失败的bug。
支持brotli和zstd内容编码。
抑制HTTP协议警告。
4.5.2 (2021-08-23)
修复了使用响应拦截器时自动解码响应体会导致页面加载失败的bug。
修复了在使用undetected_chromedriver.v2时exclude_hosts没有效果的bug。
修复在请求尚未完全写入磁盘之前请求存储请求时偶尔发生的反序列化错误。
4.5.1 (2021-08-20)
修复属性错误,防止未检测到的chromedriver启动。
4.5.0 (2021-08-19)
允许动态更改上游代理。
4.4.1 (2021-08-10)
修复异步错误,该错误会破坏Django ORM。
4.4.0 (2021-07-23)
引入内存中的请求存储。
默认请求存储现在默认使用系统临时文件夹。
移除mitmproxy后端。Selenium Wire默认使用mitmproxy,因此单独的mitmproxy后端是多余的。
4.3.3 (2021-07-19)
修复Selenium Wire在多线程中运行时的代理授权失败问题。
4.3.2 (2021-07-11)
修复一个错误,该错误会导致对于http主机忽略上游no_proxy设置。
防止Firefox绕过Selenium Wire对localhost地址。
修复一个错误,该错误导致DNS对于socks5h不会被通过代理解析。
4.3.1 (2021-06-13)
不要将单独的Set-Cookie响应头折叠为单个头。
将额外的SSL证书属性添加到request.cert中。
4.3.0 (2021-05-06)
允许选择未检测到的chromedriver版本。
添加新的request.host属性。
4.2.5 (2021-05-03)
默认使用upstream_cert=True,启用HTTP/2。
4.2.4 (2021-04-13)
修复一个错误,该错误会导致disable_capture会破坏上游代理认证。
4.2.3 (2021-04-03)
修复一个错误,该错误使得在代理配置中无法指定socks4。
4.2.2 (2021-03-19)
修复RequestStorage中的并发问题,该问题允许检索部分存储的请求。
4.2.1 (2021-03-09)
通过request.cert提供SSL证书元数据。
默认抑制连接中断错误。
在代理认证失败时记录错误。
4.2.0 (2021-03-03)
添加对HAR格式的支持。
添加disable_capture选项。
添加driver.iter_requests()。
修复no_proxy在代理配置中被忽略的错误。
4.1.1 (2021-02-26)
与undetected-chromedriver集成。
4.1.0 (2021-02-24)
实现WebSocket消息捕获。
修复外部关闭事件循环会触发关闭异常的错误。
修复阻止使用空密码上游代理的错误。
4.0.5 (2021-02-15)
将“客户端可能无法信任Selenium Wire的证书”降级为调试。
引入auto_config选项。
4.0.4 (2021-02-05)
修复Selenium Wire会尝试关闭正在运行的事件循环的错误。
4.0.3 (2021-02-04)
修复IPv6地址没有用方括号括起来,破坏本地代理URL的错误。
4.0.2 (2021-02-01)
修复由IPv6套接字绑定引起的问题。
4.0.1 (2021-02-01)
修复绑定到IPv6套接字会阻止Selenium Wire启动的错误。
4.0.0 (2021-01-31)
- 重构默认后端以
提高连接上游代理时的性能
移除启动openssl子进程以生成证书的需要
修复重复头无法代理到上游服务器的错误
修复响应状态码被CONNECT状态码覆盖的问题
为支持WebSocket消息捕获打下基础
为支持SSL透传打下基础
3.0.6 (2021-01-30)
修复阻止mitmproxy后端使用自定义confdir的错误。
3.0.5 (2021-01-18)
根据配置抑制上游连接错误。
3.0.4 (2021-01-07)
撤销默认捕获OPTIONS请求的更改。
3.0.3 (2021-01-07)
在加载时解码响应体。
3.0.2 (2021-01-05)
修复远程WebDriver客户端从错误包导入的问题。
3.0.1 (2021-01-03)
如果当前事件循环已关闭,则创建新的事件循环。
3.0.0 (2021-01-02)
引入请求和响应拦截器。
在线程中而不是子进程中运行mitmproxy后端。
删除内部HTTP管理API。
停止支持Python 3.4和3.5。
添加对远程WebDriver客户端的支持。
添加对重复请求和响应头的支持。
修复了Proxy-Connection头被传播的问题。
修复了由于添加了代理配置而无法在Selenium Wire外部重用desired capabilities的问题。
弃用header_overrides、param_overrides、querystring_overrides、rewrite_urls、custom_response_handler
2.1.2 (2020-11-14)
防止 Chrome 代理本地地址时绕过 Selenium Wire。
2.1.1 (2020-08-10)
为 mitmproxy 后端自动选择端口号。
2.1.0 (2020-07-21)
支持在 driver.wait_for_request() 中使用正则表达式。
2.0.0 (2020-07-14)
引入 mitmproxy 后端。
支持修改响应头。
支持修改请求参数和查询字符串。
- API 破坏性变更。
request.path 属性现在返回路径而不是完整 URL。要获取 URL,请使用 request.url。
空请求和响应体现在作为空字节 b’’ 返回,而不是 None。
1.2.3 (2020-06-19)
由于某些情况下的副作用,默认禁用连接持久性。
1.2.2 (2020-06-12)
在发生错误时关闭连接,而不是发送 502 响应以允许浏览器重试。
1.2.1 (2020-06-09)
在创建网站证书时使用 SHA256 摘要以修复 Chrome HSTS 安全错误。
1.2.0 (2020-06-07)
添加属性以允许轻松检索查询字符串和请求参数。
默认不验证 SSL。
允许配置请求线程数。
默认使用连接持久性(keep-alive)。使其可配置。
1.1.2 (2020-05-27)
修复请求线程在 websocket 关闭后旋转的 bug。
1.1.1 (2020-05-25)
处理 websocket 连接上的错误。
1.1.0 (2020-05-23)
允许配置请求存储基本目录。
支持代理 websocket 连接。
修复尝试过滤不存在头时引发错误的 bug。
处理捕获到的请求/响应文件为零字节的可能性。
1.0.12 (2020-05-16)
支持 SOCKS 代理。
1.0.11 (2019-12-31)
修复修改正文内容时内容长度头重复的问题。
1.0.10 (2019-09-22)
请求捕获作用域。
基于每个 URL 应用头过滤。
1.0.9 (2019-08-25)
添加提供自定义响应处理方法的能力。
1.0.8 (2019-08-01)
从 AdminClient 中移除信号处理程序,以允许在多线程环境中运行。
使连接超时可配置。
1.0.7 (2019-07-30)
修复在多线程环境中运行时临时存储清理有时会失败的 bug。
不要依赖于信号处理程序进行临时存储清理。信号处理程序与多线程不兼容。使用 driver.quit() 进行显式清理。
1.0.6 (2019-07-14)
在使用自签名证书时支持禁用 SSL 验证。
1.0.5 (2019-06-15)
通过显式关闭响应输出流在 Windows 上提高性能。
捕获从 openssl 泄漏到控制台的 stderr。
确保为自签名证书添加 subjectAltName。
重构证书生成代码。
更健壮地处理套接字错误。
在客户端请求时解码响应体,而不是在捕获响应时。
1.0.4 (2019-04-04)
在 driver.quit() 上清理缓存的请求目录树。
默认抑制连接相关错误。
1.0.3 (2019-04-01)
当缺少 Content-Type 头时,不再分块发送响应。
确保延迟响应不会在服务器未显式关闭时引发错误。
1.0.2 (2019-03-10)
在基于 http 的代理中使用时支持身份验证。
修复 JSON 响应体被解码而不是作为字节发送的 bug。
1.0.1 (2019-02-07)
支持 PATCH 请求。
1.0.0 (2018-12-31)
确保在测试请求时始终以字节形式检索存储的响应体。
README 更新。
使用 HISTORY 的倒序。
0.10.0 (2018-10-30)
修复忽略 OPTIONS 请求会触发 AttributeError 的问题。
允许将代理设置显式设置为 None。
0.9.0 (2018-10-28)
默认忽略 OPTIONS 请求,并允许通过 ignore_http_methods 选项配置方法列表。
将默认 Selenium Wire 请求存储从系统临时目录移动到用户主目录以防止权限冲突。
0.8.0 (2018-09-20)
修复在使用 driver.header_overrides 时请求中未添加新头的问题。
0.7.0 (2018-08-29)
README 和文档更新。
0.6.0 (2018-08-21)
为 Windows 打包 openssl.cnf。
0.5.0 (2018-08-19)
更清晰的 README 指令。
0.4.0 (2018-08-19)
为 Windows 打包 OpenSSL。
Edge 的安装说明。
0.3.0 (2018-08-07)
修复远程代理基本身份验证。
README 更新。
0.2.0 (2018-08-04)
从环境变量中加载代理设置。
支持禁用内容编码。
README 更新。
0.1.0 (2018-06-19)
在 PyPI 上的首次发布。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源代码发行版
构建发行版
selenium-wire-5.1.0.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | b1cd4eae44d9959381abe3bb186472520d063c658e279f98555def3d4e6dd29b |
|
MD5 | 4470fe89d85b004c491100351e56048e |
|
BLAKE2b-256 | 9f0060b39e8a1efe6919d1390f07d84a3eeba4aeae5b829f2f848344c798f783 |
selenium_wire-5.1.0-py3-none-any.whl 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | fbf930d9992f8b6d24bb16b3e6221bab596a41f6ae7548270b7d5a92f3402622 |
|
MD5 | c44207ef91d66e12cdb3ca91bf7708e4 |
|
BLAKE2b-256 | eb7e9548b365eab16730b6a8da25c6e1f83f3b84fb6092ecd2d4d69933d08a45 |