wauo


Namewauo JSON
Version 0.9.6 PyPI version JSON
download
home_pageNone
SummaryA comprehensive Python utility library featuring web scraping, decorators, thread pool management, and database operations
upload_time2025-10-30 09:36:42
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseMIT
keywords spider crawler web-scraping thread-pool database mysql postgresql utils decorators
VCS
bugtrack_url
requirements fake_useragent loguru requests parsel pymysql psycopg2 dbutils
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Wauo - Python 工具大全

🚀 一个功能强大且易于使用的 Python 工具库,集成了爬虫、装饰器、线程池、数据库操作等实用功能。

## ✨ 核心特性

- **🕷️ 爬虫模块** - 简化的 HTTP 请求、响应处理和数据提取
- **🔧 装饰器集合** - 类型强校验、函数计时、错误处理等
- **⚡ 线程池管理** - 内存安全的线程池,自动防溢出
- **🗄️ 数据库支持** - 快速操作 MySQL 和 PostgreSQL
- **🎨 彩色输出** - 美观的终端颜色输出
- **📦 工具函数** - 多层字典取值、时间戳转换等实用工具

## 📋 系统要求

- Python 3.10 或更高版本
- 依赖包:requests, parsel, fake_useragent, loguru, pymysql, psycopg2, dbutils

## 🔧 安装

### 使用 pip(推荐)

```bash
pip install wauo -U
```

### 升级到最新版本

```bash
pip install --upgrade wauo
```

## 📚 使用指南

### 1️⃣ 爬虫模块

#### 基础请求

```python
from wauo import WauoSpider

spider = WauoSpider()

# GET 请求(默认)
url = 'https://github.com/markadc'
resp = spider.send(url)
print(resp.text)
```

#### POST 请求

```python
from wauo import WauoSpider

spider = WauoSpider()

api = 'https://api.example.com/endpoint'
payload = {
    'key1': 'value1',
    'key2': 'value2'
}

# 方式1:使用 data 参数
resp = spider.send(api, data=payload)

# 方式2:使用 json 参数
resp = spider.send(api, json=payload)
```

#### 响应处理

```python
from wauo import WauoSpider

spider = WauoSpider()
resp = spider.send("https://www.baidu.com")

# XPath 选择器
title = resp.get_one("//title/text()")
print(title)  # 输出:百度一下,你就知道

# 获取所有匹配项
links = resp.get_all("//a/@href")
```

#### 响应验证

**检查状态码**

```python
resp = spider.send('https://github.com/markadc')
# 如果响应码不在指定范围内则引发异常
resp.raise_for_status(codes=[200, 301, 302])
```

**检查响应内容**

```python
def is_valid_response(html: str) -> bool:
    """验证响应是否包含验证码"""
    return html.find('验证') == -1

resp = spider.send('https://wenku.baidu.com/wkvcode.html')
# 如果 is_valid_response 返回 False 则引发异常
resp.raise_for_text(validate=is_valid_response)
```

#### 设置默认请求头

```python
from wauo import WauoSpider

# 为所有请求设置默认 Cookie
cookie = 'Your Cookies Here'
spider = WauoSpider(default_headers={'Cookie': cookie})

resp1 = spider.send('https://github.com/markadc')
resp2 = spider.send('https://github.com/markadc/wauo')

# 两个请求都会自动携带 Cookie
print(resp1.request.headers)
print(resp2.request.headers)
```

### 2️⃣ 数据库模块

#### PostgreSQL 数据库操作

