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