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.
 
 

4.3 KiB

项目开发思路与步骤文档 (DEVELOPMENT.md)

本文档详细记录了“电影评分网站影片数据抓取与分析项目”的完整开发思路、每一个步骤以及遇到的关键技术点。


一、 开发思路 (Development Philosophy)

1. 目标设定

开发一个基于 Java 的自动化工具,能够从豆瓣电影 Top 250 这种评分网站上自动化获取结构化的电影信息,并对其进行多维度的统计分析,最终将抽象的数据转化为直观的报告和可视化图表。

2. 技术选型

  • 核心语言: Java 11 (利用其成熟的生态和强类型支持)。
  • 构建管理: Maven (自动管理依赖和构建生命周期)。
  • 网页爬虫: Jsoup (轻量级、强大的 HTML 解析库,支持 CSS 选择器)。
  • 数据分析: Java 8+ Stream API (声明式的数据处理方式,高效且易于阅读)。
  • 数据序列化: Jackson (工业级的 JSON 处理库)。
  • 可视化: JFreeChart (老牌稳定的 Java 图表库)。
  • 代码简化: Lombok (通过注解减少冗余的 Getter/Setter)。

3. 系统架构 (已升级为 Spring Boot 架构)

采用典型的 MVC 模式进行解耦,并引入 Web 层:

  • Model: Movie.java (JPA 实体), DirectorStats.java (统计 DTO)
  • Repository: MovieRepository.java (数据持久化层,支持 H2 数据库)
  • Service: MovieService.java (业务逻辑与 Caffeine 缓存层)
  • Controller: DirectorController.java (Web 接口与路由)
  • View: Thymeleaf 模板 (响应式前端页面)
  • Crawler: MovieCrawler.java (数据采集组件)

二、 详细开发步骤 (Step-by-Step Guide)

第 1 步:项目初始化与架构升级

  • pom.xml 中引入 spring-boot-starter-web, spring-boot-starter-data-jpa, spring-boot-starter-thymeleaf 等。
  • 配置 H2 内存数据库和 Caffeine 缓存,确保接口响应时间在 500ms 以内。

第 2 步:定义数据实体与统计模型

  • Movie.java 重构为 JPA 实体,增加 id, type (作品类型), posterUrl (海报链接) 等字段。
  • 创建 DirectorStats.java 用于承载导演作品数量、平均评分、总票房等聚合统计数据。

第 3 步:实现数据访问与业务逻辑

  • Repository 层: 使用 Spring Data JPA 的 @Query 编写复杂的聚合查询,支持按导演姓名搜索、作品类型过滤及分页统计。
  • Service 层:
    • 集成 Spring Cache (@Cacheable),对耗时的排行榜查询进行 10 分钟缓存。
    • 实现 refreshData 方法,支持在爬虫抓取后自动更新数据库并清空缓存。

第 4 步:增强爬虫功能

  • 更新 MovieCrawler.java,利用 Jsoup 提取电影海报 URL 和作品类型。
  • 实现 DataInitializer (CommandLineRunner),在应用启动时自动触发爬取任务并将数据持久化到 H2 数据库。

第 5 步:开发响应式 Web 前端

  • 使用 Bootstrap 5 结合 Thymeleaf 开发导演排行榜页面 (director_rankings.html)。
  • 功能点:
    • 分页显示: 默认每页 20 位导演。
    • 搜索与过滤: 支持导演名模糊搜索和作品类型下拉过滤。
    • 交互设计: 点击导演姓名可跳转至该导演的作品详情页 (director_movies.html)。
    • 加载状态: 添加 Spinner 加载动画和响应时间监测。

第 6 步:性能优化与验证

  • 配置 Caffeine 缓存规格,平衡内存占用与响应速度。
  • 在 Controller 层记录请求耗时,确保在大数据量下依然满足 <500ms 的性能要求。

三、 遇到的挑战与解决方案

  1. JPA 聚合查询复杂性: 导演排行榜涉及 COUNT, AVG, SUM 等多个聚合函数。通过 new com.movieratings.model.DirectorStats(...) 构造器投影解决了 JPA 返回原始 Object 数组难以处理的问题。
  2. 响应式图片展示: 海报图片大小不一。通过 CSS object-fit: cover 确保在排行榜缩略图和详情页大图显示中均保持比例协调。
  3. 缓存一致性: 爬虫更新数据后,排行榜可能显示旧数据。通过 @CacheEvict 在保存数据时自动失效相关缓存。

四、 后续改进方向

  • 实现多线程爬虫以提高抓取速度。
  • 引入数据库(如 MySQL 或 SQLite)进行更长期的存储。
  • 开发一个简单的 GUI 界面(如 JavaFX)实时展示抓取过程。