|
|
2 months ago | |
|---|---|---|
| .. | ||
| .idea | 2 months ago | |
| .vscode | 2 months ago | |
| lib | 2 months ago | |
| src/main/java/com/crawler | 2 months ago | |
| target/classes/com/crawler | 2 months ago | |
| README.md | 2 months ago | |
| douban_movies_1776768126907.csv | 2 months ago | |
| job-crawler.iml | 2 months ago | |
| movie_genre_distribution.png | 2 months ago | |
| movie_rating_distribution.png | 2 months ago | |
| movie_year_distribution.png | 2 months ago | |
| movie_year_rating.png | 2 months ago | |
| pom.xml | 2 months ago | |
README.md
电影爬虫项目 - 继承与多态实现说明
项目简介
本项目是一个Java电影爬虫,从豆瓣电影Top250抓取数据,进行清洗、存储、分析,并生成多种图表展示结果。项目重点展示了面向对象编程中继承和多态的实现。
项目中的类
核心类
-
MovieMain (
src/main/java/com/crawler/MovieMain.java)- 项目主入口类
- 负责协调爬虫、数据清洗、存储、展示和图表生成
-
DoubanSpider (
src/main/java/com/crawler/spider/DoubanSpider.java)- 爬虫实现类
- 负责从豆瓣电影Top250页面爬取数据
- 使用多线程并发爬取,提高效率
-
Movie (
src/main/java/com/crawler/chart/model/Movie.java)- 电影数据模型类
- 存储电影的各种属性:排名、标题、评分、评价人数、导演、演员、年份、国家/地区、类型、简介
-
MovieAnalyzer (
src/main/java/com/crawler/analysis/MovieAnalyzer.java)- 数据分析工具类
- 提供各种统计分析方法:评分分布、年份分布、类型分布、导演作品数量排行、平均评分、评分与年份相关性
-
MovieResultDisplay (
src/main/java/com/crawler/ui/MovieResultDisplay.java)- 结果显示和图表生成类
- 在控制台显示统计结果
- 生成各种图表:评分分布直方图、年份分布折线图、类型分布饼图、评分与年份相关性图表
-
DataUtils (
src/main/java/com/crawler/utils/DataUtils.java)- 数据工具类
- 提供数据清洗和保存功能
图表相关类
-
ChartGenerator (
src/main/java/com/crawler/chart/ChartGenerator.java)- 图表生成器接口
- 定义了生成图表的方法规范
-
ChartManager (
src/main/java/com/crawler/chart/ChartManager.java)- 图表管理器类
- 负责管理和协调多个图表生成器
-
实现类
RatingDistributionChartGenerator(src/main/java/com/crawler/chart/impl/RatingDistributionChartGenerator.java)YearDistributionChartGenerator(src/main/java/com/crawler/chart/impl/YearDistributionChartGenerator.java)GenreDistributionChartGenerator(src/main/java/com/crawler/chart/impl/GenreDistributionChartGenerator.java)YearRatingChartGenerator(src/main/java/com/crawler/chart/impl/YearRatingChartGenerator.java)
封装、多态、继承的实现
1. 封装
- 类封装:每个类都封装了自己的属性和方法,提供了清晰的接口
- 数据封装:
Movie类使用私有属性和公共的getter/setter方法 - 功能封装:不同功能模块被封装到不同的类中,如爬虫、分析、展示等
2. 继承
- 接口继承:所有图表生成器实现类都继承了
ChartGenerator接口 - 方法继承:实现类继承了接口中定义的
generateChart和getChartName方法
3. 多态
3.1 向上转型(接口引用指向实现类)
文件: src/main/java/com/crawler/MovieMain.java
ChartGenerator ratingChart = new RatingDistributionChartGenerator();
ChartGenerator yearChart = new YearDistributionChartGenerator();
ChartGenerator genreChart = new GenreDistributionChartGenerator();
ChartGenerator yearRatingChart = new YearRatingChartGenerator();
3.2 方法参数多态
文件: src/main/java/com/crawler/chart/ChartManager.java
public void addChartGenerator(ChartGenerator generator) {
chartGenerators.add(generator);
}
3.3 运行时多态(动态绑定)
文件: src/main/java/com/crawler/chart/ChartManager.java
public void generateAllCharts(List<Movie> movies) {
Movie[] movieArray = movies.toArray(new Movie[0]);
for (ChartGenerator generator : chartGenerators) {
System.out.println("生成图表: " + generator.getChartName());
generator.generateChart(movieArray); // 运行时根据实际类型调用对应方法
}
}
3.4 统一调用接口
文件: src/main/java/com/crawler/MovieMain.java
chartManager.addChartGenerator(ratingChart);
chartManager.addChartGenerator(yearChart);
chartManager.addChartGenerator(genreChart);
chartManager.addChartGenerator(yearRatingChart);
chartManager.generateAllCharts(cleanedMovies);
继承与多态的优势
- 代码复用:所有图表生成器共享相同的接口方法
- 可扩展性:新增图表类型只需实现接口,无需修改现有代码
- 统一管理:
ChartManager可以统一管理不同类型的图表生成器 - 灵活性:通过接口引用可以操作不同的实现类对象
- 可维护性:代码结构清晰,职责分明
项目结构
src/
└── main/
└── java/
└── com/
└── crawler/
├── MovieMain.java # 主入口文件
├── analysis/
│ └── MovieAnalyzer.java # 数据分析工具
├── chart/
│ ├── ChartGenerator.java # 图表生成器接口
│ ├── ChartManager.java # 图表管理器
│ ├── model/
│ │ └── Movie.java # 电影数据模型
│ └── impl/
│ ├── RatingDistributionChartGenerator.java # 评分分布图表
│ ├── YearDistributionChartGenerator.java # 年份分布图表
│ ├── GenreDistributionChartGenerator.java # 类型分布图表
│ └── YearRatingChartGenerator.java # 年份评分相关性图表
├── spider/
│ └── DoubanSpider.java # 豆瓣爬虫实现
├── ui/
│ └── MovieResultDisplay.java # 结果显示和图表生成
└── utils/
└── DataUtils.java # 数据工具类
运行说明
-
直接运行:在IDE中直接运行
MovieMain.java,或使用命令行:java -cp "src/main/java;lib/*" com.crawler.MovieMain -
依赖要求:需要以下库
- jsoup-1.17.2.jar
- jfreechart-1.5.4.jar
- jcommon-1.0.24.jar
-
运行结果:
- 控制台输出爬取进度和统计结果
- 生成的CSV数据文件保存在项目根目录
- 生成的图表以PNG格式保存在项目根目录
技术栈
- Java 8+
- Jsoup (网页解析)
- JFreeChart (图表生成)
总结
本项目通过图表生成器接口及其实现类,充分展示了面向对象编程中继承和多态的核心概念。接口定义了统一的方法规范,实现类提供了具体的实现逻辑,通过接口引用和运行时动态绑定,实现了代码的灵活性和可扩展性。同时,项目也展示了良好的封装设计,将不同功能模块封装到不同的类中,提高了代码的可维护性。