# DrissionPage扩展包
[](https://badge.fury.io/py/DrissionPage-expand)
[](https://pypi.org/project/DrissionPage-expand/)
[](https://opensource.org/licenses/MIT)
DrissionPage扩展包,提供异步请求功能,通过HTTP服务器中转实现,完全兼容requests使用方式。
## 主要功能
- ✅ **异步HTTP请求支持** - 在DrissionPage中实现真正的异步请求
- ✅ **完全兼容requests API** - 无缝替换requests使用方式
- ✅ **自动启动HTTP服务器** - 导入时自动启动,无需手动配置
- ✅ **支持批量请求** - 高效处理多个并发请求
- ✅ **表单数据自动处理** - 自动处理form_data参数
- ✅ **请求信息记录** - 完整记录请求参数和响应信息
- ✅ **错误重试机制** - 自动重试失败的请求
## 安装
```bash
pip install DrissionPage-expand
```
## 快速开始
### 基本使用
```python
import DrissionPage_expand as dpe
from DrissionPage import ChromiumPage
# 创建页面实例
page = ChromiumPage()
# 发送GET请求 - 完全兼容requests API
response = dpe.get(page, 'https://httpbin.org/get')
print(response.status_code) # 200
print(response.json()) # 响应JSON数据
print(response.text) # 响应文本
response.raise_for_status() # 检查状态码
# 发送POST请求
response = dpe.post(page, 'https://httpbin.org/post',
json={'key': 'value'})
```
### 表单数据提交
```python
# 使用form_data参数自动处理表单数据
form_data = {
'username': 'test_user',
'password': 'test_password',
'email': 'test@example.com'
}
response = dpe.post(page, 'https://httpbin.org/post',
form_data=form_data)
```
### 批量请求
```python
# 批量发送多个请求
requests = [
{'method': 'GET', 'url': 'https://httpbin.org/get'},
{'method': 'POST', 'url': 'https://httpbin.org/post', 'json': {'data': 'test'}},
{'method': 'PUT', 'url': 'https://httpbin.org/put', 'json': {'update': 'data'}}
]
responses = dpe.batch_request(page, requests)
for response in responses:
if response:
print(f"状态码: {response.status_code}")
```
## API文档
### 主要方法
- `get(tab, url, **kwargs)` - 发送GET请求
- `post(tab, url, **kwargs)` - 发送POST请求
- `put(tab, url, **kwargs)` - 发送PUT请求
- `delete(tab, url, **kwargs)` - 发送DELETE请求
- `patch(tab, url, **kwargs)` - 发送PATCH请求
- `async_request(tab, method, url, **kwargs)` - 通用异步请求方法
- `batch_request(tab, requests, **kwargs)` - 批量请求
### Response对象
Response对象完全兼容requests.Response,支持以下属性和方法:
```python
# requests风格的属性
response.status_code # HTTP状态码
response.reason # 状态文本
response.url # 请求URL
response.ok # 是否成功
response.headers # 响应头
response.content # 响应内容(bytes)
response.text # 响应文本(str)
response.json() # 解析JSON响应
response.raise_for_status() # 检查状态码
# 向后兼容的属性
response.status # 等同于status_code
response.status_text # 等同于reason
response.data # 原始响应数据
response.is_success() # 等同于ok
response.get_header(name) # 获取指定响应头
```
## 参数说明
### 请求参数
- `headers` - 请求头字典
- `data` - 请求体数据(JSON格式)
- `form_data` - 表单数据(字典格式,自动转换为application/x-www-form-urlencoded)
- `params` - URL参数
- `timeout` - 请求超时时间(秒)
- `server_timeout` - 等待服务器响应的超时时间(秒)
- `retry_timeout` - 是否对失败请求进行重试
- `max_retries` - 最大重试次数
### 重试条件
- 请求超时 (TimeoutError)
- 服务器错误状态码 (5xx)
- 网络错误 (状态码为0)
## 高级用法
### 自定义服务器配置
```python
# 使用自定义服务器
server = dpe.RequestResponseServer(host='127.0.0.1', port=9999)
server.start()
# 使用完毕后停止服务器
server.stop()
```
### 错误处理
```python
try:
response = dpe.get(page, 'https://httpbin.org/status/404')
response.raise_for_status() # 抛出HTTPError异常
except Exception as e:
print(f"请求失败: {e}")
```
## 与requests对比
| 功能 | requests | DrissionPage-expand |
|------|----------|-------------------|
| 基本请求 | `requests.get(url)` | `dpe.get(tab, url)` |
| 状态码 | `response.status_code` | `response.status_code` |
| 响应文本 | `response.text` | `response.text` |
| JSON解析 | `response.json()` | `response.json()` |
| 状态检查 | `response.raise_for_status()` | `response.raise_for_status()` |
| 异步支持 | ❌ | ✅ |
| 浏览器环境 | ❌ | ✅ |
## 许可证
MIT License
## 贡献
欢迎提交Issue和Pull Request!
## 更新日志
### v1.1.0
- 完全兼容requests API
- 自动启动HTTP服务器
- 支持表单数据处理
- 添加批量请求功能
- 改进错误处理和重试机制
Raw data
{
"_id": null,
"home_page": "https://github.com/DrissionPage/DrissionPage-expand",
"name": "DrissionPage-expand",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "drissionpage async request http automation web scraping",
"author": "DrissionPage Expand",
"author_email": "drissionpage.expand@example.com",
"download_url": "https://files.pythonhosted.org/packages/69/97/6775a8119c88c8146a0fb491f945416d4f97617dee9571985d25d43c5610/drissionpage_expand-1.1.0.tar.gz",
"platform": null,
"description": "# DrissionPage\u6269\u5c55\u5305\r\n\r\n[](https://badge.fury.io/py/DrissionPage-expand)\r\n[](https://pypi.org/project/DrissionPage-expand/)\r\n[](https://opensource.org/licenses/MIT)\r\n\r\nDrissionPage\u6269\u5c55\u5305\uff0c\u63d0\u4f9b\u5f02\u6b65\u8bf7\u6c42\u529f\u80fd\uff0c\u901a\u8fc7HTTP\u670d\u52a1\u5668\u4e2d\u8f6c\u5b9e\u73b0\uff0c\u5b8c\u5168\u517c\u5bb9requests\u4f7f\u7528\u65b9\u5f0f\u3002\r\n\r\n## \u4e3b\u8981\u529f\u80fd\r\n\r\n- \u2705 **\u5f02\u6b65HTTP\u8bf7\u6c42\u652f\u6301** - \u5728DrissionPage\u4e2d\u5b9e\u73b0\u771f\u6b63\u7684\u5f02\u6b65\u8bf7\u6c42\r\n- \u2705 **\u5b8c\u5168\u517c\u5bb9requests API** - \u65e0\u7f1d\u66ff\u6362requests\u4f7f\u7528\u65b9\u5f0f\r\n- \u2705 **\u81ea\u52a8\u542f\u52a8HTTP\u670d\u52a1\u5668** - \u5bfc\u5165\u65f6\u81ea\u52a8\u542f\u52a8\uff0c\u65e0\u9700\u624b\u52a8\u914d\u7f6e\r\n- \u2705 **\u652f\u6301\u6279\u91cf\u8bf7\u6c42** - \u9ad8\u6548\u5904\u7406\u591a\u4e2a\u5e76\u53d1\u8bf7\u6c42\r\n- \u2705 **\u8868\u5355\u6570\u636e\u81ea\u52a8\u5904\u7406** - \u81ea\u52a8\u5904\u7406form_data\u53c2\u6570\r\n- \u2705 **\u8bf7\u6c42\u4fe1\u606f\u8bb0\u5f55** - \u5b8c\u6574\u8bb0\u5f55\u8bf7\u6c42\u53c2\u6570\u548c\u54cd\u5e94\u4fe1\u606f\r\n- \u2705 **\u9519\u8bef\u91cd\u8bd5\u673a\u5236** - \u81ea\u52a8\u91cd\u8bd5\u5931\u8d25\u7684\u8bf7\u6c42\r\n\r\n## \u5b89\u88c5\r\n\r\n```bash\r\npip install DrissionPage-expand\r\n```\r\n\r\n## \u5feb\u901f\u5f00\u59cb\r\n\r\n### \u57fa\u672c\u4f7f\u7528\r\n\r\n```python\r\nimport DrissionPage_expand as dpe\r\nfrom DrissionPage import ChromiumPage\r\n\r\n# \u521b\u5efa\u9875\u9762\u5b9e\u4f8b\r\npage = ChromiumPage()\r\n\r\n# \u53d1\u9001GET\u8bf7\u6c42 - \u5b8c\u5168\u517c\u5bb9requests API\r\nresponse = dpe.get(page, 'https://httpbin.org/get')\r\nprint(response.status_code) # 200\r\nprint(response.json()) # \u54cd\u5e94JSON\u6570\u636e\r\nprint(response.text) # \u54cd\u5e94\u6587\u672c\r\nresponse.raise_for_status() # \u68c0\u67e5\u72b6\u6001\u7801\r\n\r\n# \u53d1\u9001POST\u8bf7\u6c42\r\nresponse = dpe.post(page, 'https://httpbin.org/post', \r\n json={'key': 'value'})\r\n```\r\n\r\n### \u8868\u5355\u6570\u636e\u63d0\u4ea4\r\n\r\n```python\r\n# \u4f7f\u7528form_data\u53c2\u6570\u81ea\u52a8\u5904\u7406\u8868\u5355\u6570\u636e\r\nform_data = {\r\n 'username': 'test_user',\r\n 'password': 'test_password',\r\n 'email': 'test@example.com'\r\n}\r\n\r\nresponse = dpe.post(page, 'https://httpbin.org/post', \r\n form_data=form_data)\r\n```\r\n\r\n### \u6279\u91cf\u8bf7\u6c42\r\n\r\n```python\r\n# \u6279\u91cf\u53d1\u9001\u591a\u4e2a\u8bf7\u6c42\r\nrequests = [\r\n {'method': 'GET', 'url': 'https://httpbin.org/get'},\r\n {'method': 'POST', 'url': 'https://httpbin.org/post', 'json': {'data': 'test'}},\r\n {'method': 'PUT', 'url': 'https://httpbin.org/put', 'json': {'update': 'data'}}\r\n]\r\n\r\nresponses = dpe.batch_request(page, requests)\r\nfor response in responses:\r\n if response:\r\n print(f\"\u72b6\u6001\u7801: {response.status_code}\")\r\n```\r\n\r\n## API\u6587\u6863\r\n\r\n### \u4e3b\u8981\u65b9\u6cd5\r\n\r\n- `get(tab, url, **kwargs)` - \u53d1\u9001GET\u8bf7\u6c42\r\n- `post(tab, url, **kwargs)` - \u53d1\u9001POST\u8bf7\u6c42 \r\n- `put(tab, url, **kwargs)` - \u53d1\u9001PUT\u8bf7\u6c42\r\n- `delete(tab, url, **kwargs)` - \u53d1\u9001DELETE\u8bf7\u6c42\r\n- `patch(tab, url, **kwargs)` - \u53d1\u9001PATCH\u8bf7\u6c42\r\n- `async_request(tab, method, url, **kwargs)` - \u901a\u7528\u5f02\u6b65\u8bf7\u6c42\u65b9\u6cd5\r\n- `batch_request(tab, requests, **kwargs)` - \u6279\u91cf\u8bf7\u6c42\r\n\r\n### Response\u5bf9\u8c61\r\n\r\nResponse\u5bf9\u8c61\u5b8c\u5168\u517c\u5bb9requests.Response\uff0c\u652f\u6301\u4ee5\u4e0b\u5c5e\u6027\u548c\u65b9\u6cd5\uff1a\r\n\r\n```python\r\n# requests\u98ce\u683c\u7684\u5c5e\u6027\r\nresponse.status_code # HTTP\u72b6\u6001\u7801\r\nresponse.reason # \u72b6\u6001\u6587\u672c\r\nresponse.url # \u8bf7\u6c42URL\r\nresponse.ok # \u662f\u5426\u6210\u529f\r\nresponse.headers # \u54cd\u5e94\u5934\r\nresponse.content # \u54cd\u5e94\u5185\u5bb9(bytes)\r\nresponse.text # \u54cd\u5e94\u6587\u672c(str)\r\nresponse.json() # \u89e3\u6790JSON\u54cd\u5e94\r\nresponse.raise_for_status() # \u68c0\u67e5\u72b6\u6001\u7801\r\n\r\n# \u5411\u540e\u517c\u5bb9\u7684\u5c5e\u6027\r\nresponse.status # \u7b49\u540c\u4e8estatus_code\r\nresponse.status_text # \u7b49\u540c\u4e8ereason\r\nresponse.data # \u539f\u59cb\u54cd\u5e94\u6570\u636e\r\nresponse.is_success() # \u7b49\u540c\u4e8eok\r\nresponse.get_header(name) # \u83b7\u53d6\u6307\u5b9a\u54cd\u5e94\u5934\r\n```\r\n\r\n## \u53c2\u6570\u8bf4\u660e\r\n\r\n### \u8bf7\u6c42\u53c2\u6570\r\n\r\n- `headers` - \u8bf7\u6c42\u5934\u5b57\u5178\r\n- `data` - \u8bf7\u6c42\u4f53\u6570\u636e\uff08JSON\u683c\u5f0f\uff09\r\n- `form_data` - \u8868\u5355\u6570\u636e\uff08\u5b57\u5178\u683c\u5f0f\uff0c\u81ea\u52a8\u8f6c\u6362\u4e3aapplication/x-www-form-urlencoded\uff09\r\n- `params` - URL\u53c2\u6570\r\n- `timeout` - \u8bf7\u6c42\u8d85\u65f6\u65f6\u95f4\uff08\u79d2\uff09\r\n- `server_timeout` - \u7b49\u5f85\u670d\u52a1\u5668\u54cd\u5e94\u7684\u8d85\u65f6\u65f6\u95f4\uff08\u79d2\uff09\r\n- `retry_timeout` - \u662f\u5426\u5bf9\u5931\u8d25\u8bf7\u6c42\u8fdb\u884c\u91cd\u8bd5\r\n- `max_retries` - \u6700\u5927\u91cd\u8bd5\u6b21\u6570\r\n\r\n### \u91cd\u8bd5\u6761\u4ef6\r\n\r\n- \u8bf7\u6c42\u8d85\u65f6 (TimeoutError)\r\n- \u670d\u52a1\u5668\u9519\u8bef\u72b6\u6001\u7801 (5xx)\r\n- \u7f51\u7edc\u9519\u8bef (\u72b6\u6001\u7801\u4e3a0)\r\n\r\n## \u9ad8\u7ea7\u7528\u6cd5\r\n\r\n### \u81ea\u5b9a\u4e49\u670d\u52a1\u5668\u914d\u7f6e\r\n\r\n```python\r\n# \u4f7f\u7528\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\r\nserver = dpe.RequestResponseServer(host='127.0.0.1', port=9999)\r\nserver.start()\r\n\r\n# \u4f7f\u7528\u5b8c\u6bd5\u540e\u505c\u6b62\u670d\u52a1\u5668\r\nserver.stop()\r\n```\r\n\r\n### \u9519\u8bef\u5904\u7406\r\n\r\n```python\r\ntry:\r\n response = dpe.get(page, 'https://httpbin.org/status/404')\r\n response.raise_for_status() # \u629b\u51faHTTPError\u5f02\u5e38\r\nexcept Exception as e:\r\n print(f\"\u8bf7\u6c42\u5931\u8d25: {e}\")\r\n```\r\n\r\n## \u4e0erequests\u5bf9\u6bd4\r\n\r\n| \u529f\u80fd | requests | DrissionPage-expand |\r\n|------|----------|-------------------|\r\n| \u57fa\u672c\u8bf7\u6c42 | `requests.get(url)` | `dpe.get(tab, url)` |\r\n| \u72b6\u6001\u7801 | `response.status_code` | `response.status_code` |\r\n| \u54cd\u5e94\u6587\u672c | `response.text` | `response.text` |\r\n| JSON\u89e3\u6790 | `response.json()` | `response.json()` |\r\n| \u72b6\u6001\u68c0\u67e5 | `response.raise_for_status()` | `response.raise_for_status()` |\r\n| \u5f02\u6b65\u652f\u6301 | \u274c | \u2705 |\r\n| \u6d4f\u89c8\u5668\u73af\u5883 | \u274c | \u2705 |\r\n\r\n## \u8bb8\u53ef\u8bc1\r\n\r\nMIT License\r\n\r\n## \u8d21\u732e\r\n\r\n\u6b22\u8fce\u63d0\u4ea4Issue\u548cPull Request\uff01\r\n\r\n## \u66f4\u65b0\u65e5\u5fd7\r\n\r\n### v1.1.0\r\n- \u5b8c\u5168\u517c\u5bb9requests API\r\n- \u81ea\u52a8\u542f\u52a8HTTP\u670d\u52a1\u5668\r\n- \u652f\u6301\u8868\u5355\u6570\u636e\u5904\u7406\r\n- \u6dfb\u52a0\u6279\u91cf\u8bf7\u6c42\u529f\u80fd\r\n- \u6539\u8fdb\u9519\u8bef\u5904\u7406\u548c\u91cd\u8bd5\u673a\u5236\r\n",
"bugtrack_url": null,
"license": null,
"summary": "DrissionPage\u6269\u5c55\u5305\uff0c\u63d0\u4f9b\u5f02\u6b65\u8bf7\u6c42\u529f\u80fd\uff0c\u901a\u8fc7HTTP\u670d\u52a1\u5668\u4e2d\u8f6c\u5b9e\u73b0",
"version": "1.1.0",
"project_urls": {
"Bug Reports": "https://github.com/DrissionPage/DrissionPage-expand/issues",
"Documentation": "https://github.com/DrissionPage/DrissionPage-expand/blob/main/README.md",
"Homepage": "https://github.com/DrissionPage/DrissionPage-expand",
"Source": "https://github.com/DrissionPage/DrissionPage-expand"
},
"split_keywords": [
"drissionpage",
"async",
"request",
"http",
"automation",
"web",
"scraping"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "43a4a66a03796a88ca6ed94340245284db72389ec6b8bbcbed832d44a14d6b42",
"md5": "bb75fc062e6ff085fcc2d97959939e35",
"sha256": "d3cac67bfda04727bdccc38508ee48e2572f7e55ae26e928b8c1380e7e3efdea"
},
"downloads": -1,
"filename": "DrissionPage_expand-1.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "bb75fc062e6ff085fcc2d97959939e35",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 15502,
"upload_time": "2025-09-20T09:12:15",
"upload_time_iso_8601": "2025-09-20T09:12:15.103151Z",
"url": "https://files.pythonhosted.org/packages/43/a4/a66a03796a88ca6ed94340245284db72389ec6b8bbcbed832d44a14d6b42/DrissionPage_expand-1.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "69976775a8119c88c8146a0fb491f945416d4f97617dee9571985d25d43c5610",
"md5": "5ff66a4cd338b37d5f8917c4e1345f24",
"sha256": "81d15bdcd5073108cf4104c7caadddbc159580887ad98b7a7f92b0cc0e3a68b8"
},
"downloads": -1,
"filename": "drissionpage_expand-1.1.0.tar.gz",
"has_sig": false,
"md5_digest": "5ff66a4cd338b37d5f8917c4e1345f24",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 16804,
"upload_time": "2025-09-20T09:12:16",
"upload_time_iso_8601": "2025-09-20T09:12:16.857661Z",
"url": "https://files.pythonhosted.org/packages/69/97/6775a8119c88c8146a0fb491f945416d4f97617dee9571985d25d43c5610/drissionpage_expand-1.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-20 09:12:16",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "DrissionPage",
"github_project": "DrissionPage-expand",
"github_not_found": true,
"lcname": "drissionpage-expand"
}