Files
ztb/README.md
2026-02-13 18:15:20 +08:00

195 lines
6.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 公共资源交易中心爬虫 + AI 处理系统
自动采集浙江省/台州市公共资源交易中心的招标信息,经 DeepSeek AI 提取结构化字段后,上传至简道云表单。
```
爬虫采集 → 字段映射 → 内容获取(页面+附件) → DeepSeek AI 提取 → 简道云上传
```
---
## 支持的管道
| 站点 | 公告类型 | AI 提取字段 | 简道云表单 |
|------|----------|------------|------------|
| 浙江省 | 招标文件公示 | 类型、地区、投标截止日、最高投标限价、最高限价、资质要求、业绩要求、评标办法、评分说明与资信评分标准、有无答辩、招标人、项目概况、造价付款方式 | 浙江招标文件公示 |
| 浙江省 | 招标公告 | 批准文号、投标截止日 | 浙江招标公告 |
| 浙江省 | 澄清修改 | 批准文号 | 浙江澄清修改 |
| 台州市 | 招标计划公示 | 预估金额、类型、批准文号 | 台州招标计划 |
| 台州市 | 招标公告 | 批准文号、投标截止日 | —(暂无表单) |
---
## 快速开始
### 安装依赖
```bash
pip install requests beautifulsoup4 pdfplumber python-docx
```
### 单次运行
```bash
# 仅爬取
python main.py -s zhejiang -c 工程建设 -t 招标文件公示 -p 5 -d yesterday
# 爬取 + AI 处理
python main.py -s zhejiang -c 工程建设 -t 招标文件公示 -p 5 -d yesterday -P
# 爬取 + AI 处理 + 上传简道云
python main.py -s zhejiang -c 工程建设 -t 招标文件公示 -p 5 -d yesterday -P -U
# 台州招标计划
python main.py -s taizhou -c 工程建设 -t 招标计划公示 -p 3 -d yesterday -P -U
# 全部站点
python main.py -s all -c 工程建设 -t 招标公告 -p 1 -d yesterday -P
```
### 参数说明
| 参数 | 说明 | 示例 |
|------|------|------|
| `-s` | 站点 | `zhejiang` / `taizhou` / `all` |
| `-p` | 爬取页数 | `5`(默认 5 |
| `-c` | 交易领域 | `工程建设` / `政府采购` |
| `-t` | 公告类型 | `招标文件公示` / `招标公告` / `澄清修改` / `招标计划公示` |
| `-d` | 日期过滤 | `yesterday` / `2026-02-10` |
| `-a` | 下载附件 | 开关 |
| `-P` | 启用 AI 处理 | 开关,需配合 `-t` |
| `-U` | 上传简道云 | 开关,需配合 `-P` |
### 定时任务
```bash
# 直接运行(采集昨天全部任务)
python scheduler.py
# Windows 计划任务(每天 08:00
schtasks /create /tn "ZTB_Spider" /tr "python C:\path\to\ztb\scheduler.py" /sc daily /st 08:00
```
`scheduler.py` 中的 `DAILY_TASKS` 定义每天自动执行的任务,当前配置:
- 浙江 招标文件公示20 页 + AI + 上传)
- 台州 招标计划公示7 页 + AI + 上传)
---
## 项目结构
```
ztb/
├── main.py # 命令行入口
├── scheduler.py # 定时任务入口
├── config.py # 全局配置站点、AI、简道云
├── spiders/
│ ├── base.py # 爬虫基类(限速、重试、熔断)
│ ├── zhejiang.py # 浙江省爬虫
│ └── taizhou.py # 台州市爬虫
├── processors/
│ ├── pipeline.py # 处理管道(串联全流程)
│ ├── content_fetcher.py # 页面 + 附件内容获取
│ ├── deepseek.py # DeepSeek AI 字段提取
│ └── jiandaoyun.py # 简道云上传
├── utils/
│ └── attachment.py # 附件下载工具
├── data/ # 输出CSV + JSON
├── logs/ # 日志
└── temp_files/ # 临时附件(自动清理)
```
---
## 数据流
### 1. 爬虫输出
**浙江省**:标题、发布日期、地区、公告类型、链接、来源 + 项目名称、项目代码、招标人、招标代理、联系电话、招标估算金额
**台州市**:标题、发布日期、地区、链接、来源 + 项目名称、招标人、项目批准文号、项目类型、计划招标时间、预估合同金额(万元)
### 2. 字段映射pipeline._map_fields
```
标题 → 名称
发布日期 → 发布时间 + 项目发布时间
链接 → 招标文件链接 / 公告链接 / 数据源链接 / 澄清文件链接
公告类型 → 招标阶段
项目批准文号 → 批准文号
项目类型 → 类型
预估合同金额 → 预估金额(自动补"万元"
计划招标时间 → 招标时间
```
### 3. AI 提取 → 合并
- AI 值有效(非"文档未提及")→ **覆盖**原值
- AI 返回"文档未提及" → **保留**爬虫原值
### 4. 输出文件
- CSV`data/浙江省公共资源交易中心_20260211_092500.csv`
- JSON`data/浙江招标文件公示_AI处理_20260211_093446.json`
---
## 安全机制
### 爬虫层BaseSpider
| 机制 | 配置值 | 说明 |
|------|--------|------|
| 请求速率 | 10 次/分钟 | 超出自动等待 |
| 列表页延迟 | 36 秒 | 随机间隔 |
| 详情页延迟 | 25 秒 | 随机间隔 |
| 最大请求数 | 300 次/运行 | 超出停止 |
| 连续失败熔断 | 5 次 | 触发后停止 |
| 空响应检测 | ≤10 bytes | 反爬拦截后指数退避重试 |
| 优雅退出 | Ctrl+C | 保存已采集数据后退出 |
### AI 处理层ContentFetcher
| 机制 | 配置值 | 说明 |
|------|--------|------|
| 请求速率 | 12 次/分钟 | 独立限速 |
| 请求延迟 | 1.53 秒 | 每次请求前随机等待 |
| 附件大小限制 | 50 MB | 超出跳过 |
| 内容长度限制 | 120,000 字符 | 超长内容智能截取关键段落 |
| API 失败回退 | 本地正则 | DeepSeek 不可用时降级提取 |
| 临时文件清理 | 自动 | 解析后立即删除 |
---
## 配置说明
所有配置集中在 `config.py`
- `SPIDER_CONFIG` — 爬虫延迟、重试、限速
- `DEEPSEEK_API_KEY` — DeepSeek API 密钥
- `PROCESSING_CONFIG` — AI 处理超时、内容长度限制
- `REGION_CONFIGS` — 每个管道的 AI 字段定义
- `DEEPSEEK_PROMPTS` — 15 个字段的提示词模板
- `JDY_CONFIG` — 简道云表单 ID 和字段映射
### 添加新管道
1.`REGION_CONFIGS` 中添加 `"site:notice_type"` 条目
2. 如需新的 AI 字段,在 `DEEPSEEK_PROMPTS` 中添加提示词
3. 如需上传,在 `JDY_CONFIG["forms"]` 中添加表单配置
4. 可选:在 `scheduler.py``DAILY_TASKS` 中添加定时任务
---
## 测试记录2026-02-11
5 个管道全部通过71 条记录 AI 处理成功率 100%
| 管道 | 爬取 | AI 成功 | 耗时 |
|------|------|---------|------|
| 台州 招标计划公示 | 1 条 | 1/1 | ~12 秒 |
| 浙江 招标文件公示 | 20 条 | 20/20 | ~10 分钟 |
| 浙江 招标公告 | 20 条 | 20/20 | ~3 分钟 |
| 浙江 澄清修改 | 20 条 | 20/20 | ~2 分钟 |
| 台州 招标公告 | 10 条 | 10/10 | ~2 分钟 |