一、引言
1.1 目的
本文档主要是根据目前电影数量繁多,依据用户期望获取更好、更适应自己的电影推荐系统的迫切需求,经过详细分析后整理出来的,描述开发电影推荐系统的需求相关的文档。本文档一方面的目的是指导项目成员了解最终的业务需求,另外一方面是作为后续开发设计的指导文档。
1.2 背景
在互联网技术不断成熟、移动终端快速普及的背景下,人民开始追求精神上的享受,精神需要在人民的需求中所占的比重越来越大,电影作为一种重要的精神娱乐方式,极大的受到人民的欢迎。当今,互联网上的各类视频网站比比皆是,这些站点都提供数量巨大的电影视频供用户观看,用户可以较为容易的获取电影资源。
虽然用户阅览电影的要求降低,但是用户总是需要花费大量的时间对电影进行挑选。从海量的电影中获取当下流行电影的信息,筛选搜索自己喜欢类型的电影,具有很大的实用价值。
1.3 术语
本文档中所涉及的一些专业术语如下:
MongoDB:一个基于分布式文件存储的数据库。旨在为 Web 应用提供可扩展的高性能数据存储解决方案。
nodejs:开源 Web 服务器,用于解释 JSP、Servlet 文件,提供 Web 服务。
1.4 期望读者
本产品需求分析报告所针对的预期读者包括:
用户:只需关注项目分析、系统功能描述、项目运行环境,根据项目硬件和软件要求配置自己的计算机以达到运行项目的。
开发人员:严格按照此文档进行实施,需要关注项目的系统功能详细分析,系统流程图,数据流图,以及数据库设计功能,了解项目中的各个子系统之间的关系,各功能之间的处理以及实现要求。
测试人员:此文档作为测试的依据,需要关注项目的具体功能实现,了解项目报告中的系统功能要求,根据测试结果判断是否达到了系统的基本要求。
项目经理:根据此文档安排项目进度以及人员安排。
文档编写员:需关注项目报告中的每一项任务,针对报告中的每个模块,仔细查看,力争将系统的功能,项目分析,项目参与人员以及整个项目的架构清晰的抽象出来以展示给不同的预读人员。
二、任务分析
2.1 开发背景
互联网在最近几十年出现了爆发性的增长,伴随着用户数量迅速增长的背后是用户数据量的指数级增长,面对着海量的信息,用户往往会感到束手无策,这就是互联网中所谓的信息过载问题。如何帮助用户从海量的信息中筛选获取用户最感兴趣的信息已经成为了一项热门的研究工作。
在 2018 年,就有 37 部电影票房过亿,更有 10 部票房超过 10 亿,面对如此众多的电影信息,用户总是希望从中进行一定的筛选,以便挑选中比较好的电影进行观看。
图 1-1 系统结构
电影分析系统设计采用三层结构,如图 1-1 所示。说明如下:
- Web 层,爬取猫眼电影数据,展示数据结果
- BBL 层,即业务逻辑层,主要负责业务逻辑的处理;
- Model 层,即实体类,主要负责存储复杂的数据,封装各个类;
2.2 项目目标
系统的总体目标是:利用先进的计算机网络及爬虫技术,对 2018 年的猫眼电影数据进行爬取,并且进行分析,将数据按照各种要求进行最优化的寻找并且通过可视化的处理,使得用户能够根据需要,获得这一条件下的电影的相关信息,并可以根据相关信息进行电影推荐的操作。
2.3 项目介绍
- 本软件是面向小型电影数据分析电影爱好者,及推荐电影所做成的。主要包括:数据爬取、数据维护、电影信息展示、电影推荐等模块。
- 数据爬取业务模块主要包括从猫眼电影数据进行爬取,并且将其存入数据库中。该业务获取的基础数据是整个系统的根基,关系到后续功能的实现。
- 数据维护主要是对其中的数据进行管理,能够保证数据能个得到及时且有效的管理。也就是进行相应的修改、添加、删除、查找等操作。
电影信息展示主要是按照用户的需求对所筛选出的电影信息进行对于的展示,方便用户进行阅读比如电影评分 TOP10、电影票房 TOP10、每月电影上映数量、每月电影票房、电影来源、最受欢迎电影 TOP10、中外电影票房对比以及上映电影类型等信息。
电影评分 TOP10 主要是分析从猫眼电影爬取 2018 这一年上映的所有的电影进行对比,从中评出用户评分最高的 10 部电影;每月电影票房,就是将电影按照上映的时间进行分类,一共分为 12 个月,并将每个月上映的电影票房进行累加,然后横向进行比较电影。上映电影类型信息是将每一部电影类型进行统计,统计出 2018 年电影类型最多的那一种类型,也进一步反映市场对某一类型电影票房的反响。
2.4 用户类型与特性
本系统的主要用户为以下几种:
管理员:管理各种电影的信息对系统进行设置和维护。并负责从网络中爬取即时的电影信息,以保证其中数据的时效性。
管理员作为该系统总体的管理人员,负责系统的正常运行和管理。
观影用户:能够在线对电影数据按照自己的需求进行筛选,并查看筛选后的电影信息,进行电影推荐。他们并不一定具备良好的计算机知识,且对系统的使用频率较高,因为要求前端功能使用设计简单易操作的同时,系统具备较高的并发性和稳定性。
表 2-1 用户类型和特性表
编号 | 用户类别 | 特征描述 |
---|---|---|
1 | 管理员 | 对系统进行设置管理,并且保证数据的时效性与正确性 |
2 | 观影用户 | 使用系统进行筛选出自己感兴趣的电影的信息同时可以进行行电影推荐的操作 |
2.5 运行环境
2.5.1 服务器环境
- 硬件环境:Intel Pentuim4 Xeon 2.5GHz CPU、160GB Raid 5 磁盘阵列、16GB DDR266 内存
- 操作系统:Microsoft Windows 2003 Server
- 支持环境:nodejs Web
- 数 据 库:MongoDB 2.4.8
2.5.2 用户环境
- 硬件环境:CPU 1.0G 以上
- 内存 256M 以上
- 硬盘 20G 以上
- 操作系统:Microsoft Windows 2000,XP,VISTA,win7,win8,win10
- 支持环境:建议使用 IE8.0 以上及 Chrome 浏览器
2.6 系统设计
数据流图
顶层数据流图
层数据流图
处理流程
逻辑结构设计
电影分类和电影的关系是一对多,一个电影类型有多个电影对应。
电影分类:分类 ID(主键)、类型(喜剧,动作 ……)
电影:电影 ID(主键)、分类 ID(外键)、票房……)
数据库设计
2.7 性能
精度
本软件基于图表进行展示,用户很容易就能看出各部电影的特点,几乎不用什么操作,我们对各个用户请求进行了封装,默认显示。所以用户打开系统就可以看到系统要展现给用户的结果。
时间特性
本软件使用的是面向对象的数据库,也是目前最流行的数据库 MongoDB 数据库,它是介于关系数据库和非关系数据库之间,查询功能非常强大。对用户的请求能够很快的进行响应,更新处理时间、数据传输、转换时间、计算时间都非常迅速。
灵活性
本软件各个模块的操作非常简单,灵便。在数据爬取、数据维护、数据展示各个模块中,相关的信息可以快速集中的输入以及进行查询,而各个模块间的转换和信息的增删改的操作,都可以通过系统管理员进行相关的操作。
三、外部接口需求
3.1 用户界面
根据用户操作需要,设计简洁美观的、友好的 Web 用户界面,为用户提供简单、直观的操作界面。
主要遵循以下原则:
- 界面元素符合用户习惯;
- 操作简易性;
- 界面一致化;
- 以用户体验至上为原则。
3.2 软件接口
服务器程序通过接口对 MongoDB 进行访问。
四、系统功能需求
4.1 系统功能结构
4.1.1 管理员子系统
图 4-1 管理员子系统图
对系统进行设置管理
对系统的各种配置情况进行调整,以适应当前情况。
对数据库中的数据进行管理
对数据库中的数据进行各种管理,包括对影片信息的更改,对影片信息的删除,对影片信息的查询。
对电影信息进行更新
通过爬虫,保持数据库中数据的及时更新。
4.1.2 观影用户子系统
图 4-2 观影用户子系统
查看当前热门电影信息
用户可以查看票房当前最高的十部电影,每月上映电影的数量,每月电影票房情况,按电影类型查看电影信息,并进行可以电影推荐的操作。
通过条件筛选出自己感兴趣电影的信息
用户可以设置筛选条件,从而筛选出满足条件的电影的信息。
4.2 分析模型
以数据流图对本系统进行分析。
4.3 数据说明
4.3.1 相关的数据流说明
电影信息=编号 + 电影名 + 类型 + 出版地区 + 电影时长 + 电影首映日期 + 电影评分 + 观影人数 + 电影大小
评论信息=编号 + 评论者 + 评论时间 + 点击量 + 得分 + 评论内容
4.3.2 数据流图
顶层数据流图
图 4-3 顶层数据流图
层数据流图
图 4-4 一层数据流图
五、非功能性需求
5.1 安全性要求
在本平台中,主要涉及到身份安全认证、数据传输安全、数据备份恢复机制以及容灾方案的设计等。
5.2 美观性要求
界面要求简介美观,避免过于繁乱复杂。
5.3 简洁性要求
根据用户操作的需要,设计简洁美观、友好的用户界面,为用户提供简单、直观的操作界面。
5.4 数据库设计需求
数据库中的表要满足 3NF 减少数据的冗余度。
5.5 性能需求
在最大并发量访问下,系统仍能提供服务,不出现致命性错误。
般操作的响应时间应在 1 秒内,响应时间也应在可接受的时间内完成,具体情况以网络速度为限制。
六、软件设计
数据爬取模块
爬取目标
首先确认要爬取的电影数据,该系统默认爬取网页数据是猫眼电影 2018 年上映的电影数据如(图 1 猫眼电影索引)
图 猫眼电影索引
我们的目标就是获取索引页里所有电影链接以及评分信息。
详情页
对详情页的信息进行获取,主要获取内容是电影名称、类型、国家、时长、上映时间、评分、评分人数,累计票房。
图 详情页信息
反爬虫破解
通过开发工具发现,猫眼针对评分,评分人数、累计票房的数据,施加了文字反爬。
图 文字反爬
通过分析文字反爬中的 js 事件,我们可以看出只要刷新页面,三处文字编码就会改变,无法直接匹配信息。所以需要下载文字文件,对其进行双匹配。然后将 woff 格式转换为 XML 格式,以便在 pycharm 中查看详细信息。
图 文字反爬破解
文字反爬破解后,接下来的工作就简单了;获取自己需要的数据,构造请求头、获取电影详情页链接、获取电影详情页的信息等等。
数据存储
我们要把获取的数据保存到数据库中。我们使用的是 MongoDB 数据库,它是转为可扩展性、高性能、高可用性而设计的数据库,它可以从单服务器部署扩展到大型、复杂的多数据中心架构。利用内存计算的优势,MongoDB 能够提供高性能的数据读写操作。
图 数据库创建
图 数据库的 ER 图
在创建用户集合、电影集合的时候,还需要添加一个两者关系的集合。
用户集合:
{
_id:”u1”,
name:”小明”
}
电影集合:
{
_id:”f1”,
name:”影”,
country:”中国”,
score:’9分’,
......
}
关系集合(用户u1评论了电影u2):
{
_id:1,
users_id:’u1’,
films_id:’f1’,
time:2018-11-14,
score:’8分’,
Comment:”这部电影看着很感人,很有代入感!”
}
用户集合(users)字段格式
字段 | 类型 | 说明 |
---|---|---|
_id | String | 用户主键 |
name | String | 用户姓名 |
电影集合(film)字段格式
字段 | 类型 | 说明 |
---|---|---|
_id | String | 电影主键 |
name | String | 电影名字 |
type | String | 电影类型 |
Length | String | 电影时长 |
Released | String | 电影发布 |
Score | String | 电影评分 |
People | Int32 | 电影评论人数 |
Box_office | Int32 | 电影票房 |
关系集合(connection)字段格式
字段 | 类型 | 说明 |
---|---|---|
_id | String | 关系主键 |
User_id | String | 用户主键 |
Film_id | String | 电影主键 |
Time | String | 电影评论时间 |
Score | String | 电影评分 |
Comment | String | 电影评论 |
服务器搭建
为了让用户能够用过浏览器查看数据,该系统搭建了一个服务器,将用户浏览器发来的查询请求进行处理,然后服务器从数据库中读取数据;将数据返回给前端。前端将服务器给的数据进行可视化处理。
服务器的搭建该系统采用了 Express 服务器框架,它是是一种保持最低程度规模的灵活 Node.js Web 应用程序框架,为 Web 和移动应用程序提供一组强大的功能。
图 服务器端查询模块
电影数据展示
首先浏览器向服务器发送查询数据请求,服务器进行响应,通过 JSON 将数据传输给 index.js 页面,然后 inde.js 调用各种模块去解析数据,最后显示到页面上。
图 前端解析数据
电影推荐
使用过程
启动服务器
打开一个终端输入 npm start 命令,然后服务器启动,打印提示信息,服务器启动成功,链接数据库成功。
图 启动服务器
启动 nginx 程序,将本地服务器地址反向代理,让用户可以输入 www.movie.com 就可以看到电影相关数据,而不是输入 Ip 地址 + 端口号。
打开浏览器输入地址 ,显示数据
图 电影评分 top10
图 服务器处理请求
图 每月电影票房
这里我们就可以发现,2 月份也就是春节档电影票房最多,其次就是 7、8 月份暑假期间。
图 电影类型分布
将 2018 年上映的所有电影类型进行统计,我们可以得出剧情、喜剧类型的电影最多。
电影推荐
用户输入电影名称,向服务器发送电影推荐请求,服务器调用脚本执行机器学习的 KNN 推荐算法,该算法根据用户输入电影的类型进行分类,然后向用户推荐评分最高的 5 部电影。
转载 · 知乎作者:源点工作室
原文地址:https://zhuanlan.zhihu.com/p/643522154