You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
11 KiB
11 KiB
大宗商品爬虫系统
项目概述
本项目为Java语言开发的大宗商品数据爬虫与可视化分析系统,核心目标是通过一套统一框架,爬取金投网、东方财富网、同花顺财经3个不同网站的相关数据,实现海量数据采集、存储、分析与可视化。
技术架构
分层架构
- 控制层(Controller): CrawlerController,统一调度爬虫策略
- 模型层(Model): 封装业务实体(行情、指数、舆情数据)
- 视图层(View): 基于JFreeChart实现可视化图表,支持HTML报告
- 策略层(Strategy): 统一爬虫策略接口,各站点实现具体策略
- 工厂层(Factory): 爬虫策略工厂,动态创建策略实例
- 仓储层(Repository): 数据持久化操作封装
- 命令层(Command): 基于Command模式实现命令管理
- 监控层(Monitor): WebSocket实时数据广播
设计模式
- 策略模式: 站点爬取逻辑解耦
- 工厂模式: 策略实例创建与管理
- MVC模式: 分层架构
- 命令模式: 命令封装与执行
- 仓储模式: 数据访问层抽象
技术栈
- Java 1.8+
- OkHttp3 (网络请求)
- Jsoup (网页解析)
- SQLite + MyBatis (数据持久化)
- JFreeChart (可视化图表)
- Apache POI (Excel导出)
- Gson (JSON处理)
- Apache PDFBox (PDF报告,中文黑体支持)
- Java-WebSocket (实时监控)
- SLF4J + Logback (日志)
快速开始
环境要求
- JDK 1.8+
- Maven 3.6+
- Windows系统(PDF报告生成需要黑体字体)
构建项目
cd commodity-crawler
mvn clean package -DskipTests
运行爬虫
# 启动交互式菜单(推荐)
java -jar target/commodity-crawler-1.0.0.jar
# 爬取所有站点(默认30页)
java -jar target/commodity-crawler-1.0.0.jar -s all -p 30
# 爬取指定站点
java -jar target/commodity-crawler-1.0.0.jar -s jintou -p 5
# 爬取并生成分析图表
java -jar target/commodity-crawler-1.0.0.jar -s all -p 30 -a
# 爬取并导出CSV
java -jar target/commodity-crawler-1.0.0.jar -s all -e csv
# 生成PDF分析报告
java -jar target/commodity-crawler-1.0.0.jar --report
# 爬取+导出+图表+报告+监控
java -jar target/commodity-crawler-1.0.0.jar -s all -e json -a -r -m
命令行参数
| 参数 | 说明 | 默认值 |
|---|---|---|
| -s, --site | 指定爬取站点 (jintou/eastmoney/tonghuashun/all) | all |
| -p, --pages | 指定爬取页数 | 30 |
| -a, --analyze | 执行数据分析并生成可视化图表 | false |
| -e, --export [格式] | 导出数据 (excel/csv/json,默认excel) | - |
| -r, --report | 生成PDF分析报告 | false |
| -m, --monitor | 启动WebSocket实时监控服务 | false |
| -h, --help | 显示帮助信息 | - |
功能特性
1. 数据爬取
- 支持金投网、东方财富网、同花顺财经三个站点
- 模拟数据生成(避免真实网络请求)
- 支持多线程并发爬取
- 完善的重试机制
- 默认爬取30页数据
2. 数据导出
- Excel格式 (.xlsx) - 支持格式化表格输出,Apache POI实现
- CSV格式 (.csv) - 支持UTF-8编码,Excel兼容
- JSON格式 (.json) - 结构化数据输出,Gson处理
导出目录:./output/excel/
3. 可视化分析
- 价格趋势对比分析(多折线图)
- 波动特征分析(柱状图)
- 相关性分析(散点图)
- 舆情联动分析
图表输出目录:./output/charts/
4. PDF报告生成
- 自动生成专业分析报告(中文)
- 黑体(simhei.ttf)字体支持
- 包含封面、目录、市场概览、数据表格
- 报告内容:市场概览、价格趋势分析、波动率分析、相关性分析、情绪分析、数据统计表
- 报告输出目录:
./output/report/
5. 实时监控大屏
- WebSocket实时数据推送
- 多商品实时价格监控面板
- 支持ECharts可视化
- 市场情绪分析
- 监控页面:
src/main/resources/webapp/monitor.html
爬取站点
1. 金投网 (jintou)
- 爬取内容:黄金、白银、原油历史行情
- 数据字段:交易日期、品种、开盘价、收盘价、最高价、最低价、成交量、涨跌幅
2. 东方财富网 (eastmoney)
- 爬取内容:大宗商品板块指数、相关概念股行情
- 数据字段:指数名称、日期、指数值、涨跌幅、概念股名称、股价、换手率
3. 同花顺财经 (tonghuashun)
- 爬取内容:大宗商品相关财经新闻、市场评论
- 数据字段:新闻标题、内容、发布时间、关联商品、舆情倾向
异常处理
系统设计了完整的异常处理层次:
- BaseCrawlException: 自定义异常父类
- NetworkException: 网络异常(支持重试机制)
- ParseException: 网页解析异常
- DbException: 数据库异常
- ParamException: 参数异常
重试机制
- 重试次数:可配置(默认3次)
- 重试间隔:递增间隔(1s、3s、5s)
- 续爬能力:断网后自动重试未完成任务
配置说明
配置文件:src/main/resources/application.properties
# 数据库配置
db.driver=org.sqlite.JDBC
db.url=jdbc:sqlite:./data/example_db.sqlite
# 爬虫配置
crawl.page.count=30 # 默认爬取页数(已从10调整为30)
crawl.retry.count=3 # 重试次数
crawl.retry.delay.initial=1000 # 初始重试间隔(ms)
crawl.retry.delay.multiplier=2 # 重试间隔倍数
crawl.request.interval=2000 # 请求间隔(ms)
# 线程池配置
thread.pool.core.size=5
thread.pool.max.size=10
# 输出配置
output.chart.dir=./output/charts/
output.excel.dir=./output/excel/
output.report.dir=./output/report/
output.log.dir=./logs/
# WebSocket配置
websocket.port=8080
项目结构
commodity-crawler/
├── src/main/java/com/example/crawler/
│ ├── CrawlMain.java # 主启动类
│ ├── InteractiveCLI.java # 交互式命令行界面
│ ├── command/ # 命令模式实现
│ │ ├── Command.java # 命令接口
│ │ ├── CommandInvoker.java # 命令调用者
│ │ ├── CrawlCommand.java # 爬取命令
│ │ ├── ExportDataCommand.java # 数据导出命令
│ │ ├── GenerateChartCommand.java # 图表生成命令
│ │ ├── GenerateReportCommand.java # PDF报告命令
│ │ ├── MonitorCommand.java # 实时监控命令
│ │ └── ViewDataCommand.java # 数据查看命令
│ ├── controller/
│ │ └── CrawlerController.java # 爬虫控制器
│ ├── exception/ # 异常类
│ ├── mapper/ # MyBatis Mapper
│ ├── model/ # 数据模型
│ │ ├── MarketData.java # 行情数据模型
│ │ ├── IndexData.java # 指数数据模型
│ │ └── NewsData.java # 舆情数据模型
│ ├── monitor/ # 实时监控模块
│ │ ├── DataBroadcaster.java # WebSocket服务器
│ │ └── PriceSnapshot.java # 价格快照
│ ├── repository/ # 仓储层
│ │ ├── MarketDataRepository.java
│ │ ├── IndexDataRepository.java
│ │ └── NewsDataRepository.java
│ ├── strategy/ # 策略层
│ │ ├── CrawlStrategy.java # 爬虫策略接口
│ │ ├── CrawlStrategyFactory.java
│ │ ├── JinTouCrawlStrategy.java
│ │ ├── EastMoneyCrawlStrategy.java
│ │ └── TongHuaShunCrawlStrategy.java
│ ├── util/ # 工具类
│ │ ├── exporter/ # 数据导出器
│ │ │ ├── DataExporter.java
│ │ │ ├── CsvExporter.java
│ │ │ ├── JsonExporter.java
│ │ │ └── DataExporterFactory.java
│ │ ├── ExcelExporter.java # Excel导出
│ │ ├── PdfReportGenerator.java # PDF报告生成器(中文支持)
│ │ ├── ChartGenerator.java # 图表生成器
│ │ ├── DateTypeHandler.java # MyBatis日期类型处理器
│ │ └── MyBatisUtil.java # MyBatis工具类
│ └── visualization/ # 可视化模块
├── src/main/resources/
│ ├── application.properties # 配置文件
│ ├── logback.xml # 日志配置
│ ├── mybatis-config.xml # MyBatis配置(含驼峰映射)
│ ├── schema.sql # 数据库初始化脚本
│ ├── mapper/ # MyBatis XML配置
│ │ ├── MarketDataMapper.xml
│ │ ├── IndexDataMapper.xml
│ │ └── NewsDataMapper.xml
│ └── webapp/ # Web资源
│ ├── echarts.min.js # ECharts库(本地化,支持离线)
│ └── monitor.html # 监控大屏页面(ECharts可视化)
└── pom.xml # Maven配置
核心特性说明
MyBatis字段映射
系统已配置mapUnderscoreToCamelCase=true,自动将数据库下划线命名字段映射到Java驼峰命名:
index_name→indexNameindex_value→indexValuechange_rate→changeRatestock_name→stockNamestock_price→stockPriceturnover_rate→turnoverRate
自定义日期类型处理器
DateTypeHandler支持:
- Unix时间戳(毫秒,13位)
- Unix时间戳(秒,10位)
- 日期字符串格式
- MySQL TIMESTAMP类型
PDF报告中文支持
- 使用黑体(simhei.ttf)字体
- 支持中文完整显示
- 包含8页完整报告内容
实时监控WebSocket
- 端口:8080
- 推送频率:每2秒更新
- 数据格式:JSON
- 监控页面自动连接
完整离线支持
系统支持完整离线运行,所有核心功能均不依赖网络:
- ✅ 数据爬取(使用模拟数据生成)
- ✅ 数据存储(SQLite本地数据库)
- ✅ 数据导出(Excel/CSV/JSON本地文件)
- ✅ 图表生成(JFreeChart本地生成)
- ✅ PDF报告(本地字体和PDFBox生成)
- ✅ 实时监控页面(ECharts库本地化)
扩展说明
新增爬虫站点
- 实现
CrawlStrategy接口 - 在
CrawlStrategyFactory中添加分支 - 无需修改原有代码
新增导出格式
- 实现
DataExporter接口 - 在
DataExporterFactory中注册 - 自动集成到导出命令
新增分析维度
- 在
ChartGenerator中添加新方法 - 实现图表生成逻辑
输出文件说明
| 类型 | 目录 | 说明 |
|---|---|---|
| 图表 | ./output/charts/ |
价格趋势、波动率、相关性、舆情分析图 |
| 数据 | ./output/excel/ |
Excel、CSV、JSON格式导出文件 |
| 报告 | ./output/report/ |
中文PDF分析报告 |
| 数据库 | ./data/ |
SQLite数据库文件 |
| 日志 | ./logs/ |
系统运行日志 |
注意事项
- 请确保遵守目标网站的 robots.txt 协议
- 合理设置请求间隔,避免触发反爬机制
- 首次运行会自动创建SQLite数据库文件
- PDF报告需要Windows系统黑体字体支持
- 建议定期清理输出目录中的历史文件
- 系统支持完整离线运行,所有核心功能均可在断网环境下正常使用
License
MIT License