招投标信息检索
目的
从全国公共资源交易平台、中国招标投标公共服务平台、中国政府采购网及各省级交易中心等公开渠道检索招投标信息,把散落在搜索结果里的半结构化内容,整理成字段规范、金额可比、可筛选的清单,交付 Markdown 表格(对话内直接看)+ Excel(二次加工)。
核心原则
只做公开信息的检索与整理,不编造、不绕过、不越界。具体红线见文末「硬性约束」。
何时使用
- 查找某地区 / 某行业近期在招项目(商机挖掘)
- 查询中标结果与中标单位(竞对分析、市场格局)
- 跟踪特定招标人的历史采购(如某医院近一年的信息化项目)
- 定期汇总行业招投标动态
参数与默认值
先解析用户需求,按下表补齐参数。缺失项直接使用默认值并在报告开头标注,不要为填参数而反复追问用户——只在需求歧义会导致结果完全不同时才提问(例如「项目」指代不明)。
| 参数 | 默认值 |
|---|---|
| 地区 | 全国(需按七大片区分批检索) |
| 行业 | 医疗健康(本技能已锁定;临时跨行业检索可显式传 --industry 其他行业关键词) |
| 公告类型 | 招标公告(在招项目) |
| 时间范围 | 近 30 天(freshness=d30) |
| 金额区间 | 不限制 |
| 目标条数 | 20–40 条有效记录 |
工作流
第 1 步:构造检索矩阵
可先运行 python scripts/search_matrix.py --region 广州 --industry 医疗健康 按公式自动生成 4–6 组查询词与 freshness 建议(词库见 references/query-cookbook.md),直接复制下发即可;需要自定义时再手工调整。本技能已默认锁定行业为「医疗健康」,可省略 --industry 参数。
读取 references/query-cookbook.md,按「地区词 + 行业关键词 + 公告类型词 + 时间限定」公式,生成 4–6 组互补查询。单条查询必然漏检,多角度并行覆盖是质量的关键。
要点:
site:语法在当前搜索中不可靠,会返回其他域名的结果。改用「平台名 + 域名片段」作普通关键词。- 时间限定优先用
WebSearch的freshness参数,比在关键词里写「近7天」可靠;同时在长查询里补写当前年份。 - 做商机挖掘时,务必额外检索「采购意向 / 需求公示」——比正式招标公告早 1–3 个月,是提前介入窗口。
第 2 步:执行检索
并行下发多组 WebSearch,浏览结果后:
- 用
references/sources.md的域名表判定来源档位(A 类官方可直接引用;B 类聚合需回源核对;C 类内容营销站禁止作为事实来源)。 - 对 A 类平台的关键公告,用
WebFetch打开原文抽取精确字段(预算金额、最高限价、项目编号、投标截止时间、代理机构)。搜索摘要常缺金额单位,必须回原文确认。 - 每条记录必须保留可点击的
url。 - WebFetch 回源失败 fallback 流程(B3):若某条公告 WebFetch 抓取失败(超时/反爬/页面改版),按以下顺序处理,不要直接留空了事:
- 重试 1 次(换
http/https或补充路径后重试); - 仍失败 → 用不同检索词(如项目编号、采购人名称)重新 WebSearch 定位其它镜像/转载页回源;
- 仍无法取得关键字段 → 该条照常入库,但
confidence保持medium(不得标 high),并在note标注「回源失败,待复核」;它会被自动收入报告末的「待核实清单」,供后续人工补抓。
- 重试 1 次(换
第 3 步:抽取为结构化 JSON
按 references/field-schema.md 的字段表,把结果写入中间 JSON 文件。要点:
- 金额照抄原文字符串(如
"31,000,000.00元"),归一化交给脚本,不要在抽取阶段手算。 confidence由脚本按来源url域名自动判定(规则见references/domains.json,可随时增删域名):- A 类官方媒介 →
high:公共资源交易平台、政府采购网等;新增兜底规则——所有.gov.cn政府站点一律判 A(如zfcg.gd.gov.cn、ggzy.shaanxi.gov.cn)。 - B 类聚合/转载 →
medium:剑鱼标讯(jianyu360.cn)、千里马(qianlima.com)、中国采购与招标网(chinabidding.com.cn) 等第三方标讯平台,必须在备注注明需回官方核对。 - C 类内容营销站 →
low:cnhh.com、中项网(ccpc360.com) 等,整行标黄并标注「二手来源需回官方核实」,禁止作为事实来源。 - 人工只需在已用 WebFetch 回源核对后显式标
high;其余留空,脚本自动判定,不必手填。
- A 类官方媒介 →
- 缺失字段填
null,绝不猜测填充。 - 用
--print-template获取空模板,或参考assets/sample_records.json中的完整样例(该样例故意包含 1 条无链接记录和 1 条同编号的更正公告,用于演示去重与丢弃规则):
python scripts/build_report.py --print-template
第 4 步:生成报告
python scripts/build_report.py --input records.json --outdir . --name "医疗健康招投标" --md-columns brief
脚本自动完成:金额归一化为万元、日期标准化、按项目编号去重(同号保留最新并标注「有更正」)、丢弃无链接条目、按发布日期倒序,输出 Markdown + Excel。
--md-columns brief(默认):对话内展示,列少易读--md-columns full:全字段,适合存档
Excel 为全字段,含冻结首行、自动筛选、金额数值列(可排序)、原文超链接;可信度 low 的行整行标黄。
Python 解释器优先使用 C:/Users/wtj/.workbuddy/binaries/python/envs/default/Scripts/python.exe(已装 openpyxl)。若环境无 openpyxl,脚本自动降级输出 CSV,不中断。
时间窗口与缓冲带(B2,可选)
需要严格按「近 N 天」卡时间时,加 --window-days N(默认不启用即保留全部)。启用后:窗口内正常保留;落在 [窗口, 窗口+缓冲] 的临近边界条目保留并标注「⚠️临近时间窗口边界」(不再像 freshness 硬阈值那样直接丢临近条目);超出窗口+缓冲的直接丢弃。缓冲带默认 5 天,可用 --buffer-days 调,--as-of 指定基准日(默认今天)。
python scripts/build_report.py --input records.json --outdir . --name "广州旧改近30天" \
--window-days 30 --buffer-days 5
HTML 可视化报告(C2,可选)
加 --html 额外输出一份自包含单页 HTML(无外部 CDN,离线可用,浅色主题),含汇总卡片、按类型/地区的柱状图、可筛选可排序明细表,以及「待核实清单」。适合汇报与长期留存。
python scripts/build_report.py --input records.json --outdir . --name "广州旧改近30天" --html
各类报告均会在末尾自动附「待核实清单」(B3):收录
confidence=low或medium且无金额的条目,提示回 A 类官方平台按项目编号核对后再引用。
增量缓存(可选,适合定期运行)
若每周/每日定期跑同一主题(如「广州老旧小区改造」),加 --cache <path>.json 即可跨次对比,只关注新增与变化:
python scripts/build_report.py --input records.json --outdir . --name "广州旧改周报" \
--cache ~/.cache/cn-tender-medical/gz-old-community.json --md-columns full
脚本会:按「项目编号 + 公告类型」做缓存键与历史逐条比对;给每条打 状态 列(新增 / 更新 / 未变);同条目字段变化(金额更正、中标单位公布、状态推进等)判为 更新 并在备注列出变更点(如「变更 中标单位: —→某某公司」);最后写回全量缓存供下次对比。Excel 里 new 行浅绿、updated 行浅橙、low 行浅黄,便于一眼区分。
配合 --only-new 只输出本次新增/更新的条目,适合直接推送给团队或定时任务:
python scripts/build_report.py --input records.json --outdir . --name "广州旧改增量" \
--cache ~/.cache/cn-tender-medical/gz-old-community.json --only-new
每个订阅主题用独立缓存文件;换主题或重跑历史时另建缓存,避免互相污染。
第 5 步:交付与说明
调用 present_files 呈现 Markdown 与 Excel。在回复中补充:
- 命中概况(条数、类型分布、地区分布)
- 值得关注的项目(金额最大、截止时间最近、与用户业务最匹配)
- 数据局限(哪些条目待核实、时间窗口、覆盖了哪些平台)
硬性约束
- 不编造任何金额、日期、项目编号、中标单位。缺失一律
—,宁缺勿猜。 - 只采集公开发布的信息。不尝试登录、不绕过验证码与反爬、不涉及 CA 锁或付费墙内容。招标文件下载需用户自行登录平台。
- 第三方聚合站数据不可直接引用,必须回 A 类官方平台按项目编号核对。
- 每份报告必须附免责声明(脚本已自动添加):数据来自公开渠道,以平台原文为准,不构成投标建议。
- 公告存在「更正公告」覆盖原文的情况,同项目编号以发布日期最新的一条为准。
参考资源
| 文件 | 用途 |
|---|---|
| references/sources.md | 平台清单、域名速查、可信度分档 |
| references/query-cookbook.md | 检索公式、行业关键词库、时间限定、漏检排查 |
| references/field-schema.md | 输出字段规范、金额/日期归一化规则、去重规则 |
| scripts/build_report.py | JSON → Markdown + Excel(+ 可选 HTML),含归一化、按域名自动判定可信度、去重;支持 --cache 增量模式(新增/更新/未变标注)、--only-new 增量推送、--window-days/--buffer-days 时间窗口过滤、--html 可视化报告;金额解析支持约/含税/区间 |
| scripts/tests/test_amount.py | 金额解析单测(python scripts/tests/test_amount.py,依赖 venv 内 pytest 之外的标准库 unittest) |
| scripts/search_matrix.py | 检索矩阵生成器:参数化生成 4–6 组查询词 + freshness 建议 |
| references/domains.json | 域名可信度分档(A/B/C),供 build_report.py 自动判定 confidence |
| assets/sample_records.json | 9 条真实公告样例,可直接跑 --input 验证脚本行为 |
微信扫一扫