招标信息通用抓取
用途
批量采集多平台招投标公告,输出一张可直接用于筛选决策的 Excel 表。平台清单、行业词表全部外置为 YAML 配置,新增平台不需要改代码。
何时使用
- "抓最近一周的招标信息" "查一下隧道/盾构方向的招标项目"
- "把某省公共资源交易平台的项目整理成表"
- "对比几个平台的招标信息,去重后给我一张表"
运行环境
C:/Users/YYQ/.workbuddy/binaries/python/envs/default/Scripts/python.exe
依赖:openpyxl(写 Excel)、PyYAML(读配置)。缺失时执行:
pip install openpyxl pyyaml
快速开始
PY="C:/Users/YYQ/.workbuddy/binaries/python/envs/default/Scripts/python.exe"
SK="C:/Users/YYQ/.workbuddy/skills/招标信息通用抓取"
# 最近 7 天,全部启用平台
"$PY" "$SK/scripts/tender_scrape.py" --days 7
# 关键词多组 + 排除词 + 地区
"$PY" "$SK/scripts/tender_scrape.py" --days 30 --kw 隧道 --kw 盾构 --kw 市政 \
--exclude 监理 --exclude 设计 --region 湖南,湖北 --max 200
# 指定平台 + 显式日期区间
"$PY" "$SK/scripts/tender_scrape.py" --start 2026-09-01 --end 2026-09-25 \
--platforms ccgp,jxggzy,hbggzy --workers 4 --interval 1.5
# 只要招投标类、跳过详情(快)
"$PY" "$SK/scripts/tender_scrape.py" --days 3 --types 招标 --no-detail
参数
| 参数 | 说明 | 默认 |
|---|---|---|
--kw |
关键词,可重复传入多组 | 空(不限) |
--kw-mode |
any 任一命中 / all 全部命中 |
any |
--exclude |
排除词,可重复传入 | 空 |
--region |
地区过滤,逗号分隔(匹配地区字段或标题) | 不限 |
--days N |
最近 N 天 | 7 |
--start/--end |
显式日期区间 YYYY-MM-DD(优先于 days) | — |
--types |
公告类型过滤:招标,中标,变更,废标 | 全部 |
--max |
总记录上限 | 500 |
--max-per-platform |
单平台记录上限 | 40 |
--platforms |
只抓指定平台 id,逗号分隔 | 全部启用 |
--workers |
并发数(跨平台并发,单平台内串行) | 6 |
--interval |
单平台内请求间隔秒 | 1.2 |
--retries / --timeout |
失败重试次数 / 单次超时秒 | 2 / 30 |
--pages |
覆盖配置中的 max_pages | 配置值 |
--no-detail |
跳过详情页,只取列表字段 | 关 |
--no-browser |
禁用浏览器渲染通道(adapter:browser 的平台将被跳过) |
关 |
--out / --log |
输出 xlsx / 日志文件路径 | outputs/ 下自动命名 |
输出结构(单个 .xlsx)
- 汇总:全部记录,去重后按公告发布时间倒序
- 按平台分表:每个有数据的来源平台一个工作表
- 采集日志:每平台的 列表项/时间窗内/关键词后/入库 与状态(成功 / 被拦截 / 跳过 / 无结果)
- 运行参数:时间范围、关键词、并发、去重规则等,便于复核
固定列顺序(不得调整):
序号 | 项目名称 | 招标/采购人 | 代理机构 | 项目地区 | 行业分类 | 预算或最高限价(万元) | 公告发布时间 | 投标截止时间 | 公告类型 | 原文链接 | 来源平台
去重规则:标题(去标点空格)+ 预算金额 + 投标截止时间 三元组相同时保留字段更完整的一条。
文件名格式:招标信息_YYYYMMDD_关键词.xlsx;同时生成 采集日志_YYYYMMDD.log。
配置与扩展
| 文件 | 作用 |
|---|---|
config/platforms.yaml |
平台清单(增删平台只改这里),含 enabled、block_reason、region_default、JSON 字段映射 |
config/industry.yaml |
行业分类词表,按顺序命中即停;未命中留空 |
assets/platform_template.yaml |
新增平台的条目模板 |
references/新增平台适配指南.md |
新增平台的完整步骤、探测脚本与常见失败对策 |
新增平台时:复制模板条目 → 探测列表页形态(服务端渲染 / JSON 接口 / JS 渲染)→ 填 adapter(html/json/browser)与字段映射 → 跑单平台回归 --platforms <id> → 确认入库数非 0 后把 enabled 置 true。详见 references/新增平台适配指南.md。
三种 adapter:
- html —— 服务端渲染列表,通用 li/tr/div 容器扫描,绝大多数政务站无需写正则
- json —— 列表页直接返回 JSON,按 json: 映射取字段,正文可复用免抓详情
- browser —— JS 动态渲染页面,用 playwright headless chromium 渲染后走 html 解析;需先装 playwright 并 python -m playwright install chromium。browser 平台串行执行(sync_api 非线程安全),排在普通平台之后;--no-browser 可整体禁用
健壮性约定
- 单平台失败不影响整体:列表抓取失败记录原因继续下一个平台;详情页失败则该条留空。
- 命中验证码 / 登录 / 反爬特征(或 HTTP 401/403/429/503)时标记
blocked,跳过该平台并在日志与「采集日志」表写明原因。 - 请求失败自动重试(默认 2 次,指数退避 + 随机抖动),单平台内按
--interval限速,跨平台并发互不干扰。 - 缺失字段一律留空,不得臆造。行业分类是按词表的规则化标注,未命中即留空;地区仅在正文明确给出或平台配置了
region_default时填写。
已知限制
- JS 动态渲染平台已通过
adapter: browser(playwright)覆盖;需先安装 playwright + chromium,未安装时 browser 平台自动跳过并在日志标明。browser 平台串行执行,速度比普通平台慢(每页约 3~5 秒)。 - 中国政府采购网对高频访问敏感,连续多轮抓取后可能返回 HTTP 500;此时降低
--workers、加大--interval(≥2s)并稍后重试。 - 部分省级站点在当前网络环境 DNS 不可达,配置中已
enabled: false并注明原因,换网络后重新探测即可启用。 - 强验证码(需人工滑动/拼图)的平台(上海、贵州)即使用浏览器也无法自动通过,保持禁用。
交付前自检
- 看控制台平台统计表,确认无大面积「被拦截 / 无结果」。
- 打开 Excel 的「采集日志」表核对跳过原因。
- 抽查 3~5 条「原文链接」能否打开,字段与原文一致。
- 提醒用户:本表为公开信息汇总,投标前以原始公告与招标文件为准。