## 一、项目概述
本项目是一个基于 Java 的**东京奥运会(2020)赛事数据爬虫与可视化系统**,以新浪体育东京奥运专题页面(`http://2020.sina.com.cn/`)为数据来源,自动抓取奥运**新闻资讯**和**中国代表团各项目奖牌数据**,持久化存储至本地 MySQL 数据库,并通过图形化桌面界面(Java Swing)进行数据展示与查询。
---
## 二、业务背景
东京奥运会于 2021 年 7 月 23 日至 8 月 8 日举行(因疫情延期一年)。新浪体育为此开设了专题页面,提供实时新闻报道和各项目奖牌查询 API。本项目通过爬虫技术对上述数据进行采集,服务于以下业务场景:
- **赛事跟踪**:快速聚合奥运新闻,方便集中浏览。
- **奖牌统计**:自动汇总中国代表团在射击、乒乓球、举重、跳水等 13 个重点项目的金/银/铜牌数量。
- **数据查询**:支持按关键词检索新闻标题和赛事名称,实现快速定位。
---
## 三、系统功能介绍
### 3.1 主界面 — 爬虫启动
| 功能 | 说明 |
|------|------|
| **一键爬取** | 点击"开始爬取"按钮,系统自动清空旧数据并重新采集 |
| **新闻采集** | 抓取新浪奥运首页的新闻链接,逐条进入详情页提取完整内容 |
| **奖牌采集** | 依次调用新浪奥运奖牌 API,获取 13 个运动项目的实时奖牌数据 |
| **进度反馈** | 控制台打印"....."进度提示;采集完成后弹出"爬取成功"对话框 |
| **自动跳转** | 成功后自动关闭启动窗口,打开"奥运数据一览"展示窗口 |
### 3.2 数据展示界面 — 奥运数据一览
#### Tab 1:新闻信息
| 功能 | 说明 |
|------|------|
| **列表展示** | 以表格展示所有新闻的标题、发布时间、发布者、正文内容 |
| **关键词搜索** | 在搜索框输入新闻标题关键词,点击"查询"进行模糊匹配过滤 |
| **实时刷新** | 界面加载时自动从数据库读取最新数据 |
#### Tab 2:奖牌信息
| 功能 | 说明 |
|------|------|
| **列表展示** | 以表格展示 13 个运动项目的金牌、银牌、铜牌合计数 |
| **关键词搜索** | 支持按赛事名称(如"乒乓球")进行模糊查询 |
| **实时刷新** | 组件渲染时自动加载数据库记录 |
**涵盖的 13 个赛事项目:**
> 射击、篮球、三对三篮球、田径、游泳、乒乓球、羽毛球、举重、跳水、蹦床、竞技体操、艺术体操、赛艇
四、项目技术架构
### 4.1 技术栈
| 层次 | 技术 / 库 | 版本 | 用途 |
|------|-----------|------|------|
| **界面层** | Java Swing | JDK 内置 | 桌面 GUI 组件 |
| **爬虫层** | Jsoup | 1.8.1 | HTML 解析、DOM 元素提取 |
| **HTTP 层** | Apache HttpClient | 4.5.6 | 发送 HTTP GET 请求、超时配置 |
| **JSON 层** | FastJSON | 1.2.73 | 解析新浪奖牌 API 返回的 JSONP 数据 |
| **数据层** | MySQL + JDBC | 5.7 / 5.1.21 | 数据持久化存储 |
| **日志层** | commons-logging | 1.2 | HttpClient 依赖 |
### 4.2 项目目录结构
```
2. 源代码/
├── src/
│ ├── dao/
│ │ ├── Crawler.java # 新闻爬虫核心类
│ │ ├── HttpRequestUtil.java # HTTP 工具类(奖牌 API 调用)
│ │ ├── DBManager.java # 数据库连接管理(静态单例)
│ │ ├── NewsInfoDao.java # 新闻数据库操作
│ │ └── MedalDao.java # 奖牌数据库操作
│ ├── model/
│ │ └── NewsInfo.java # 新闻实体类(POJO)
│ └── View/
│ ├── MainFrame.java # 主窗口(爬虫触发入口)
│ └── OlympicFrame.java # 数据展示窗口(选项卡页面)
├── lib/ # 第三方依赖 JAR 包
└── out/ # 编译输出目录
```
---
## 五、核心模块实现详解
### 5.1 新闻爬虫 — `Crawler.java`
**工作流程:**
```
访问 http://2020.sina.com.cn/
│
├─ 提取 class="ty-card-tt" 的卡片标题链接
│
└─ 提取 class="ty-card-type10-makeup" 的列表链接
│
└─ 遍历每条链接 → 访问详情页