订阅浙江招标信息
浙江省统一招标平台订阅 Skill(v1.0.0 · 作者:莫安来) — 基于 5 年专业团队运行经验升级
这是什么
监控浙江省公共资源交易服务平台(ggzy.zj.gov.cn)、浙江政府采购网及杭州/宁波/温州/湖州/嘉兴/绍兴/金华/衢州/舟山/台州/丽水 11 个地市分站的招标公告(默认推送),招标计划/开标结果/中标结果由用户主动查询时推送。每日定时增量抓取,结构化字段 + PDF 附件解析,生成简报并优先在 WorkBuddy 对话内展示,邮件/企微作为补充。
核心原则
| 原则 | 说明 | |------|------| | 定位窄 | 只做招投标信息监控,不闲聊 | | 增量推 | 只推上次游标之后的新条目,不重发全量 | | 异常透 | 详情页超时/解析失败在简报标红,不假装成功 | | 数据落库 | SQLite 主库 + 简道云双写,落库失败不推送 |
文件结构
订阅浙江招标信息/
├── SKILL.md # 指令与行为约束(给大模型看)
├── config.yaml # 元数据、触发词、定时、参数 schema
├── README.md # 本文件
├── assets/
│ ├── parse_rules.json # 分类解析规则库(建设工程/水利/采购/中标/通用)
│ ├── keywords.txt # 300+ 行业关键词
│ └── brief_template.md # 五分钟简报模板
├── scripts/
│ ├── crawl_pipeline.py # 【绿区】列表页→详情页→字段解析→落库
│ ├── pdf_parser.py # 【黄区】pdfplumber + OCR 双引擎
│ ├── dedup_store.py # 【红区】SQLite 写入与去重
│ └── notifier.py # 【绿区】推送到 WorkBuddy/企微/邮件
├── tests/
│ └── sample_pages/ # 各地市详情页 HTML 样例
└── data/ # 运行时生成
├── tender_monitor.db # SQLite 数据库
├── last_cursor.json # 各管道游标
└── latest_brief.md # 最新简报
分区管理
| 区 | 文件 | 原则 |
|----|------|------|
| 绿区 | crawl_pipeline.py notifier.py | 日常跑,可随时改动 |
| 黄区 | pdf_parser.py | 调试区,改动后需跑样例页回归 |
| 红区 | dedup_store.py | 落库接口,轻易不动,改动需 review |
快速开始
1. 安装依赖
pip install requests pdfplumber pdf2image paddleocr pandas beautifulsoup4 lxml pyyaml
PaddleOCR 还需要安装 PaddlePaddle,详见 PaddleOCR 文档。 不装 PaddleOCR 也能跑,扫描件会降级标
manual_partial。
2. 运行
# 默认配置(监控全省,仅招标公告)
python scripts/crawl_pipeline.py
# 指定地区和渠道(用户主动查询时用)
python scripts/crawl_pipeline.py --regions 湖州,杭州 --channels 中标结果,开标结果
# 只解析某个 PDF 附件
python scripts/pdf_parser.py /path/to/attachment.pdf
# 手动推送简报
python scripts/notifier.py --brief-file data/latest_brief.md --target 企微群
3. 定时运行
config.yaml 中的 cron 配置(15 7,30 8,0 8 * * *)对应每日 7:15 / 7:30 / 8:00 / 8:30 四趟。挂 WorkBuddy Runtime 定时器自动触发。
数据源
| 源 | 域名 | 覆盖 | |----|------|------| | 浙江省公共资源交易服务平台 | ggzy.zj.gov.cn | 全省 | | 浙江政府采购网 | zfcg.czt.zj.gov.cn | 全省(采购类) | | 杭州分站 | ggzy.hz.gov.cn | 杭州 | | 宁波分站 | ggzy.nb.gov.cn | 宁波 | | 温州分站 | ggzy.wz.gov.cn | 温州 | | 湖州分站 | ggzy.huz.gov.cn | 湖州 | | 嘉兴分站 | ggzy.jx.gov.cn | 嘉兴 | | 绍兴分站 | ggzy.sx.gov.cn | 绍兴 | | 金华分站 | ggzy.jh.gov.cn | 金华 | | 衢州分站 | ggzy.qz.gov.cn | 衢州 | | 舟山分站 | ggzy.zs.gov.cn | 舟山 | | 台州分站 | ggzy.tz.gov.cn | 台州 | | 丽水分站 | ggzy.ls.gov.cn | 丽水 | | 找必达 | zhaobide.com | 全国/浙江招标信息聚合(已接入·真实抓取) | | 杭州建设工程交易 | ggzy.hzctc.hangzhou.gov.cn:18003 | 杭州建设工程(已接入·真实抓取) | | 杭州城建招采 | jczx.hzcjtz.com | 杭州城建工程(已接入·真实抓取) |
接入状态:找必达 / 杭州建设工程交易 / 杭州城建招采 三个新源已实现真实爬虫抓取(列表页→结构化字段,增量去重)。「政府采购」类数据由 浙江政府采购网(zfcg.czt.zj.gov.cn) 覆盖(已在全省源列表)。原拟接入的政采云(b.zhengcaiyun.cn)因阿里云 WAF 交互式滑动验证无法自动化绕过,已从源列表移除。
四类管道
- 招标计划 — 年度/季度采购意向、工程招标计划
- 招标公告 — 正式招标/竞争性谈判/询价公告(默认唯一推送渠道)
- 开标结果 — 开标记录表
- 中标结果 — 中标/成交公告
推送默认规则:定时推送只发「招标公告」。招标计划 / 开标结果 / 中标结果 不主动推送,仅在用户对话里主动查询(如"上周杭州中标了啥""查一下开标结果")时才抓取并出简报。简报排版紧凑,已去掉招标人、标段编号、字段表。
个性化过滤
在 config.yaml 的 inputs 中配置:
watch_regions:监控地市(多选)keywords:关键词(逗号分隔)min_amount:金额阈值(元)tenderer_whitelist:招标人白名单(逗号分隔,留空则不限)channels:订阅管道(默认仅「招标公告」;其余管道需用户主动查询才推送)
去重策略
- 主键:
平台名 + 标段编号 + 发布时间 - 兜底:标段编号缺省时用
md5(项目名称) + 招标人 - 游标文件
last_cursor.json记录各管道最后一条发布时间
PDF 解析
- 原生 PDF →
pdfplumber.extract_text()+extract_tables() - 扫描件判定:
page.chars密度 < 50 → 转 300dpi 图 → PaddleOCR → PP-Structure 还原表格 - 解析状态:
auto/manual_partial/manual_full/failed
推送渠道
| 渠道 | 优先级 | 配置 | 说明 |
|------|--------|------|------|
| WorkBuddy | 默认 / 优先 | 无需配置 | 简报直接输出到对话,原文/附件链接可直接点击打开 |
| 企微群 | 补充 | WECOM_BOT_WEBHOOK 环境变量 | 群机器人 webhook 地址 |
| 邮件 | 补充 | SMTP_HOST / SMTP_USER / SMTP_PASS / TENDER_NOTIFY_TO | SMTP_SSL, cron 自动发送备份 |
反爬克制
- UA 池轮换(5 个 UA)
- 请求间隔 0.5~1.3s(随机抖动)
- 并发默认 5(最大 10)
- 遇 429 退避 60s,不绕验证码
- 详情页超时 15s,不无限重试
与湖州单站版的区别
| 维度 | 湖州单站 | 浙江省 Skill 包 | |------|----------|------------------| | 覆盖 | 1 个站 | 全省 + 11 地市分站 | | 管道 | 招标公告 + 中标结果 | 四类管道分流(默认仅招标公告推送,其余查询才推) | | 存储 | 简道云 | SQLite 主库 + 简道云双写 | | PDF | pdfplumber 单引擎 | pdfplumber + PaddleOCR 双引擎 | | 推送 | WorkBuddy | WorkBuddy 优先,企微/邮件补充 | | 触发 | 手动 | cron 定时 + 对话触发 | | 分区 | 无 | 绿/黄/红三区管理 |
微信扫一扫