```python
from wauo.db import PostgresqlClient

# 配置数据库连接
psql_cfg = {
    "host": "localhost",
    "port": 5432,
    "db": "test",
    "user": "wauo",
    "password": "admin1",
}

# 创建客户端并连接
psql = PostgresqlClient(**psql_cfg)
psql.connect()

tname = 'users'

# 删除表(如果存在)
psql.drop_table(tname)

# 创建表
psql.create_table(tname, ['name', 'age'])

# 创建高级表(自动添加 id、created_at、updated_at)
# 使用 create_great_table 创建带时间追踪的表
psql.create_great_table('products', ['name', 'price', 'stock'])
# 自动包含:
# - id: 自增主键
# - created_at: 新增数据时自动记录创建时间(不为NULL)
# - updated_at: 修改数据时自动更新时间(初始为NULL,修改后才有值)

# 时间追踪示例
psql.insert_one('products', {'name': 'iPhone', 'price': '5999', 'stock': '100'})
# 查询结果:id=1, created_at='2025-10-30 10:00:00', updated_at=NULL

psql.update('products', {'price': '4999'}, "id = %s", (1,))
# 查询结果:id=1, created_at='2025-10-30 10:00:00', updated_at='2025-10-30 11:30:00'
# 通过 updated_at 可以判断数据是否被修改过!

# 插入单条数据
n = psql.insert_one(tname, {'name': 'Alice', 'age': 30})
print(f"插入行数: {n}")

# 批量插入数据
psql.insert_many(tname, [
    {'name': 'Bob', 'age': 25},
    {'name': 'Charlie', 'age': 35}
])

# 查询所有数据
rows = psql.query(f"SELECT * FROM {tname}")
for row in rows:
    print(dict(row))

# 更新数据
n = psql.update(tname, {'age': 31}, "name = %s", ('Alice',))
print(f"更新行数: {n}")

# 删除数据
n = psql.delete(tname, "name = %s", ('Bob',))
print(f"删除行数: {n}")

# 关闭连接
psql.close()
```

#### MySQL 数据库操作

```python
from wauo.db import MysqlClient

# 配置类似 PostgreSQL
mysql_cfg = {
    "host": "localhost",
    "port": 3306,
    "db": "test",
    "user": "root",
    "password": "password",
}

mysql = MysqlClient(**mysql_cfg)
mysql.connect()

# 使用方法与 PostgreSQL 相同
# ...
```

### 3️⃣ 工具函数

#### 彩色输出

```python
from wauo.printer import Printer

p = Printer()
p.red("这是红色消息")
p.green("这是绿色消息")
p.yellow("这是黄色消息")
p.blue("这是蓝色消息")
p.output("自定义颜色消息", "magenta")
```

![_printer.png](_printer.png)

#### 类型强校验装饰器

```python
from wauo.utils import type_check

@type_check
def add(x: int, y: int) -> int:
    """计算两个数的和"""
    return x + y

# ✅ 正确调用
result = add(1, 2)  # 返回 3

# ❌ 类型错误
try:
    add(1, "2")  # 引发异常:参数 'y' 应该是 <class 'int'> 而不是 <class 'str'>
except TypeError as e:
    print(f"错误: {e}")
```

#### 多层字典取值

```python
from wauo.utils import nget

data = {
    "user": {
        "info": {
            "profile": {
                "name": "张三",
                "age": 25
            }
        }
    }
}

# 安全地获取深层嵌套的值
name = nget(data, "user.info.profile.name")  # "张三"
age = nget(data, "user.info.profile.age")    # 25

# 键不存在时返回默认值
phone = nget(data, "user.info.contact.phone", failed="未提供")  # "未提供"

# 获取中间节点
profile = nget(data, "user.info.profile")
# {'name': '张三', 'age': 25}
```

### 4️⃣ 线程池管理

```python
from wauo.pool import PoolWait

def worker(task_id: int):
    """工作函数"""
    return f"Task {task_id} completed"

# 创建线程池管理器
pool = PoolWait(max_workers=10)

# 提交任务
for i in range(100):
    pool.submit(worker, i)

# 等待所有任务完成并获取结果
results = pool.get_results()
for result in results:
    print(result)
```

## 🔄 更新历史

- **v0.9.6** - 最新版本

  - ✨ PostgreSQL 新增 `create_great_table` 方法
    - 自动创建 id 主键(自增)
    - 自动添加 created_at 时间戳(新增时触发)
    - 自动添加 updated_at 时间戳(修改时触发)
    - 自动创建数据库触发器,实现时间字段自动更新

