跳转到主要内容

Selenium Wire 扩展Selenium的功能,让您能够检查浏览器发出的请求。

项目描述

Selenium Wire 扩展 Selenium的 Python绑定,为您提供访问浏览器底层请求的能力。您可以用与使用Selenium相同的方式编写代码,但您会获得额外的API来检查请求和响应,并在实时中对它们进行修改。

https://github.com/wkeeling/selenium-wire/workflows/build/badge.svg https://codecov.io/gh/wkeeling/selenium-wire/branch/master/graph/badge.svg https://img.shields.io/badge/python-3.7%2C%203.8%2C%203.9%2C%203.10-blue.svg https://img.shields.io/pypi/v/selenium-wire.svg https://img.shields.io/pypi/l/selenium-wire.svg https://pepy.tech/badge/selenium-wire/month

简单示例

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&timestamp=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方法,例如 GETPOST 等。

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

消息内容,可以是 strbytes

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']删除现有头,否则您将创建一个重复项。

原因

原因短语,例如OKNot Found等。

status_code

响应的状态码,例如200404等。

截获请求和响应

除了捕获请求和响应之外,Selenium Wire 还允许您使用拦截器动态修改它们。拦截器是一个在请求和响应通过 Selenium Wire 时被调用的函数。在拦截器内部,您可以按需修改请求和响应。

您在使用驱动程序之前使用driver.request_interceptordriver.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.requestsdriver.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_PROXYHTTPS_PROXYNO_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)

如果您的代理不需要身份验证,您可以省略userpass

除了 socks5,还支持 socks4socks5h 协议。当您希望 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_proxycustom_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_certca_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 上的首次发布。

项目详情


发布历史 发布通知 | RSS 源

下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码发行版

selenium-wire-5.1.0.tar.gz (62.1 MB 查看散列)

上传时间 源代码

构建发行版

selenium_wire-5.1.0-py3-none-any.whl (239.6 kB 查看散列)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面