4.6 KiB
4.6 KiB
南京公共工程建设中心 - 公告抓取工具
一个用于抓取南京公共工程建设中心公告信息的 Web 可视化工具。
功能特性
- ✅ 抓取公告列表(支持分页)
- ✅ 按时间范围智能抓取
- ✅ 抓取公告详情内容
- ✅ 智能提取预算金额
- ✅ 生成统计报告
- ✅ Web可视化界面
- ✅ 导出Word/Markdown报告
- ✅ RESTful API支持
安装
npm install
使用方法
1. 启动服务器
npm start
2. 访问界面
打开浏览器访问: http://localhost:3000
3. 功能介绍
公告列表标签
- 快速查看所有公告
- 支持分页浏览
- 一键获取最新公告列表
详情抓取标签
- 批量抓取公告详情
- 支持按时间范围抓取
- 自动提取预算金额
- 可自定义抓取数量
生成报告标签
- 支持按时间范围生成报告
- 设置金额阈值筛选项目
- 实时统计项目信息
- 一键导出Word/Markdown报告
报告示例
# 南京公共工程建设项目报告
**生成时间**: 2025/12/12 11:00:03
## 统计摘要
- 总项目数: 10
- 超过50万元的项目: 3
- 总金额: 5395.50万元
## 项目列表
### 1. 项目名称
- **发布日期**: 2025-12-12
- **发布时间**: 2025-12-12 10:35:00
- **预算金额**: 5000万元
- **链接**: https://...
API 接口文档
服务器启动后提供以下 RESTful API 接口:
1. 获取公告列表
GET /api/list?url=<列表页URL>&page=<页码>
参数:
url(可选): 列表页URL,默认为官网首页page(可选): 页码,默认为1
2. 按时间范围获取列表
POST /api/list-daterange
Content-Type: application/json
{
"startDate": "2025-11-01",
"endDate": "2025-12-31",
"maxPages": 23
}
3. 批量获取详情
POST /api/details
Content-Type: application/json
{
"items": [{ "title": "...", "href": "...", "date": "..." }],
"limit": 10
}
4. 生成报告
POST /api/report
Content-Type: application/json
{
"url": "https://gjzx.nanjing.gov.cn/gggs/",
"limit": 15,
"threshold": 50
}
5. 按时间范围生成报告
POST /api/report-daterange
Content-Type: application/json
{
"startDate": "2025-11-01",
"endDate": "2025-12-31",
"threshold": 50,
"maxPages": 23
}
技术栈
- 后端: Node.js + Express
- 爬虫: Axios + Cheerio
- 前端: 原生HTML/CSS/JavaScript
- 编码处理: iconv-lite (支持GBK/UTF-8)
- 文档导出: docx.js
项目结构
.
├── src/
│ └── server.js # Web服务器及API
├── public/
│ ├── index.html # Web界面
│ └── app.js # 前端逻辑
├── package.json
└── README.md
注意事项
- 抓取速度已限制为每条延迟500ms-1s,避免请求过快
- 仅支持 gjzx.nanjing.gov.cn 域名的详情页解析
- 金额提取基于正则匹配,支持多种格式(预算金额、最高限价等)
- Web服务器默认端口3000,可在 server.js 中修改
- 按时间范围抓取会在检测到所有公告早于起始日期时自动停止
- 编码自动识别,支持GBK和UTF-8网页
核心功能说明
时间范围抓取逻辑
按时间范围抓取时,程序会:
- 从第一页开始顺序抓取
- 检查每页公告的日期是否在指定范围内
- 如果某页所有公告都早于起始日期,自动停止抓取
- 支持设置最大页数限制,避免过度抓取
金额提取规则
支持识别以下格式:
- 预算金额: XX万元
- 最高限价: XX万元
- 预算: XX万元
- 金额: XX万元
- 直接数字: XX万元
编码处理
自动识别网页编码:
- 优先读取 Content-Type 中的 charset
- 自动处理 GBK、GB2312 编码
- 默认使用 UTF-8
常见问题
Q: 为什么抓取速度比较慢?
A: 为了避免对服务器造成过大压力,程序限制了请求频率(每条延迟500ms-1s)。这是一个负责任的爬虫设计。
Q: 如何抓取指定日期范围的公告?
A: 在Web界面的"详情抓取"和"生成报告"标签中勾选"按时间范围抓取",然后输入起始和结束日期即可。
Q: 导出的报告在哪里?
A: 点击"导出Word"或"导出Markdown"按钮后会自动下载到浏览器的默认下载目录。
Q: 可以抓取其他网站吗?
A: 需要修改 server.js 中的 BASE_URL 和相应的解析函数,因为不同网站的HTML结构不同。
更新日志
v1.0.0 (2025-12-12)
- Web可视化界面
- 支持按时间范围抓取
- 支持分页浏览
- 支持导出Word/Markdown报告
- RESTful API接口
- 自动编码识别
- 智能金额提取
License
MIT