- **v0.9.5**

  - ✨ 新增 DB 模块,支持 MySQL 和 PostgreSQL 操作
  - ✨ 新增 `jsonp2json` 静态方法
  - ✨ 爬虫默认保持会话状态
  - ✨ 新增 `get_uuid` 和 base64 加解密静态方法
  - 🔄 优化 `send` 方法,增加 `delay` 参数支持
  - ✨ 新增 `update_default_headers` 方法
  - 📝 完善 `send` 方法注释

- **早期版本**
  - ✨ 添加装饰器函数集合
  - ✨ 线程池管理器支持上下文管理
  - ✨ `PoolWait` 和 `PoolMan` 线程池管理
  - ✨ 彩色输出(Printer)模块
  - 📝 多次参数优化和文档完善

## 📖 更多文档

关于每个模块的详细使用方法:

- [爬虫模块文档](docs/spiders.md)
- [数据库模块文档](docs/database.md)
- [线程池文档](docs/pool.md)
- [工具函数文档](docs/utils.md)

## 🤝 贡献

欢迎提交 Issue 和 Pull Request!

## 📄 许可证

MIT License

## 👤 作者

- **WangTuo** - [markadc@126.com](mailto:markadc@126.com)
- GitHub: [markadc/wauo](https://github.com/markadc/wauo)

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "wauo",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "spider, crawler, web-scraping, thread-pool, database, mysql, postgresql, utils, decorators",
    "author": null,
    "author_email": "WangTuo <markadc@126.com>",
    "download_url": "https://files.pythonhosted.org/packages/8a/ed/c46f72018cd20d0e56c4e478d63b3b65e8f656172b3a65f494a4698e9666/wauo-0.9.6.tar.gz",
    "platform": null,
    "description": "# Wauo - Python \u5de5\u5177\u5927\u5168\n\n\ud83d\ude80 \u4e00\u4e2a\u529f\u80fd\u5f3a\u5927\u4e14\u6613\u4e8e\u4f7f\u7528\u7684 Python \u5de5\u5177\u5e93\uff0c\u96c6\u6210\u4e86\u722c\u866b\u3001\u88c5\u9970\u5668\u3001\u7ebf\u7a0b\u6c60\u3001\u6570\u636e\u5e93\u64cd\u4f5c\u7b49\u5b9e\u7528\u529f\u80fd\u3002\n\n## \u2728 \u6838\u5fc3\u7279\u6027\n\n- **\ud83d\udd77\ufe0f \u722c\u866b\u6a21\u5757** - \u7b80\u5316\u7684 HTTP \u8bf7\u6c42\u3001\u54cd\u5e94\u5904\u7406\u548c\u6570\u636e\u63d0\u53d6\n- **\ud83d\udd27 \u88c5\u9970\u5668\u96c6\u5408** - \u7c7b\u578b\u5f3a\u6821\u9a8c\u3001\u51fd\u6570\u8ba1\u65f6\u3001\u9519\u8bef\u5904\u7406\u7b49\n- **\u26a1 \u7ebf\u7a0b\u6c60\u7ba1\u7406** - \u5185\u5b58\u5b89\u5168\u7684\u7ebf\u7a0b\u6c60\uff0c\u81ea\u52a8\u9632\u6ea2\u51fa\n- **\ud83d\uddc4\ufe0f \u6570\u636e\u5e93\u652f\u6301** - \u5feb\u901f\u64cd\u4f5c MySQL \u548c PostgreSQL\n- **\ud83c\udfa8 \u5f69\u8272\u8f93\u51fa** - \u7f8e\u89c2\u7684\u7ec8\u7aef\u989c\u8272\u8f93\u51fa\n- **\ud83d\udce6 \u5de5\u5177\u51fd\u6570** - \u591a\u5c42\u5b57\u5178\u53d6\u503c\u3001\u65f6\u95f4\u6233\u8f6c\u6362\u7b49\u5b9e\u7528\u5de5\u5177\n\n## \ud83d\udccb \u7cfb\u7edf\u8981\u6c42\n\n- Python 3.10 \u6216\u66f4\u9ad8\u7248\u672c\n- \u4f9d\u8d56\u5305\uff1arequests, parsel, fake_useragent, loguru, pymysql, psycopg2, dbutils\n\n## \ud83d\udd27 \u5b89\u88c5\n\n### \u4f7f\u7528 pip\uff08\u63a8\u8350\uff09\n\n```bash\npip install wauo -U\n```\n\n### \u5347\u7ea7\u5230\u6700\u65b0\u7248\u672c\n\n```bash\npip install --upgrade wauo\n```\n\n## \ud83d\udcda \u4f7f\u7528\u6307\u5357\n\n### 1\ufe0f\u20e3 \u722c\u866b\u6a21\u5757\n\n#### \u57fa\u7840\u8bf7\u6c42\n\n```python\nfrom wauo import WauoSpider\n\nspider = WauoSpider()\n\n# GET \u8bf7\u6c42\uff08\u9ed8\u8ba4\uff09\nurl = 'https://github.com/markadc'\nresp = spider.send(url)\nprint(resp.text)\n```\n\n#### POST \u8bf7\u6c42\n\n```python\nfrom wauo import WauoSpider\n\nspider = WauoSpider()\n\napi = 'https://api.example.com/endpoint'\npayload = {\n    'key1': 'value1',\n    'key2': 'value2'\n}\n\n# \u65b9\u5f0f1\uff1a\u4f7f\u7528 data \u53c2\u6570\nresp = spider.send(api, data=payload)\n\n# \u65b9\u5f0f2\uff1a\u4f7f\u7528 json \u53c2\u6570\nresp = spider.send(api, json=payload)\n```\n\n#### \u54cd\u5e94\u5904\u7406\n\n```python\nfrom wauo import WauoSpider\n\nspider = WauoSpider()\nresp = spider.send(\"https://www.baidu.com\")\n\n# XPath \u9009\u62e9\u5668\ntitle = resp.get_one(\"//title/text()\")\nprint(title)  # \u8f93\u51fa\uff1a\u767e\u5ea6\u4e00\u4e0b\uff0c\u4f60\u5c31\u77e5\u9053\n\n# \u83b7\u53d6\u6240\u6709\u5339\u914d\u9879\nlinks = resp.get_all(\"//a/@href\")\n```\n\n#### \u54cd\u5e94\u9a8c\u8bc1\n\n**\u68c0\u67e5\u72b6\u6001\u7801**\n\n```python\nresp = spider.send('https://github.com/markadc')\n# \u5982\u679c\u54cd\u5e94\u7801\u4e0d\u5728\u6307\u5b9a\u8303\u56f4\u5185\u5219\u5f15\u53d1\u5f02\u5e38\nresp.raise_for_status(codes=[200, 301, 302])\n```\n\n**\u68c0\u67e5\u54cd\u5e94\u5185\u5bb9**\n\n```python\ndef is_valid_response(html: str) -> bool:\n    \"\"\"\u9a8c\u8bc1\u54cd\u5e94\u662f\u5426\u5305\u542b\u9a8c\u8bc1\u7801\"\"\"\n    return html.find('\u9a8c\u8bc1') == -1\n\nresp = spider.send('https://wenku.baidu.com/wkvcode.html')\n# \u5982\u679c is_valid_response \u8fd4\u56de False \u5219\u5f15\u53d1\u5f02\u5e38\nresp.raise_for_text(validate=is_valid_response)\n```\n\n#### \u8bbe\u7f6e\u9ed8\u8ba4\u8bf7\u6c42\u5934\n\n```python\nfrom wauo import WauoSpider\n\n# \u4e3a\u6240\u6709\u8bf7\u6c42\u8bbe\u7f6e\u9ed8\u8ba4 Cookie\ncookie = 'Your Cookies Here'\nspider = WauoSpider(default_headers={'Cookie': cookie})\n\nresp1 = spider.send('https://github.com/markadc')\nresp2 = spider.send('https://github.com/markadc/wauo')\n\n# \u4e24\u4e2a\u8bf7\u6c42\u90fd\u4f1a\u81ea\u52a8\u643a\u5e26 Cookie\nprint(resp1.request.headers)\nprint(resp2.request.headers)\n```\n\n### 2\ufe0f\u20e3 \u6570\u636e\u5e93\u6a21\u5757\n\n#### PostgreSQL \u6570\u636e\u5e93\u64cd\u4f5c\n\n```python\nfrom wauo.db import PostgresqlClient\n\n# \u914d\u7f6e\u6570\u636e\u5e93\u8fde\u63a5\npsql_cfg = {\n    \"host\": \"localhost\",\n    \"port\": 5432,\n    \"db\": \"test\",\n    \"user\": \"wauo\",\n    \"password\": \"admin1\",\n}\n\n# \u521b\u5efa\u5ba2\u6237\u7aef\u5e76\u8fde\u63a5\npsql = PostgresqlClient(**psql_cfg)\npsql.connect()\n\ntname = 'users'\n\n# \u5220\u9664\u8868\uff08\u5982\u679c\u5b58\u5728\uff09\npsql.drop_table(tname)\n\n# \u521b\u5efa\u8868\npsql.create_table(tname, ['name', 'age'])\n\n# \u521b\u5efa\u9ad8\u7ea7\u8868\uff08\u81ea\u52a8\u6dfb\u52a0 id\u3001created_at\u3001updated_at\uff09\n# \u4f7f\u7528 create_great_table \u521b\u5efa\u5e26\u65f6\u95f4\u8ffd\u8e2a\u7684\u8868\npsql.create_great_table('products', ['name', 'price', 'stock'])\n# \u81ea\u52a8\u5305\u542b\uff1a\n# - id: \u81ea\u589e\u4e3b\u952e\n# - created_at: \u65b0\u589e\u6570\u636e\u65f6\u81ea\u52a8\u8bb0\u5f55\u521b\u5efa\u65f6\u95f4\uff08\u4e0d\u4e3aNULL\uff09\n# - updated_at: \u4fee\u6539\u6570\u636e\u65f6\u81ea\u52a8\u66f4\u65b0\u65f6\u95f4\uff08\u521d\u59cb\u4e3aNULL\uff0c\u4fee\u6539\u540e\u624d\u6709\u503c\uff09\n\n# \u65f6\u95f4\u8ffd\u8e2a\u793a\u4f8b\npsql.insert_one('products', {'name': 'iPhone', 'price': '5999', 'stock': '100'})\n# \u67e5\u8be2\u7ed3\u679c\uff1aid=1, created_at='2025-10-30 10:00:00', updated_at=NULL\n\npsql.update('products', {'price': '4999'}, \"id = %s\", (1,))\n# \u67e5\u8be2\u7ed3\u679c\uff1aid=1, created_at='2025-10-30 10:00:00', updated_at='2025-10-30 11:30:00'\n# \u901a\u8fc7 updated_at \u53ef\u4ee5\u5224\u65ad\u6570\u636e\u662f\u5426\u88ab\u4fee\u6539\u8fc7\uff01\n\n# \u63d2\u5165\u5355\u6761\u6570\u636e\nn = psql.insert_one(tname, {'name': 'Alice', 'age': 30})\nprint(f\"\u63d2\u5165\u884c\u6570: {n}\")\n\n# \u6279\u91cf\u63d2\u5165\u6570\u636e\npsql.insert_many(tname, [\n    {'name': 'Bob', 'age': 25},\n    {'name': 'Charlie', 'age': 35}\n])\n\n# \u67e5\u8be2\u6240\u6709\u6570\u636e\nrows = psql.query(f\"SELECT * FROM {tname}\")\nfor row in rows:\n    print(dict(row))\n\n# \u66f4\u65b0\u6570\u636e\nn = psql.update(tname, {'age': 31}, \"name = %s\", ('Alice',))\nprint(f\"\u66f4\u65b0\u884c\u6570: {n}\")\n\n# \u5220\u9664\u6570\u636e\nn = psql.delete(tname, \"name = %s\", ('Bob',))\nprint(f\"\u5220\u9664\u884c\u6570: {n}\")\n\n# \u5173\u95ed\u8fde\u63a5\npsql.close()\n```\n\n#### MySQL \u6570\u636e\u5e93\u64cd\u4f5c\n\n```python\nfrom wauo.db import MysqlClient\n\n# \u914d\u7f6e\u7c7b\u4f3c PostgreSQL\nmysql_cfg = {\n    \"host\": \"localhost\",\n    \"port\": 3306,\n    \"db\": \"test\",\n    \"user\": \"root\",\n    \"password\": \"password\",\n}\n\nmysql = MysqlClient(**mysql_cfg)\nmysql.connect()\n\n# \u4f7f\u7528\u65b9\u6cd5\u4e0e PostgreSQL \u76f8\u540c\n# ...\n```\n\n### 3\ufe0f\u20e3 \u5de5\u5177\u51fd\u6570\n\n#### \u5f69\u8272\u8f93\u51fa\n\n```python\nfrom wauo.printer import Printer\n\np = Printer()\np.red(\"\u8fd9\u662f\u7ea2\u8272\u6d88\u606f\")\np.green(\"\u8fd9\u662f\u7eff\u8272\u6d88\u606f\")\np.yellow(\"\u8fd9\u662f\u9ec4\u8272\u6d88\u606f\")\np.blue(\"\u8fd9\u662f\u84dd\u8272\u6d88\u606f\")\np.output(\"\u81ea\u5b9a\u4e49\u989c\u8272\u6d88\u606f\", \"magenta\")\n```\n\n![_printer.png](_printer.png)\n\n#### \u7c7b\u578b\u5f3a\u6821\u9a8c\u88c5\u9970\u5668\n\n```python\nfrom wauo.utils import type_check\n\n@type_check\ndef add(x: int, y: int) -> int:\n    \"\"\"\u8ba1\u7b97\u4e24\u4e2a\u6570\u7684\u548c\"\"\"\n    return x + y\n\n# \u2705 \u6b63\u786e\u8c03\u7528\nresult = add(1, 2)  # \u8fd4\u56de 3\n\n# \u274c \u7c7b\u578b\u9519\u8bef\ntry:\n    add(1, \"2\")  # \u5f15\u53d1\u5f02\u5e38\uff1a\u53c2\u6570 'y' \u5e94\u8be5\u662f <class 'int'> \u800c\u4e0d\u662f <class 'str'>\nexcept TypeError as e:\n    print(f\"\u9519\u8bef: {e}\")\n```\n\n#### \u591a\u5c42\u5b57\u5178\u53d6\u503c\n\n```python\nfrom wauo.utils import nget\n\ndata = {\n    \"user\": {\n        \"info\": {\n            \"profile\": {\n                \"name\": \"\u5f20\u4e09\",\n                \"age\": 25\n            }\n        }\n    }\n}\n\n# \u5b89\u5168\u5730\u83b7\u53d6\u6df1\u5c42\u5d4c\u5957\u7684\u503c\nname = nget(data, \"user.info.profile.name\")  # \"\u5f20\u4e09\"\nage = nget(data, \"user.info.profile.age\")    # 25\n\n# \u952e\u4e0d\u5b58\u5728\u65f6\u8fd4\u56de\u9ed8\u8ba4\u503c\nphone = nget(data, \"user.info.contact.phone\", failed=\"\u672a\u63d0\u4f9b\")  # \"\u672a\u63d0\u4f9b\"\n\n# \u83b7\u53d6\u4e2d\u95f4\u8282\u70b9\nprofile = nget(data, \"user.info.profile\")\n# {'name': '\u5f20\u4e09', 'age': 25}\n```\n\n### 4\ufe0f\u20e3 \u7ebf\u7a0b\u6c60\u7ba1\u7406\n\n```python\nfrom wauo.pool import PoolWait\n\ndef worker(task_id: int):\n    \"\"\"\u5de5\u4f5c\u51fd\u6570\"\"\"\n    return f\"Task {task_id} completed\"\n\n# \u521b\u5efa\u7ebf\u7a0b\u6c60\u7ba1\u7406\u5668\npool = PoolWait(max_workers=10)\n\n# \u63d0\u4ea4\u4efb\u52a1\nfor i in range(100):\n    pool.submit(worker, i)\n\n# \u7b49\u5f85\u6240\u6709\u4efb\u52a1\u5b8c\u6210\u5e76\u83b7\u53d6\u7ed3\u679c\nresults = pool.get_results()\nfor result in results:\n    print(result)\n```\n\n## \ud83d\udd04 \u66f4\u65b0\u5386\u53f2\n\n- **v0.9.6** - \u6700\u65b0\u7248\u672c\n\n  - \u2728 PostgreSQL \u65b0\u589e `create_great_table` \u65b9\u6cd5\n    - \u81ea\u52a8\u521b\u5efa id \u4e3b\u952e\uff08\u81ea\u589e\uff09\n    - \u81ea\u52a8\u6dfb\u52a0 created_at \u65f6\u95f4\u6233\uff08\u65b0\u589e\u65f6\u89e6\u53d1\uff09\n    - \u81ea\u52a8\u6dfb\u52a0 updated_at \u65f6\u95f4\u6233\uff08\u4fee\u6539\u65f6\u89e6\u53d1\uff09\n    - \u81ea\u52a8\u521b\u5efa\u6570\u636e\u5e93\u89e6\u53d1\u5668\uff0c\u5b9e\u73b0\u65f6\u95f4\u5b57\u6bb5\u81ea\u52a8\u66f4\u65b0\n\n- **v0.9.5**\n\n  - \u2728 \u65b0\u589e DB \u6a21\u5757\uff0c\u652f\u6301 MySQL \u548c PostgreSQL \u64cd\u4f5c\n  - \u2728 \u65b0\u589e `jsonp2json` \u9759\u6001\u65b9\u6cd5\n  - \u2728 \u722c\u866b\u9ed8\u8ba4\u4fdd\u6301\u4f1a\u8bdd\u72b6\u6001\n  - \u2728 \u65b0\u589e `get_uuid` \u548c base64 \u52a0\u89e3\u5bc6\u9759\u6001\u65b9\u6cd5\n  - \ud83d\udd04 \u4f18\u5316 `send` \u65b9\u6cd5\uff0c\u589e\u52a0 `delay` \u53c2\u6570\u652f\u6301\n  - \u2728 \u65b0\u589e `update_default_headers` \u65b9\u6cd5\n  - \ud83d\udcdd \u5b8c\u5584 `send` \u65b9\u6cd5\u6ce8\u91ca\n\n- **\u65e9\u671f\u7248\u672c**\n  - \u2728 \u6dfb\u52a0\u88c5\u9970\u5668\u51fd\u6570\u96c6\u5408\n  - \u2728 \u7ebf\u7a0b\u6c60\u7ba1\u7406\u5668\u652f\u6301\u4e0a\u4e0b\u6587\u7ba1\u7406\n  - \u2728 `PoolWait` \u548c `PoolMan` \u7ebf\u7a0b\u6c60\u7ba1\u7406\n  - \u2728 \u5f69\u8272\u8f93\u51fa\uff08Printer\uff09\u6a21\u5757\n  - \ud83d\udcdd \u591a\u6b21\u53c2\u6570\u4f18\u5316\u548c\u6587\u6863\u5b8c\u5584\n\n## \ud83d\udcd6 \u66f4\u591a\u6587\u6863\n\n\u5173\u4e8e\u6bcf\u4e2a\u6a21\u5757\u7684\u8be6\u7ec6\u4f7f\u7528\u65b9\u6cd5\uff1a\n\n- [\u722c\u866b\u6a21\u5757\u6587\u6863](docs/spiders.md)\n- [\u6570\u636e\u5e93\u6a21\u5757\u6587\u6863](docs/database.md)\n- [\u7ebf\u7a0b\u6c60\u6587\u6863](docs/pool.md)\n- [\u5de5\u5177\u51fd\u6570\u6587\u6863](docs/utils.md)\n\n## \ud83e\udd1d \u8d21\u732e\n\n\u6b22\u8fce\u63d0\u4ea4 Issue \u548c Pull Request\uff01\n\n## \ud83d\udcc4 \u8bb8\u53ef\u8bc1\n\nMIT License\n\n## \ud83d\udc64 \u4f5c\u8005\n\n- **WangTuo** - [markadc@126.com](mailto:markadc@126.com)\n- GitHub: [markadc/wauo](https://github.com/markadc/wauo)\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A comprehensive Python utility library featuring web scraping, decorators, thread pool management, and database operations",
    "version": "0.9.6",
    "project_urls": {
        "Documentation": "https://github.com/markadc/wauo#-usage-guide",
        "Homepage": "https://github.com/markadc/wauo",
        "Issues": "https://github.com/markadc/wauo/issues",
        "Repository": "https://github.com/markadc/wauo.git"
    },
    "split_keywords": [
        "spider",
        " crawler",
        " web-scraping",
        " thread-pool",
        " database",
        " mysql",
        " postgresql",
        " utils",
        " decorators"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "df24f00a73e8552d6778c33540c6842ee248986d43ce88828bbe90e0e3fef1a1",
                "md5": "20a0a1204fca2301bcb41793553b98d3",
                "sha256": "187e29d3268967a196feb05ff4d6ed49d6a1d2ded564f33dfe127c8628b1fd29"
            },
            "downloads": -1,
            "filename": "wauo-0.9.6-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "20a0a1204fca2301bcb41793553b98d3",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 47138,
            "upload_time": "2025-10-30T09:36:40",
            "upload_time_iso_8601": "2025-10-30T09:36:40.699649Z",
            "url": "https://files.pythonhosted.org/packages/df/24/f00a73e8552d6778c33540c6842ee248986d43ce88828bbe90e0e3fef1a1/wauo-0.9.6-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8aedc46f72018cd20d0e56c4e478d63b3b65e8f656172b3a65f494a4698e9666",
                "md5": "8c3ba238294936190215afcc8b99120b",
                "sha256": "2b30384e36de4a2f3007ebcb0680d3a59964269a4cdb15961f21ca2edc83047c"
            },
            "downloads": -1,
            "filename": "wauo-0.9.6.tar.gz",
            "has_sig": false,
            "md5_digest": "8c3ba238294936190215afcc8b99120b",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 37597,
            "upload_time": "2025-10-30T09:36:42",
            "upload_time_iso_8601": "2025-10-30T09:36:42.231103Z",
            "url": "https://files.pythonhosted.org/packages/8a/ed/c46f72018cd20d0e56c4e478d63b3b65e8f656172b3a65f494a4698e9666/wauo-0.9.6.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-30 09:36:42",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "markadc",
    "github_project": "wauo#-usage-guide",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [
        {
            "name": "fake_useragent",
            "specs": [
                [
                    "==",
                    "0.1.11"
                ]
            ]
        },
        {
            "name": "loguru",
            "specs": [
                [
                    "==",
                    "0.5.3"
                ]
            ]
        },
        {
            "name": "requests",
            "specs": [
                [
                    "==",
                    "2.28.1"
                ]
            ]
        },
        {
            "name": "parsel",
            "specs": [
                [
                    "==",
                    "1.9.1"
                ]
            ]
        },
        {
            "name": "pymysql",
            "specs": [
                [
                    "==",
                    "1.1.1"
                ]
            ]
        },
        {
            "name": "psycopg2",
            "specs": [
                [
                    "==",
                    "2.9.10"
                ]
            ]
        },
        {
            "name": "dbutils",
            "specs": [
                [
                    "==",
                    "3.1.1"
                ]
            ]
        }
    ],
    "lcname": "wauo"
}
        
Elapsed time: 2.80775s