195 lines
6.7 KiB
Markdown
195 lines
6.7 KiB
Markdown
|
|
# 公共资源交易中心爬虫 + 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 次/分钟 | 超出自动等待 |
|
|||
|
|
| 列表页延迟 | 3–6 秒 | 随机间隔 |
|
|||
|
|
| 详情页延迟 | 2–5 秒 | 随机间隔 |
|
|||
|
|
| 最大请求数 | 300 次/运行 | 超出停止 |
|
|||
|
|
| 连续失败熔断 | 5 次 | 触发后停止 |
|
|||
|
|
| 空响应检测 | ≤10 bytes | 反爬拦截后指数退避重试 |
|
|||
|
|
| 优雅退出 | Ctrl+C | 保存已采集数据后退出 |
|
|||
|
|
|
|||
|
|
### AI 处理层(ContentFetcher)
|
|||
|
|
|
|||
|
|
| 机制 | 配置值 | 说明 |
|
|||
|
|
|------|--------|------|
|
|||
|
|
| 请求速率 | 12 次/分钟 | 独立限速 |
|
|||
|
|
| 请求延迟 | 1.5–3 秒 | 每次请求前随机等待 |
|
|||
|
|
| 附件大小限制 | 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 分钟 |
|