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

大宗商品爬虫系统

项目概述

本项目为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_nameindexName
  • index_valueindexValue
  • change_ratechangeRate
  • stock_namestockName
  • stock_pricestockPrice
  • turnover_rateturnoverRate

自定义日期类型处理器

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