Chrome DevTools Protocol 客户端,支持独立使用或与 DrissionPage 配合
Project description
PyCDP - Chrome DevTools Protocol 客户端
CDP 客户端,自动配置 ChromiumOptions,可直接传给 DrissionPage 的 Chromium。
特性
- 自动配置
--remote-allow-origins=*参数 - 支持绕过反爬的请求(在浏览器上下文中执行)
- 完整的 IDE 类型提示支持
安装
pip install pycdp-client
快速开始
from pycdp import CDP
from DrissionPage import Chromium
cdp = CDP(port=9222)
page = Chromium(cdp.options).latest_tab
page.get("https://example.com")
# CDP 请求(绕过反爬)
result = cdp.post('https://api.example.com/data', body={"key": "value"})
print(result)
API 文档
CDP 类
from pycdp import CDP
cdp = CDP(port=9222) # 默认端口 9222
属性
| 属性 | 说明 |
|---|---|
options |
返回 ChromiumOptions 实例,用于传给 Chromium |
port |
当前端口号 |
方法
| 方法 | 说明 |
|---|---|
get(url, headers=None, token_key=None, extra=None) |
GET 请求 |
post(url, body=None, headers=None, token_key=None, extra=None) |
POST 请求 |
put(url, body=None, headers=None, token_key=None, extra=None) |
PUT 请求 |
delete(url, headers=None, token_key=None, extra=None) |
DELETE 请求 |
request(url, method, body, headers, token_key, extra) |
通用请求 |
run(js, wait=False) |
执行 JavaScript |
storage(key, value=None, storage='localStorage') |
操作 Storage |
cookies(name=None) |
获取 Cookies |
inject(js) |
页面加载前注入脚本 |
call(func, *args) |
调用页面函数 |
hook(target, callback=None) |
Hook JS 函数 |
unhook(target) |
移除 Hook |
getvar(path) |
获取页面 JS 变量值 |
setvar(path, value) |
设置页面 JS 变量值 |
override(target, impl) |
覆盖 JS 函数实现 |
restore(target) |
恢复被覆盖的函数 |
reconnect(tab_index=0) |
重新连接(切换 tab) |
close() |
关闭连接 |
请求示例
# GET 请求
result = cdp.get('https://api.example.com/data')
# POST 请求
result = cdp.post('https://api.example.com/data', body={"name": "test"})
# 带 token 的请求(自动从 localStorage 获取)
result = cdp.get('https://api.example.com/user', token_key='ACCESS_TOKEN')
# 带额外请求头
result = cdp.post('https://api.example.com/data',
body={"key": "value"},
extra={"X-Custom-Header": "custom-value"}
)
执行 JavaScript
# 同步执行
title = cdp.run('document.title')
# 异步执行(等待 Promise)
result = cdp.run('fetch("/api/data").then(r=>r.json())', wait=True)
操作 Storage
# 获取 localStorage
token = cdp.storage('token')
# 设置 localStorage
cdp.storage('token', 'new_value')
# 操作 sessionStorage
cdp.storage('key', 'value', storage='sessionStorage')
获取 Cookies
# 获取所有 cookies
all_cookies = cdp.cookies()
# 获取指定 cookie
session = cdp.cookies('session_id')
注入脚本(JS 逆向)
# 页面加载前注入脚本(每个新文档都会执行)
cdp.inject('Object.defineProperty(navigator,"webdriver",{get:()=>false})')
# 注入自定义函数
cdp.inject('window.myFunc = (x) => x * 2')
调用页面函数
# 调用页面函数
result = cdp.call('JSON.stringify', {'key': 'value'})
# 调用链式函数
cdp.call('window.app.login', 'user', 'pass')
Hook JS 函数
# Hook fetch,记录所有请求到控制台
cdp.hook('window.fetch')
# 自定义回调处理
cdp.run('window.onHook = (name, args) => console.log(name, args)')
cdp.hook('JSON.parse', 'window.onHook')
# 移除 Hook
cdp.unhook('window.fetch')
获取/设置页面变量
# 获取页面变量
config = cdp.getvar('window.app.config')
token = cdp.getvar('app.userInfo.token')
# 设置页面变量
cdp.setvar('window.DEBUG', True)
cdp.setvar('app.config.apiUrl', 'https://api.example.com')
覆盖 JS 函数
# 固定 Date.now() 返回值
cdp.override('Date.now', '()=>1234567890000')
# 固定 Math.random() 返回值
cdp.override('Math.random', '()=>0.5')
# 恢复原函数
cdp.restore('Date.now')
完整示例
from pycdp import CDP
from DrissionPage import Chromium
# 创建 CDP
cdp = CDP(port=9222)
# 通过 cdp.options 传给 Chromium
page = Chromium(cdp.options).latest_tab
# 访问页面
page.get("https://example.com/login")
# DrissionPage 操作
page.ele('#username').input('user@example.com')
page.ele('#password').input('password123')
page.ele('#login-btn').click()
# CDP 请求获取数据
result = cdp.get('https://api.example.com/user/profile', token_key='ACCESS_TOKEN')
print(f"用户信息: {result['data']}")
# 获取 token
token = cdp.storage('ACCESS_TOKEN')
print(f"Token: {token}")
上下文管理器
from pycdp import CDP
with CDP(9222) as cdp:
result = cdp.get('https://api.example.com/data')
print(result)
注意事项
- 使用
cdp.options传给 Chromium,自动配置端口和--remote-allow-origins=* - CDP 请求在浏览器上下文中执行,共享 cookies 和 localStorage
- CDP 实例会在
__del__时自动关闭,也可手动调用close()
License
MIT License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
pycdp_client-1.1.0.tar.gz
(9.6 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pycdp_client-1.1.0.tar.gz.
File metadata
- Download URL: pycdp_client-1.1.0.tar.gz
- Upload date:
- Size: 9.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5011c79db2f9a7ecb95d8dcbce10a4c94b32f57e366f032107c33d5104887ccd
|
|
| MD5 |
65b93d16097b103432e735e96e03168a
|
|
| BLAKE2b-256 |
a1d376a29bcd4320ec5ee18fe22441438b9d478593550e62007d1d0419bf8485
|
File details
Details for the file pycdp_client-1.1.0-py3-none-any.whl.
File metadata
- Download URL: pycdp_client-1.1.0-py3-none-any.whl
- Upload date:
- Size: 11.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0797165fc400b6aebc76e20b7ecfe7cad3435fbc078cc9bff5b026ad8c434b9a
|
|
| MD5 |
e19b91e371d84e81b0db38d750fe6f56
|
|
| BLAKE2b-256 |
7f5afa3cec86aa19d04704e557dd25781012a842e184321aff376429c48b0c14
|