DrissionPage-expand


NameDrissionPage-expand JSON
Version 1.1.0 PyPI version JSON
download
home_pagehttps://github.com/DrissionPage/DrissionPage-expand
SummaryDrissionPage扩展包,提供异步请求功能,通过HTTP服务器中转实现
upload_time2025-09-20 09:12:16
maintainerNone
docs_urlNone
authorDrissionPage Expand
requires_python>=3.7
licenseNone
keywords drissionpage async request http automation web scraping
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # DrissionPage扩展包

[![PyPI version](https://badge.fury.io/py/DrissionPage-expand.svg)](https://badge.fury.io/py/DrissionPage-expand)
[![Python versions](https://img.shields.io/pypi/pyversions/DrissionPage-expand.svg)](https://pypi.org/project/DrissionPage-expand/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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[![PyPI version](https://badge.fury.io/py/DrissionPage-expand.svg)](https://badge.fury.io/py/DrissionPage-expand)\r\n[![Python versions](https://img.shields.io/pypi/pyversions/DrissionPage-expand.svg)](https://pypi.org/project/DrissionPage-expand/)\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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"
}
        
Elapsed time: 2.48175s