# 大宗商品爬虫系统 ## 项目概述 本项目为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报告生成需要黑体字体) ### 构建项目 ```bash cd commodity-crawler mvn clean package -DskipTests ``` ### 运行爬虫 ```bash # 启动交互式菜单(推荐) 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` ```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` → `indexName` - `index_value` → `indexValue` - `change_rate` → `changeRate` - `stock_name` → `stockName` - `stock_price` → `stockPrice` - `turnover_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库本地化) ## 扩展说明 ### 新增爬虫站点 1. 实现 `CrawlStrategy` 接口 2. 在 `CrawlStrategyFactory` 中添加分支 3. 无需修改原有代码 ### 新增导出格式 1. 实现 `DataExporter` 接口 2. 在 `DataExporterFactory` 中注册 3. 自动集成到导出命令 ### 新增分析维度 1. 在 `ChartGenerator` 中添加新方法 2. 实现图表生成逻辑 ## 输出文件说明 | 类型 | 目录 | 说明 | |------|------|------| | 图表 | `./output/charts/` | 价格趋势、波动率、相关性、舆情分析图 | | 数据 | `./output/excel/` | Excel、CSV、JSON格式导出文件 | | 报告 | `./output/report/` | 中文PDF分析报告 | | 数据库 | `./data/` | SQLite数据库文件 | | 日志 | `./logs/` | 系统运行日志 | ## 注意事项 1. 请确保遵守目标网站的 robots.txt 协议 2. 合理设置请求间隔,避免触发反爬机制 3. 首次运行会自动创建SQLite数据库文件 4. PDF报告需要Windows系统黑体字体支持 5. 建议定期清理输出目录中的历史文件 6. 系统支持完整离线运行,所有核心功能均可在断网环境下正常使用 ## License MIT License