# BidCol **Repository Path**: IceCream1012/bid-col ## Basic Information - **Project Name**: BidCol - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-20 - **Last Updated**: 2026-03-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # BidCol - 银行招标信息采集系统 一个专注于金融机构招标信息采集、分类、展示的自动化系统。 ## 核心功能 - 🔍 **多站点采集** - 支持金采网、政府采购网、省级平台、银行招标网站 - 🏦 **银行识别** - 自动识别122家金融机构的招标信息 - 🤖 **智能分类** - 关键词 + 大模型混合分类,识别IT项目 - 🌐 **Web检索系统** - FastAPI实时检索,支持搜索、筛选、预览、导出 - 📊 **数据报告** - 生成交互式HTML报告,Tab切换展示公告和结果 - 🏆 **结果采集** - 支持采集中标公告、废标公告、结果公告 - 📅 **日期过滤** - 支持采集指定日期范围的数据 - 📧 **邮件推送** - 自动推送IT项目到指定邮箱 - ⏰ **定时任务** - 每日自动采集、分类、推送 - 💾 **SQLite存储** - 无需安装数据库,开箱即用 ## 支持的站点 ### 银行招标站点 | 站点 | 类型 | site_key | 说明 | |------|------|----------|------| | 金采网 | API | `cfcpn` | 采购公告 | | 金采网全类型 | API | `cfcpn_all` | 采购/中标/废标/结果公告 | | 建设银行 | 动态 | `ccb` | JSON API拦截 | | 工商银行 | 动态 | `icbc` | API拦截模式 | | 招商银行 | 动态 | `cmb` | 动态渲染 | | 浦发银行 | 动态 | `spdb` | 动态渲染 | | 盛京银行 | 静态 | `shengjing_bank` | 辽宁本地银行 | | 大连银行 | 动态 | `dalian_bank` | 辽宁本地银行 | | 辽宁农商银行 | 动态 | `lnrcb_bank` | 辽宁本地银行 | | 辽沈银行 | 动态 | `liaoshen_bank` | 辽宁本地银行 | | 阜新银行 | 静态 | `fuxin_bank` | 辽宁本地银行 | | 鞍山银行 | 静态 | `anshan_bank` | 辽宁本地银行 | | 抚顺银行 | 静态 | `fushun_bank` | 辽宁本地银行 | | 营口银行 | 静态 | `yingkou_bank` | 辽宁本地银行 | | 本溪银行 | 静态 | `benxi_bank` | 辽宁本地银行 | | 葫芦岛银行 | 静态 | `huludao_bank` | 辽宁本地银行 | | 铁岭银行 | 静态 | `tieling_bank` | 辽宁本地银行 | | 朝阳银行 | 静态 | `chaoyang_bank` | 辽宁本地银行 | ### 政府采购站点 | 站点 | 类型 | site_key | 说明 | |------|------|----------|------| | 辽宁省公共资源交易中心 | API | `liaoning` | 全频道采集 | | 吉林省公共资源交易平台 | API | `jilin` | 政府采购频道 | | 招标采购网 | 静态 | `qgzb` | 国信招标与采购网 | | 招标采购网-辽宁 | 静态 | `qgzb_liaoning` | 辽宁地区筛选 | | 剑鱼标讯-辽宁 | 静态 | `jianyu360_liaoning` | 政府采购 | | 剑鱼标讯-吉林 | 静态 | `jianyu360_jilin` | 政府采购 | | 剑鱼标讯-黑龙江 | 静态 | `jianyu360_heilongjiang` | 政府采购 | ## 项目结构 ``` BidCol/ ├── spiders/ # 爬虫模块 (v2架构) │ ├── v2/ │ │ ├── base.py # 基类 │ │ ├── factory.py # 爬虫工厂 │ │ ├── registry.py # 注册中心 │ │ ├── static_spider.py # 静态爬虫 │ │ ├── api_spider.py # API爬虫 │ │ ├── dynamic_spider.py # 动态爬虫 │ │ ├── static/ # 静态站点 │ │ ├── api/ # API站点 │ │ │ └── cfcpn.py # 金采网 │ │ └── dynamic/ # 动态站点 │ │ └── bank_spider.py # 银行爬虫 ├── models/ # 数据模型 │ └── tender.py # 招标信息模型 ├── storage/ # 存储层 │ └── database.py # 数据库操作 ├── web/ # Web检索系统 │ ├── main.py # FastAPI入口 │ ├── config.py # 配置 │ ├── dependencies.py # 依赖注入 │ ├── api/ # API路由 │ │ ├── v1/ # v1版本API │ │ │ ├── tenders.py # 招标公告API │ │ │ ├── results.py # 招标结果API │ │ │ ├── stats.py # 统计API │ │ │ └── export.py # 导出API │ │ └── cfcpn.py # 金采网代理API │ ├── schemas/ # 数据模型 │ ├── templates/ # HTML模板 │ └── static/ # 静态资源 ├── scheduler/ # 定时任务 │ ├── job_scheduler_v2.py │ └── jobs/ │ └── crawl_job_v3.py ├── processor/ # 处理层 │ ├── classifier.py # 分类器 │ └── keywords.py # 关键词库 ├── reporter/ # 报告生成 │ └── html_reporter.py # HTML报告生成器 ├── tools/ # 工具脚本 │ └── report_server.py # 静态报告服务器 ├── notifier/ # 通知层 │ └── email_sender.py # 邮件发送器 ├── config/ # 配置 │ └── settings.py # 全局配置 ├── data/ # 数据目录 │ ├── bidcol.db # SQLite数据库 │ └── reports/ # HTML报告输出 ├── logs/ # 日志目录 ├── main.py # 主入口 ├── bidcol.py # OpenClaw CLI工具 (JSON输出) ├── run_scheduled.py # 定时调度入口 ├── query.py # 查询工具 ├── report.py # 报告生成工具 ├── skill.py # Skill模式入口 ├── clear_and_crawl.py # 清空并重新采集 └── requirements.txt # 依赖文件 ``` ## 快速开始 ### 1. 安装依赖 ```bash # 创建虚拟环境 python -m venv .venv # 激活虚拟环境 # Windows: .venv\Scripts\activate # Linux/Mac: source .venv/bin/activate # 安装依赖 pip install -r requirements.txt # 安装Playwright浏览器 playwright install chromium ``` ### 2. 配置环境变量 ```bash # 复制配置文件 cp .env.example .env # 编辑 .env 文件 ``` **.env 配置示例:** ```bash # 大模型配置(可选,用于更准确的分类) LLM_API_KEY=sk-your_deepseek_api_key_here LLM_BASE_URL=https://api.deepseek.com LLM_MODEL=deepseek-chat # 邮件配置(可选,用于自动推送) EMAIL_ENABLED=true SMTP_HOST=smtp.qq.com SMTP_PORT=587 SMTP_USER=your@qq.com SMTP_PASSWORD=your_qq_auth_code EMAIL_FROM=your@qq.com EMAIL_TO=recipient@example.com ``` ## CLI 命令 ### OpenClaw CLI (JSON输出) `bidcol.py` 提供标准JSON格式输出,适合程序化调用和系统集成: ```bash # 查看帮助 python bidcol.py --help # 采集数据 python bidcol.py crawl --start-date 2026-03-20 --end-date 2026-03-25 # 查询数据 python bidcol.py query --bank "建设银行" --limit 10 python bidcol.py query --keyword "采购" --start-date 2026-03-25 # 统计信息 python bidcol.py stats --days 7 --group-by date python bidcol.py stats --group-by bank --limit 10 # 生成报告 python bidcol.py report --days 7 # 列出站点 python bidcol.py sites python bidcol.py sites --all # 查看详情 python bidcol.py detail 1076 ``` **返回格式示例:** ```json { "success": true, "count": 5, "data": [...] } ``` ### Skill 模式 (推荐) ```bash # 采集昨天的数据并生成报告 python skill.py crawl # 采集指定日期的数据 python skill.py crawl --date 2026-03-23 # 采集招标结果 python skill.py result --type result --max-pages 3 # 生成最近7天的报告 python skill.py report --days 7 # 生成指定日期范围的报告 python skill.py report --start 2026-03-20 --end 2026-03-23 ``` > 详细配置见 [SKILL.md](SKILL.md) ### 数据采集 ```bash # 清空数据库并重新采集昨天的数据 python clear_and_crawl.py ``` ### 数据查询 ```bash # 启动交互式查询 python query.py ``` ### 报告生成 ```bash # 生成昨天的银行招标报告 python report.py -y # 生成最近3天的报告 python report.py -d 3 # 生成指定日期范围的报告 python report.py -s 2026-03-20 -e 2026-03-23 # 生成报告后自动打开 python report.py -y --open # 指定输出目录 python report.py -y -o data/custom_reports ``` ### 报告服务器 启动本地服务器查看报告(推荐,支持完整预览功能): ```bash # 默认端口8080 python tools/report_server.py # 自定义端口 python tools/report_server.py --port 9090 # 自定义报告目录 python tools/report_server.py --dir data/reports ``` 访问地址:`http://localhost:8080/bidcol20260325.html` **服务器功能**: - 静态文件服务 - 金采网详情API代理(绕过CORS限制) - HTML实体自动解码 ### Web检索系统 启动实时检索服务(推荐): ```bash # 启动服务 python -m uvicorn web.main:app --host 0.0.0.0 --port 18765 # 后台运行 nohup python -m uvicorn web.main:app --host 0.0.0.0 --port 18765 > app.log 2>&1 & # 多进程模式(生产环境推荐) gunicorn -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:18765 web.main:app ``` 访问地址:`http://localhost:18765` **功能特性**: | 功能 | 说明 | |------|------| | 📑 **Tab切换** | 招标公告 / 招标结果 独立搜索和筛选 | | 🔍 **实时搜索** | 支持标题、关键词搜索 | | 🏦 **多维度筛选** | 银行、来源、省份、日期、状态筛选 | | 👁️ **内容预览** | 金采网项目支持完整内容预览 | | 📊 **趋势图表** | 30天趋势、银行分布图表 | | 📤 **数据导出** | 导出CSV文件 | | 📱 **响应式设计** | 支持不同屏幕尺寸 | **API端点**: | 端点 | 说明 | |------|------| | `GET /api/v1/tenders` | 招标公告列表 | | `GET /api/v1/results` | 招标结果列表 | | `GET /api/v1/stats/overview` | 统计概览 | | `GET /api/v1/stats/trends` | 趋势数据 | | `GET /api/v1/stats/banks` | 银行分布 | | `POST /api/v1/export/csv` | 导出CSV | ### 定时调度 ```bash # 启动定时调度 python run_scheduled.py ``` ## 报告功能 系统支持生成交互式HTML报告,Tab切换展示招标公告和招标结果: ### 功能特性 | 功能 | 说明 | |------|------| | 📑 **Tab切换** | 招标公告 / 招标结果 独立展示 | | 📊 **数据统计** | 公告/结果总数、来源、天数、状态统计 | | 💰 **金额分析** | 中标金额总计、平均、最高、最低 | | 📈 **趋势图表** | 每日公告/结果趋势折线图 | | 🥧 **分布图表** | 站点分布、状态分布饼图 | | 🏦 **银行分布** | Top 20银行公告/结果统计 | | 📍 **省份分布** | 按省份统计 | | 🔍 **数据查询** | 支持标题搜索、多维度筛选 | | 📄 **分页展示** | 支持50/100/200/500条/页 | | 👁️ **内容预览** | 点击标题预览招标详情(金采网完整内容) | ### 内容预览功能 报告支持直接预览招标详情内容: | 操作 | 功能 | |------|------| | **点击标题** | 在模态框中预览详情 | | **点击👁️图标** | 在模态框中预览详情 | | **按P键** | 预览鼠标悬停行的内容 | | **源地址打开** | 在新窗口打开原始页面 | **启动报告服务器**(推荐): ```bash # 启动服务器(默认端口8080) python tools/report_server.py # 指定端口 python tools/report_server.py --port 9090 # 指定报告目录 python tools/report_server.py --dir data/reports ``` 启动后访问:`http://localhost:8080/bidcol20260325.html` > **注意**:启动服务器后,金采网项目可预览完整公告内容。直接打开HTML文件时,部分预览功能可能受限。 ### 招标公告Tab - **统计卡片**: 公告总数、数据来源、覆盖天数、IT项目数 - **趋势图表**: 每日公告数量趋势 - **站点分布**: 各站点公告数量及占比 - **银行分布**: Top 20银行公告统计 - **省份分布**: 按省份统计 - **数据查询**: 支持标题搜索、银行/来源/省份/类型/IT筛选 ### 招标结果Tab - **统计卡片**: 结果总数、中标数、废标数、数据来源 - **金额统计**: 总金额、平均金额、最高/最低金额 - **趋势图表**: 每日结果数量趋势 - **状态分布**: 中标/废标/成交等状态占比 - **银行分布**: Top 20银行结果统计 - **数据查询**: 支持标题搜索、银行/来源/状态筛选 ## 爬虫架构 ### 基类继承关系 ``` BaseSpider / \ / \ StaticSpider DynamicSpider \ / \ / ApiInterceptSpider ``` ### 爬虫类型 | 类型 | 基类 | 适用场景 | |------|------|---------| | StaticSpider | BaseSpider | 静态HTML页面 | | ApiSpider | BaseSpider | 直接调用API | | DynamicSpider | BaseSpider | 使用Playwright | | ApiInterceptSpider | DynamicSpider | 拦截SPA的API请求 | ### 注册新爬虫 ```python # spiders/v2/api/mysite.py from spiders.v2.api_spider import SimpleApiSpider from spiders.v2.registry import register_spider class MySiteSpider(SimpleApiSpider): def __init__(self): super().__init__( name="我的站点", base_url="https://example.com" ) # 注册爬虫 register_spider( site_key='mysite', name='我的站点', class_path='spiders.v2.api.mysite.MySiteSpider', spider_type='api', enabled=True ) ``` ## 数据模型 每条招标信息包含以下字段: | 字段 | 类型 | 说明 | |------|------|------| | title | TEXT | 招标标题 | | source | TEXT | 数据来源 | | source_url | TEXT | 原始链接(唯一) | | publish_time | TIMESTAMP | 发布时间 | | province | TEXT | 省份 | | tender_type | TEXT | 招标类型 | | status | TEXT | 招标状态 | | bank_name | TEXT | 银行名称 | | bank_short_name | TEXT | 银行简称 | | bank_code | TEXT | 银行代码 | | is_bank_tender | BOOLEAN | 是否银行招标 | | it_category | TEXT | IT分类 | | is_it_project | INTEGER | 是否IT项目 | | email_sent | INTEGER | 邮件发送状态 | ## 定时任务调度 系统使用 APScheduler 实现定时任务: | 任务 | 时间 | 说明 | |------|------|------| | 每日采集 | 06:00 | 采集昨天的招标公告和结果,完成后生成报告 | | 周末补采 | 每周日 07:00 | 采集上周一到周五的数据,完成后生成报告 | | 月初汇总 | 每月1号 08:00 | 采集上月全部数据,完成后生成报告 | | 银行专项 | 06:30 | 只采集银行站点数据,完成后生成报告 | ## OpenClaw 集成 系统提供 `bidcol.py` CLI 工具,支持标准JSON格式输出,可直接被 OpenClaw 或其他系统集成调用。 ### CLI 命令 | 命令 | 说明 | 示例 | |------|------|------| | `crawl` | 采集数据 | `python bidcol.py crawl --start-date 2026-03-25` | | `query` | 查询数据 | `python bidcol.py query --bank "建设银行"` | | `stats` | 统计信息 | `python bidcol.py stats --days 7 --group-by date` | | `report` | 生成报告 | `python bidcol.py report --days 7` | | `sites` | 列出站点 | `python bidcol.py sites --all` | | `detail` | 查看详情 | `python bidcol.py detail 123` | ### 调用示例 ```python import subprocess import json # 采集数据 result = subprocess.run( ["python", "bidcol.py", "crawl", "--start-date", "2026-03-25"], capture_output=True, text=True ) data = json.loads(result.stdout) print(f"采集: {data['stats']['saved']} 条") # 查询建设银行招标 result = subprocess.run( ["python", "bidcol.py", "query", "--bank", "建设银行", "--limit", "10"], capture_output=True, text=True ) data = json.loads(result.stdout) for item in data['data']: print(f"{item['publish_time']} - {item['title']}") ``` ### 返回格式 所有命令返回统一JSON格式: ```json { "success": true, "count": 10, "data": [...] } ``` ### Skill 配置示例 ```yaml # openclaw/skills/bidcol.yaml commands: daily_crawl: schedule: "0 6 * * *" command: "python bidcol.py crawl --start-date ${yesterday}" timeout: 600 query_bank: command: "python bidcol.py query --bank \"{bank}\" --limit 20" ``` ## 注意事项 1. **请求频率** - 已设置默认延迟,避免被封 2. **数据去重** - 基于 `source_url` 自动去重 3. **日期过滤** - 金采网支持智能停止,减少无效请求 4. **Playwright** - 动态站点需要安装Chromium浏览器 5. **银行识别** - 金采网所有数据自动标记为银行招标 ## 许可证 MIT License