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.
XuJingwang cdb9fb7877 期末实验报告-徐景旺-202414010701 3 weeks ago
..
.idea 期末实验报告-徐景旺-202414010701 3 weeks ago
.vscode 期末实验报告-徐景旺-202414010701 3 weeks ago
lib 期末实验报告-徐景旺-202414010701 3 weeks ago
src/main/java/com/crawler 期末实验报告-徐景旺-202414010701 3 weeks ago
target/classes/com/crawler 期末实验报告-徐景旺-202414010701 3 weeks ago
202414010701徐景旺期末实验报告.docx 期末实验报告-徐景旺-202414010701 3 weeks ago
README.md 期末实验报告-徐景旺-202414010701 3 weeks ago
changsha_weather_1780232041742.csv 期末实验报告-徐景旺-202414010701 3 weeks ago
douban_movies_1780232040643.csv 期末实验报告-徐景旺-202414010701 3 weeks ago
job-crawler.iml 期末实验报告-徐景旺-202414010701 3 weeks ago
movie_genre_distribution.png 实验1-徐景旺-202414010701 3 months ago
movie_rating_distribution.png 实验1-徐景旺-202414010701 3 months ago
movie_year_distribution.png 实验1-徐景旺-202414010701 3 months ago
movie_year_rating.png 实验1-徐景旺-202414010701 3 months ago
pom.xml 期末实验报告-徐景旺-202414010701 3 weeks ago
soft_ranking_1780232041527.csv 期末实验报告-徐景旺-202414010701 3 weeks ago

README.md

电影爬虫项目 - 继承与多态实现说明

项目简介

本项目是一个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接口
  • 方法继承:实现类继承了接口中定义的generateChartgetChartName方法

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);

继承与多态的优势

  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 (图表生成)

总结

本项目通过图表生成器接口及其实现类,充分展示了面向对象编程中继承多态的核心概念。接口定义了统一的方法规范,实现类提供了具体的实现逻辑,通过接口引用和运行时动态绑定,实现了代码的灵活性和可扩展性。同时,项目也展示了良好的封装设计,将不同功能模块封装到不同的类中,提高了代码的可维护性。