摘 要 I
Abstract II
引 言 1
1 系统相关技术 3
1.1 网络爬虫 3
1.1.1 网络爬虫介绍 3
1.1.2 HttpClient 3
1.1.3 Jsoup 3
1.1.4 Proxy Pool技术 3
1.2 SpringBoot框架 3
1.2.1 SpringBoot框架介绍 3
1.2.2 @Scheduled定时器 4
1.3 Java线程池、缓冲队列和同步锁 4
1.3.1 Java线程池 4
1.3.2 队列 4
1.3.3 同步锁 4
1.4 本章小结 4
2 需求分析 5
2.1 微信小程序端需求 5
2.2 后台管理系统端需求 5
2.3 非功能性需求 6
2.4 本章小结 6
3 系统设计 7
3.1 架构设计 7
3.2 功能设计 7
3.2.1 微信小程序功能设计 7
3.2.2 后台管理系统功能设计 9
3.3 数据库设计 9
3.4 本章小结 10
4 系统实现 11
4.1 开发环境 11
4.2 网络爬虫获取数据 11
4.2.1 数据获取 11
4.2.2 数据处理 12
4.3 系统数据库实现 13
4.3.1 实体联系图实现 13
4.3.2 数据库实现 15
4.4 系统功能实现 18
4.4.1 微信小程序客户端 18
4.4.2 后台管理系统管理员端 23
4.5 本章小结 24
5 系统测试 25
5.1 功能测试 25
5.2 压力测试 26
5.3 本章小结 27
结 论 28
致 谢 29
参考文献 30
如今社会信息化发展迅速,获取感兴趣的信息对于人们来说是一件难事。其中,对于美食相关的内容用户查询到的资源更是杂乱不堪,内容让人们眼花缭乱。
本系统主要由后台系统管理员端和微信小程序客户端两部分组成。后台系统管理员端主要实现对小程序端用户提交的推荐内容、产品信息、管理端用户信息等进行管理维护,小程序端实现用户模块、推荐模块、搜索模块三大模块功能的开发。
本系统开发采用经典的B/S结构,小程序端选取微信开发者工具作为开发平台。后台采用Java开发语言,后台框架采用SpringBoot框架,并在项目中对JDBC、MyBatis进行整合。小程序客户端使用WXML,WXSS,JavaScript语言开发,后台系统管理端采用HTML,CSS,JavaScript实现页面开发,使用AJAX与后台服务进行异步交互。微信小程序用户端的数据获取使用SpringBoot框架和HttpClient搭建的网络爬虫程序,同时使用SpringBoot定时器实时更新数据,最后将数据存储到MySQL数据库。
在基于爬虫的美食推荐小程序下,使用网络爬虫技术获得大量的数据,支持小程序功能的开发,能够便捷地为用户提供新鲜、实用并且真实的美食信息。
关键词:微信小程序;网络爬虫;美食推荐;SpringBoot
Abstract
Nowadays, with the rapid development of social informatization, it is difficult for people to get the information they are interested in. Among them, for the content related to food, the resources found by users are even more chaotic, and the content makes people confused.
The system is mainly composed of two parts: the background system administrator end and the WeChat small program client end. The background system administrator side mainly realizes the management and maintenance of the recommendation content, product information and user information submitted by users of the small program side, and the development of the user module, recommendation module and search module of the small program side.
This system development uses the classic B/S structure, the small program side selects the WeChat developer tool as the development platform. Java development language is used in the background, and SpringBoot framework is used in the background framework, and JDBC and MyBatis are integrated in the project. Small program client uses WXML, WXSS, JavaScript language development, background system management end uses HTML, CSS, JavaScript to achieve page development, using AJAX and background services for asynchronous interaction. The web crawler built by SpringBoot framework and HttpClient is used for data acquisition of WeChat small program client. Meanwhile, the data is updated in real time by SpringBoot timer. Finally, the data is stored in MySQL database.
Under the food recommendation small program based on crawler, the web crawler technology is used to obtain a large amount of data and support the development of functions of the small program, which can provide users with fresh, practical and real food information conveniently.
Keywords: WeChat applet; Web crawler; Food recommendations; SpringBoot
随着移动互联网的快速发展,它成为了社会信息化的重要手段,是人们获取信息的重要来源[1]。社会逐从信息稀缺的时代进入了信息过载的“大数据”时代[2]。在时代背景下,人们获取自己需要的信息变成一件很困难的事情,从如此多的信息中获取有价值的信息成为首要解决的迫切问题[3]。其次,人们生活水平不断提高,对于饮食方面的要求也提高了一个层次,人们会在互联网上浏览寻找相关的美食信息。
目前,对于美食领域相关的软件来说,都是对某一部分比如推荐菜谱这一类模块去实现,用户想要获取其他信息,比如观看美食视频,美食产品推荐等,就只能再去别的平台去查看。还有很多相关的视频软件,里面内容包含很多的模块,不止是美食相关,所以对于用户来说,没有一个相对于全面的系统来解决当前问题。
基于以上需求,本系统为用户提供了一个基于爬虫的美食推荐小程序,系统可以帮助用户解决在信息繁杂的环境下根据标签分类为用户精准推荐用户所感兴趣的美食信息。标签目前已成为现在组织网络内容的流行方式[4]。在本系统中用户可以查看相关的美食视频和资讯,进行点赞收藏等操作,可以对系统内美食信息通过查询的方式获取想要的信息,用户也可以分享自己喜欢的美食,系统会根据用户提交的信息,对当前热门的美食产品进行统计进而展示给用户。
本系统在以用户需求为前提下,实际开发的意义有如下四点:一是可以为用户打造一个个性化的美食推荐平台,用户可以在系统中拥有良好的使用体验,二是对美食行业的发展可以起到促进的作用,三是系统面向的用户范围广泛,微信自诞生于2016 年 1 月 11 日[5]起,作为社交平台总用户量达到7亿[6],绝大多数的人们都会使用它。四是拥有良好的开发环境,通俗的说小程序是一种包含功能的网页[7],是一种新时代的新型应用形式[8]相比于普通网页,微信小程序拥有着更加健全的功能。微信小程序的主要开发语言是JavaScript,在国外JavaScript基本上是应用于网页开发,Google、YouTube、Facebook等的都是利用JavaScript语言进行的前端开发[9]。JavaScript开发由于网页开发渲染线程和脚本线程是互斥的[10],时间过久页面会失去响应。而在小程序中,两者分别运行在不同的进程中。
论文共包含5个章节,各章的安排如下:第1章介绍基于爬虫的美食推荐小程序实现过程所用到的相关技术。第2章从功能需求和非功能需求方面介绍基于爬虫的美食推荐小程序的需求分析;第3章阐述基于爬虫的美食推荐小程序的系统设计,包括数据库设计、功能设计等;第4章详细说明基于爬虫的美食推荐小程序的实现过程。第5章系统测试,对系统进行功能测试和压力测试。
1
1.1.1网络爬虫介绍
网络爬虫是一种依照规定自动地抓取互联网数据的程序或脚本[11]。网络爬虫从网站页面开始读取,在URL集合中选取URL开始访问其对应的网页然后进行循环[12][13],直至爬取的网页信息获取完成。在本项目中使用SpringBoot+HttpClient搭建的网络爬虫程序,进行相关美食数据的获取,支撑系统的开发,同时使用SpringBoot中的@Scheduled定时器实时更新数据。
1.1.2HttpClient
HttpClient是Apache中的一个开源的项目。它模拟浏览器向某个网址发送各种请求并获取应答,并且它支持HTTP协议最新的版本[14]。HttpClient提供了许多功能组件,应用十分广泛[15],本项目使用HttpClient进行数据的爬取。
1.1.3Jsoup
Jsoup是一款基于Java的HTML解析器。使用网络爬虫技术爬取到的数据可能是文本内容、URL地址或字符串等,这时可以使用Jsoup解析获取想要得到数据格式。它解析相关内容时对DOM、CSS进行操作读取数据[16],十分便捷。
1.1.4Proxy Pool技术
在爬取数据的过程中,经常会遇到各种反爬方式。在本项目中爬取网站用户信息时就遇到了反IP爬取的问题,只能降低速度或者使用IP代理才能防止爬虫程序因为同IP访问频率过高被目标网站封锁。建立一个Proxy Pool代理池,首先需要获取一系列的IP地址作为一个总ip库,可以使用爬虫从一些代理网站上爬取。其次,需要验证总库中的ip地址是否可用,可以通过遍历所有ip,筛选出与目标网站直接速度符合预期的并存入库中。之后就可以随机取出不同ip,使用Proxy类实例化代理对象即可进行高效安全的爬取。
1.2 SpringBoot框架
1.2.1SpringBoot框架介绍
SpringBoot是由Pivotal团队开发的全新的开源开发框架[17]。它是一款易于使用且实用的基础框架[18]。SpringBoot 开源框架特点拥有以下特点:基于SpringMVC模式[19],开发层次清晰,三层结构易于更新迭代。自身已经集成了Tomcat这样的WebServlet,不需要复杂的配置就可以快速开发Web应用。利用Maven等插件,通过配置POM文件的依赖项能够快速的为工程添加多种JAR包、插件,并且能够轻松维护依赖版本。SpringBoot项目能够很好地部署于Docker类的虛拟容器中[20]。
1.2.2@Scheduled定时器
通过在SpringBoot启动器上添加注解@EnableScheduling(开启Scheduled定时器),就可以添加定时任务的功能。该定时器可配置启动时间、运行次数等定时任务必备的参数,能够很方便的执行定时一次或多次代码段,可满足本系统中利用网络爬虫技术,定时向目标网站发出http请求,获得相关数据。
1.3 Java线程池、缓冲队列和同步锁
1.3.1Java线程池
线程池主要实现对线程的管理,使用它可以减少线程的创建和销毁[21],能够控制线程的数量、存活时间,能够处理并发任务,提高系统的性能。
1.3.2队列
本系统应用到的队列技术是缓冲队列LinkedBlockingQueue,这是一种自定义长度的双缓冲队列,当线程池中没有空余线程时,任务将自动添加至缓冲队列,取出操作也可以同时由另一线程完成操作。这样的队列能够保证系统的高并发情况时的线程安全,又避免了存取操作效率过低。
1.3.3同步锁
该系统中使用了synchronized同步锁[22],可以保证线程安全,特别是在某些事务处理过程中必须保证正确性的状态时可以通过给资源加锁,这种资源包括一个方法、一个代码段或者一个对象等。能够保证一个线程独自处理锁中的事务,又能随时通过解锁资源释放线程,保证了顺序性。
1.4 本章小结
本章主要讲述了论文所使用的核心技术,对网络爬虫技术、反爬虫技术、SpringBoot框架、@Scheduled定时器、java线程池、缓冲队列、同步锁进行了详细的说明。
本系统的目标是为用户推荐感兴趣的内容,因此功能需求是站在用户的角度出发,提供一个使用感受舒适,更加私人化的系统。后台管理系统主要是对部分数据进行整理和维护,原则上也是为客户而服务。
2.1 微信小程序端需求
用户首次登入小程序后可以根据标签自主选择美食信息分类查看感兴趣的视频或资讯,如果老用户想要切换喜好,可以在个人中心里切换喜好分类;视频模块可以查看个性化推荐的视频列表、可以查看热度比较高的视频列表,还可以查看当前视频排行榜,按照不同的分类进行排行例如浏览量等等,其中个性化推荐通过记录用户的行为来展示列表数据;用户也可以通过关键字查询视频和资讯,关键字可模糊匹配相应的标题和标签;视频详情页用户可以查看视频,以及对视频进行点赞、评论、收藏和评论的操作,不同的用户行为都会产生一系列的关联关系的变化从而改变相应的推荐信息;图2.1为小程序用户用例图。
图2.1 小程序用户用例图
2.2 后台管理系统端需求
对用户提交的信息进行统计;对产品品牌进行添加、删除、修改等操作;对产品分类进行添加、删除、修改等操作;对产品进行添加、删除、修改等操作,由图2.2管理员用例图可知,管理员端所有操作都基于登录以后才可进行。
图2.2 管理员用例图
2.3 非功能性需求
本系统主要包含以下五个方面的非功能性需求:
性能需求。支持并发量达到100以上,最大TPS值达到两千,用户同时访问量达到500以上。
可维护性。保证模块化开发,各个模块之前相互独立,代码编写整洁、注释齐全,便于后期的修改和扩展。
可用性。系统如果出现问题,影响用户的使用,要求系统的维护时间需在48小时之内完成。
易用性。要求系统操作简单,没有过于复杂的内容,用户可以轻松理解本系统的功能设计。
安全性。确保系统的安全性,如果出现有异常信息登录该系统,则拒绝用户进入系统并跳转到登录页面。
2.4 本章小结
本章从从功能性需求和非功能需求两方面介绍了需求分析,功能性需求包含微信小程序端和后台管理系统端需求,通过使用例图来辅助描述两个端的功能需求。
3.1 架构设计
本系统采用B/S结构,包含微信小程序客户端、web管理后台端、后台服务、数据获取以及数据存储五个部分,客户端和管理员端均是通过使用AJAX技术向服务器发送请求,同时服务器会向数据库访问相对应的数据以及相应的接口,对数据进行处理,将处理后的数据返回给客户端和管理员端使用,再将获取到的数据渲染在页面上供用户查看,图3.1所示详细说明了系统的架构设计。
图3.1 系统体系架构图
3.2 功能设计
本系统功能设计包含微信小程序客户端和后台管理系统管理员端。
3.2.1微信小程序功能设计
微信小程序客户端为用户精心设计了用户模块、推荐模块和搜索模块三个主要模块。
根据用户对小程序的需求和对当前现有的美食平台所有的功能进行分析,做出如下功能设计,图3.2展示了小程序客户端的功能图。
图3.2 客户端功能图
用户登录模块。用户可以进行小程序登录并选择自己喜欢的美食分类。
用户行为模块。用户可以查看视频和咨询详情,对当前视频进行点赞、点踩、收藏、取消点赞、点踩、收藏和评论的操作,对咨询可以进行收藏和取消收藏的操作。用户可以自行选择美食分类查看相关视频或咨询。
个人中心模块。用户可以查看何时浏览的视频和资讯即历史记录页面、收藏页面、重新选择喜好分类以及对系统当前存在的问题提出意见。
喜好调查模块。用户可以向其他用户推荐自己喜爱的美食,通过选择产品品牌、产品分类进而选择产品后再针对用户个人的口味进行推荐。
视频推荐模块。视频推荐包含热门推荐、个性化推荐、排行榜推荐。热门推荐根据视频的热度生成视频推荐列表,将热度高的视频随机展示在列表中。个性化推荐根据用户自己选择的美食分类进行推荐,以及对用户的操作如点赞、收藏等操作进行记录,将数据展示在列表中。排行榜推荐根据视频的浏览量、评论数和点赞数进行排序展示。
资讯推荐模块。资讯推荐包含热门推荐、个性化推荐、排行榜推荐。热门推荐根据资讯的热度生成视频推荐列表,将热度高的资讯随机展示在列表中。个性化推荐根据用户自己选择的美食分类进行推荐,以及对用户的操作如收藏等操作进行记录,将数据展示在列表中。排行榜推荐根据资讯的浏览量和收藏数进行排序展示。
美食推荐模块。用户可以查看用户所推荐最热门的产品,看到其他用户对其当前热门美食的推荐情况。
模糊搜索模块。此模块功能为视频或资讯搜索,用户可以按照自己的需求对视频或资讯的标题进行搜索,获取与输入内容相关的视频或资讯列表。
3.2.2后台管理系统功能设计
后台管理系统是对用户所提交的数据以及对美食产品品牌、分类、口味等进行维护,主要是对产品的信息进行录入。满足用户喜好调查的功能设计如下。图3.3展示了后台系统管理员端的功能图。
图3.3 管理员端功能图
管理员模块。登录时已经注册过的管理员进行登录操作,未注册的管理员可以进行注册操作。管理员还可以进行修改密码和退出系统操作。
产品品牌管理模块。对产品的品牌进行增删改查维护,实现对产品品牌的信息录入,字段包括名称、图片和介绍。
产品分类管理模块。对产品的分类进行增删改查维护,实现对产品分类的信息录入,字段包括分类名称。
产品口味管理模块。对产品的口味,包括甜度和温度进行增删改查,实现对产品口味的信息录入,字段包括甜度和温度。
产品管理模块。对产品进行增删改查维护,实现对产品的信息录入,字段包括品牌、分类、名称、价格和图片。
用户数据管理模块。对用户在小程序客户端提交的数据进行展示,字段包括用户名、推荐产品品牌、推荐产品分类和推荐产品名称。
3.3 数据库设计
数据库是系统中极其重要的一部分,它支撑了整个项目的开发。由于MySQL 数据库易于搭建、轻量化易于迁移、处理数据速度快,并且可以免费使用。所以本系统采用了MySQL 数据库作为储存美食相关信息的数据库,以下是主要的数据库表设计:
小程序用户表:用于存储小程序客户端用户的头像,昵称等信息。
用户操作表:存储用户的点赞、点踩等信息。
视频表:存储爬取下来的视频的作者,发布时间,视频地址等信息。
资讯表:存储爬取下来的资讯的作者,发布时间,文章内容等信息。
标签表:存储标签名称,热度等信息。
作者表:存储从网站上爬取下来的作者的名称、头像、简介等信息。
评论表:存储用户评论的内容,评论时间等信息。
管理员表:存储管理员的账号,密码等信息。
产品品牌表:存储产品的品牌名称,品牌图片等信息。
产品分类表:存储产品的分类名称等信息。
产品甜度表:存储产品的甜度等信息。
产品温度表:存储产品的温度等信息。
产品表:存储产品所属品牌,所属分类,产品名称等信息。
喜好调查表:存储用户提交的产品等信息。
修改密码日志记录表:存储用户修改的记录。
意见表:存储小程序用户对系统所提的意见。
关联表:表与表之间的关联表。
3.4 本章小结
本章讲述了系统的详细设计,从系统的架构设计,小程序客户端和管理员端的功能设计以及系统的数据库设计三个方面进行详细描述,其中功能设计使用功能图更加清楚的展示功能结构,数据库设计对系统实现有着重要的作用。
本系统分为微信小程序客户端和后台管理系统管理员端,以下是客户端和管理员端的实现过程。
4.1 开发环境
硬件环境:处理器 Inter Corei5-8400QM,内存 16GB;
系统环境:Windows10(x64);
开发工具:
微信小程序客户端:微信开发者工具v1.03;
后台管理系统管理员端:IntelliJ IDEA2019.1;
后台服务:IntelliJ IDEA2019.1;
数据库:Navicat。
开发语言:
微信小程序客户端:WXML+JS+WXSS;
后台管理系统管理员端:HTML+JS+CSS;
后台服务:Java;
数据库:MySQL。
4.2 网络爬虫获取数据
本系统通过使用网络爬虫技术对网站上的数据进行获取,再将爬取到的数据进行解析,最后将数据存储在数据库中用于小程序端的使用。因为该数据支撑着小程序的功能实现,丰富了客户端页面功能,网络爬虫技术获取数据在本系统中起着至关重要的作用。
下面详细说明了网络爬取数据的方式以及如何对爬取到的数据进行处理。
4.2.1数据获取
本系统通过SpringBoot+HttpClient搭建的网络爬虫程序,并使用SpringBoot框架里的@Scheduled定时器,定时进行相关数据的获取。本系统爬取的是“哔哩哔哩”网站的相关视频和资讯信息,以及视频和资讯的作者信息。
在后端爬取过程中需要进行如下步骤:第一步,为爬虫任务设置定时任务,定时爬取数据,其中@Scheduled定时器里initialDelay参数设定在项目启动后1s内执行爬虫任务,fixedDelay参数设定每20分钟执行一次爬虫任务,过程如图4.1所示;第二步,实例化一个用于请求的HttpPost或者HttpGet的HttpClient对象;第三步,确认请求Http或Https地址,并且组装请求对象。第四步,为请求设置需要的header或者相应的cookie值。第五步,通过execute方法实现请求的发送,并且获取相应的返回对象。最后,通过阿里云的fastJson包使用其中的方法解析json对象获取数据。实现过程下所图4.2所示。
图4.2 HttpClient使用方法相关源码
4.2.2数据处理
通过HttpClient获取数据后,可以获取HTML格式和Json格式的两种格式的数据。获取到Json格式数据,再将数据进行处理,将需要的数据直接存储在数据库中使用,使用Jsoup解析对爬取的HTML格式进行解析进而转换成项目需要的HTML格式。
Json格式数据处理。第一步,将Json字符串转为Json对象,如图4.3所示;第二步,获取Json对象里需要的数据信息,如图4.3所示;最后,将数据信息进行过滤处理,存储在数据库中,如图4.4所示。
图4.4 处理爬虫数据
HTML格式数据处理。使用Jsoup对其进行解析处理。Jsoup使用方法如下:第一步,从URL、文件或字符串中获取并且解析出HTML网页;第二步,遍历DOM或使用CSS选择器寻找到所需要的数据并将其提取;第三步,对HTML元素、属性和文本进行解析;第四步,设置URL正则化过滤规则来解决用户提交的内容信息,以此防止跨站脚本的攻击;最后,输出格式规范且易读的HTML。实现如图4.5所示。
图4.5 Jsoup解析html格式
4.3 系统数据库实现
4.3.1实体联系图实现
系统共涉及的实体有小程序用户、后台管理端用户、资讯信息、视频信息、用户操作记录、视频评论记录、标签、产品、产品品牌、产品分类、产品口味、文件等16个实体类,其中管理员端实体联系图如图4.6所示。
图4.6 管理员端实体联系图
客户端实体联系图如图4.7所示。
图4.7 客户端实体联系图
4.3.2数据库实现
数据表实现包含以下表结构:小程序用户表(tab_user)、标签表(tab_tag)、视频表(tab_video)、资讯表(tab_article)、作者表(tab_owner)、用户操作表(tab_objxuser)、评论表(tab_reply)、标签表和视频表的关联表(tab_tagxvideo)、标签表和资讯表的关联表(tab_tagxarticle)、标签表和用户表的关联表(tab_tagxuser)、管理员表(tab_manager)、产品品牌表(product_brand)、产品分类表(product_type)、产品甜味表(product_taste)、产品温度表(product_temperature)、产品表(product)、文件表(tab_upfile)、问卷调查结果表(product_survey)、修改密码日志表(password_record)、意见表(suggestion)。
以下展示了项目中关键表的数据库设计。
小程序用户表(tab_ user),该表存储了微信小程序具体的用户信息,比如微信昵称、微信头像等信息,表结构设计如表4.1所示。
表4.1 小程序用户表
字段名 数据类型 长度 是否为空 主键 备注
Id int 11 否 是 序号
status int 11 否 否 状态码
createTime datetime 0 否 否 创建时间
updateTime datetime 0 是 否 更新时间
openid varchar 255 是 否 微信小程序的用户标识
city varchar 255 是 否 用户所在国家
nickName varchar 255 是 否 用户微信昵称
province varchar 255 是 否 用户所在城市
avatarUrl varchar 2000 是 否 用户微信头像
标签表(tab_tag),该表存储了视频和资讯所包含的标签分类,包括标签的姓名、标签的热度等信息,表结构设计如表4.2所示。
表4.2 标签表
字段名 数据类型 长度 是否为空 主键 备注
Id int 11 否 是 标签Id
tagname varchar 255 是 否 标签名称
hot datetime 0 是 否 对应用户的标签热度
视频表(tab_video),该表存储了使用网络爬虫技术爬取到的视频标题、视频所属标签、视频创建时间等信息,其中ownerId字段与作者表(tab_owner)关联。表结构设计如表4.3所示。
表4.3 视频表
字段名 数据类型 长度 是否为空 主键 备注
Id int 11 否 是 序号
status int 11 否 否 状态码
createTime datetime 0 否 否 创建时间
updateTime datetime 0 是 否 更新时间
title varchar 255 是 否 视频标题
avid int 11 是 否 视频页面id
owner varchar 2000 是 否 视频作者
ownerId int 11 是 否 视频作者id
pic varchar 1000 是 否 视频封面
remark varchar 1000 是 否 视频所属标签
hot int 11 是 否 视频热度
cid int 11 是 否 视频Id
good int 11 是 否 点赞数
bad int 11 是 否 点踩数
collection int 11 是 否 收藏数
reply int 11 是 否 评论量
资讯表(tab_article),该表存储了使用网络爬虫技术爬取的资讯标题、资讯所属标签、资讯创建时间等信息,其中ownerId字段与作者表(tab_owner)关联。表结构设计如表4.4所示。
表4.4 资讯表
字段名 数据类型 长度 是否为空 主键 备注
Id int 11 否 是 序号
status int 11 否 否 状态码
createTime datetime 0 否 否 创建时间
updateTime datetime 0 是 否 更新时间
title varchar 255 是 否 视频标题
owner varchar 2000 是 否 视频作者
ownerId int 11 是 否 视频作者id
pic varchar 1000 是 否 视频封面
remark varchar 1000 是 否 视频所属标签
hot int 11 是 否 视频热度
cid int 11 是 否 视频Id
good int 11 是 否 点赞数
bad int 11 是 否 点踩数
collection int 11 是 否 收藏数
作者表(tab_owner),该表存储了使用网络爬虫技术爬取的视频和资讯的作者姓名、头像等信息,表结构设计如表4.5所示。
表4.5 作者表
字段名 数据类型 长度 是否为空 主键 备注
Id int 11 否 是 序号
owner varchar 2000 是 否 视频作者
ownerId int 11 是 否 视频作者id
face varchar 1000 是 否 头像
sign varchar 1000 是 否 简介
sex varchar 255 是 否 性别
birthday varchar 255 是 否 生日
管理员表(tab_manager),该表存储了后台管理员的用户账号、密码等信息,其中密码为MD5加密生成,登录验证时进行解码验证。表结构设计如表4.6所示。
表4.6 管理员表
字段名 数据类型 长度 是否为空 主键 备注
Id int 11 否 是 序号
status int 11 否 否 状态码
createTime datetime 0 否 否 创建时间
updateTime datetime 0 是 否 更新时间
account varchar 255 是 否 账号
password varchar 255 是 否 密码
name varchar 255 是 否 用户名
remark varchar 2000 是 否 描述
4.4 系统功能实现
4.4.1微信小程序客户端
用户进入小程序后可以看到视频、资讯、美食推荐、分类、排行、个人中心六个模块,如图4.8所示。
所有模块都使用微信小程序中的API[23]:wx.request方法通过AJAX实现与后端的数据交互。
用户首先首次登录,在小程序端使用小程序中的API:wx.login调用接口获取登录凭证(code)。通过凭证进而换取用户登录信息,包括用户的唯一标识(openid)、本次登录的会话密钥(session_key)以及是否为新用户的标识(isNew),并在小程序中配置全局变量globalData包括userInfo(用户信息)、server(项目的服务器地址),openid(用户的唯一标识),session_key(会话密钥)以及isNew(新老用户标识),供整个项目接口传参使用,图4.8为获取小程序用户信息等的实现过程。其中登录调用的接口名为server+“/Face/login”,小程序客户端与后端交互的接口名均为服务器加后台定义接口名的形式。
图4.8 登录接口
用户登录以后如果isNew等于new则跳转到选择标签页面如图4.10,如果等于old则直接跳转到首页,如图4.9。
图4.9 首页 图4.10 选择兴趣标签
视频。视频推荐列表和热门列表页面如图4.11所示。新用户首次登录,推荐列表里所展示的是用户所选择的标签类型。用户可以查看视频的评论数,点赞数,浏览量,发布时间等信息,用户可以对列表数据进行搜索,寻找视频。推荐列表的计算方法为:用户点赞,收藏,评论当前视频,判断当前视频的所属标签分类是否已经在用户的推荐列表中,若不存在则将当前视频的所属标签分类添加到用户推荐列表中。热门推荐列表里展示热度hot字段排行前300的视频信息。用户可以查看视频的评论数,收藏数,浏览量,发布时间等信息,用户可以对列表数据进行搜索,寻找视频。其中,热度的计算方法为:用户点赞对当前视频以及标签的热度hot字段值+5,点踩hot字段值-3,收藏hot字段值+5,评论hot字段值+5,如果当前视频的标签分类存在于用户的推荐标签当中,该视频的标签hot字段值在原来的基础上再+1。
视频详情页面如图4.12所示。用户点击列表里的某一视频,进入视频详情页面,用户可以进行点赞、点踩、收藏、评论、取消点赞、取消点踩、取消收藏的操作。
图4.11 推荐列表界面 图4.12 视频详情界面
资讯。资讯热门和推荐列表页面如图4.13所示。新用户首次登录,列表里所展示的数据是用户所选择的标签分类。用户可以查看资讯的收藏数,浏览量,发布时间等信息,用户可以对列表数据进行搜索,寻找资讯。推荐列表的计算方法为:收藏当前咨询资讯将当前咨询的所属标签分类添加到用户推荐列表中。热门推荐列表里展示热度hot字段排行前300的资讯信息。用户可以查看资讯的收藏数,浏览量,发布时间等信息,用户可以对列表数据进行搜索,寻找资讯。热度的计算方法为:用户点击资讯热度hot字段值+1,收藏hot字段值+5,如果当前资讯的标签分类存在于用户的推荐标签当中,则该资讯的标签hot字段值在原来的基础上再+1。
资讯详情页面如图4.14所示。用户点击列表里的某一资讯,进入视频详情页面,用户可以进行收藏、取消收藏的操作。
图4.13 推荐列表界面 图4.14 资讯详情界面
其中,资讯详情通过对服务端接受的HTML格式的数据进行展示,在这里使用wxParse富文本插件来解析HTML格式,先将插件引入小程序中如图4.15,再使用wxParse插件解析资讯的相关代码,如图4.16所示。
图4.15 引入wxParse插件
图4.16 使用wxParse解析HTML
为了防止某一视频或资讯同时点击的用户数量较多这一问题,出现小程序无法访问的情况,在用户进行点击视频或资讯的操作时将任务添加到线程池中的方法来解决。因为本项目中关于视频、标签、用户相关的热度更新的业务的实时性要求不是很高,用这样的阻塞队列能够很好的缓解后端压力,提高系统的整个性能,让该小程序的用户们获得更好的使用体验。
美食推荐。用户可以查看其他用户对其当前热门美食的推荐情况。
喜好调查。用户可以在页面通过选择产品品牌和产品分类,选择产品并可以对产品的口味进行选择,最后选择出用户喜欢的美食推荐给其他用户,页面如图4.17所示。
分类选择。用户可以自行选择标签分类进行查看视频和资讯,可以对列表数据进行搜索,查找相关信息。分类页面如图4.18所示。
排行榜。用户可以查看当前视频和资讯的浏览量、评论数以及点赞数排行榜。排行榜页面如图4.19所示。
图4.17 喜好调查界面 图4.18 分类界面 图4.19 排行榜界面
个人中心。收藏列表和历史记录页面,用户可以查看自己何时浏览过的或者收藏过的视频和资讯。切换喜好页面,用户可以切换当前所推荐的标签分类,重新推荐所选标签的分类。个人中心界面如图4.20所示,收藏列表和历史记录页面如图4.21所示,切换喜好页面如图4.10所示。
图4.20 个人中心界面 图4.21 历史记录界面
4.4.2后台管理系统管理员端
后台管理系统对产品品牌、分类、口味、产品、用户调查的数据进行维护,界面如图4.22所示。
图4.22 管理系统界面
系统登录认证模块。如果管理员没有注册账号,点击注册填写账号、密码、用户名信息进行注册,已经注册过的用户填写账号和密码进行登录,还可进行修改密码和退出系统的操作。
为了防止用户没有经过登录直接进入系统,为后台管理系统添加SpringBoot框架里的HandlerInterceptor拦截器来保证系统的安全性。
在HandlerInterceptor拦截器的预处理回调方法中添加对login页面的处理,查询当前浏览器session中是否存在管理员的用户信息,检查管理员是否登录过。用户登录以后跳转到系统首页,否则跳转回系统的登录页面,实现代码如图4.23所示。
图4.23 系统统一拦截页面
此外,拦截器需要在WebConfigurer文件里配置,在addInterceptors添加拦截器,让拦截器发挥作用。
由于微信小程序客户端使用的后台服务也是在该项目上搭建,为了不让后台接口方法被拦截器统一拦截,所以要将对外的接口释放拦截,包括登录、注册和静态页面。实现代码如图4.24所示。
图4.24 配置拦截器
产品品牌管理模块。管理员对产品的品牌数据进行增删改查的维护,录入产品的品牌信息。其中上传图片时,将图片上传至阿里云OSS便于数据存储,将上传以后的url记录在数据库展示使用,实现代码如图4.25所示。
图4.25 图片上传至阿里云OSS
产品分类管理模块。管理员对产品的分类数据进行增删改查的维护,录入产品的分类信息。
产品口味管理模块。管理员对产品的口味数据进行增删改查的维护,录入产品的口味信息。
产品管理模块。管理员对产品数据进行增删改查的维护,录入产品信息。
用户数据管理模块。对用户提交的喜好调查表进行统计,对当前推荐的美食进行展示。
4.5 本章小结
本章主要讲述了系统所使用的开发工具和开发语言,对系统功能设计进行详细描述,并对核心功能写出实现思路和方法,对实现过程中采用的技术进行说明,对实现功能界面以截图形式展示。
5.1 功能测试
对系统整体功能进行分析后,从小程序客户端选取搜索功能,用户对视频的操作功能以及提交调查表功能设计测试用例[24]并进行相关的功能测试。
搜索功能测试用例如表5.1所示。
表5.1 搜索功能测试用例
用例编号 用例名称 测试功能 输入 操作过程 预期输出 测试结果
5.1-1 搜索视频标题测试 搜索视频标题是否得到相应的视频列表 早餐 点击视频搜索输入框,输入“早餐”,点击搜索。 显示“早餐”相关的视频列表
成功
5.1-2 搜索视频标签测试 搜索视频标签是否得到相应的视频列表 料理制作 点击视频搜索输入框,输入“料理制作”,点击搜索。 显示“料理制作”相关的视频列表。
成功
用户对视频操作功能测试用例如表5.2所示。
表5.2 视频操作功能测试用例
用例编号 用例名称 测试功能 输入 操作过程 预期输出 测试结果
5.2-1 视频点赞测试 用户点击点赞是否成功 / 点击点赞图标 点赞成功 成功
5.2-2 视频点踩测试 用户点击点踩是否成功 / 点击点踩图标 点踩成功 成功
5.2-3 视频播放测试 视频播放是否成功 / 查看视频 视频可以播放内容 成功
5.2-4 视频收藏测试 用户点击收藏是否成功 / 点击收藏图标 进入收藏页面可以查看收藏列表
成功
5.2-5 视频评论测试 用户评论内容是否成功 内容很棒 点击评论按钮,输入“内容很棒” 评论列表里出现“内容很棒的评论信息”
提交调查表功能测试用例如表5.3所示。
表5.3 视频操作功能测试用例
用例编号 用例名称 测试功能 输入 操作过程 预期输出 测试结果
5.3-1 选择产品品牌测试 品牌是否可选择 / 选择下拉框里的数据 选择产品品牌并展示
成功
5.3-2 选择产品分类测试 分类是否可选择 / 选择下拉框里的数据 选择产品分类并展示
成功
5.3-3 选择产品甜度测试 甜度是否可选择 / 选择下拉框里的数据 选择产品甜度并展示
成功
5.3-4 选择产品温度测试 温度是否可选择 / 选择下拉框里的数据 选择产品温度并展示
成功
5.3-5 选择产品测试 产品是否可选择 / 选择展示出的产品 产品被选中并展示选中效果
成功
5.3-6 输入产品看法测试 看法是否可输入 很好喝 在输入框里输入“很好喝” 内容“很好喝”显示在输入框里
成功
5.2 压力测试
本系统基于微信小程序开发存在着多名用户同时使用的情况,为了保证系统的性能,确保用户使用系统时稳定、可靠,所以对系统进行压力测试[25]。
图5.1为选取客户端的登录功能、查看视频详情、查看资讯详情、获取视频列表、获取资讯列表五个功能的压力测试结果。
图5.1 测试报告统计
本次压力测试共请求了37,303次,其中异常数为25,由此可见系统的稳定性良好。
图5.2 各功能压力测试报告概览
由图5.2可看出,在高并发情况下,系统平均相应时间均在2s左右,请求成功率均在99%附近,由此可见系统的响应时间迅速。
5.3 本章小结
本章主要对系统中部分模块进行了功能测试和压力测试,功能测试中对搜索功能,用户对视频的操作功能以及提交调查表功能进行了详细测试,并编写测试用例展示测试过程和结果。对客户端的登录功能、查看视频详情、查看资讯详情、获取视频列表、获取资讯列表五个功能进行压力测试,测试结果可看出系统性能良好,响应时间迅速。
在如今信息繁琐的时代,如何解决数据量巨大、重复的问题成为首要问题。本系统通过分析用户的需求和当今社会上现有的美食平台的背景以及现状,实现基于爬虫的的美食推荐小程序。本系统选用微信小程序开发是因为小程序基于微信更加便捷的特点,相对于手机APP来说让用户可以方便的寻找、浏览美食信息,对用户来说既节省时间又减少了手机空间的使用。网络爬虫技术爬取当下最新的数据存储在数据库中,使得整个系统的功能丰富起来,可以满足用户更多的需求。
由于时代的迅速发展,对于美食的需求用户可能会随之变化,考虑到此问题,系统有着可维护性和易用性,保证满足未来用户的需求。根据微信的发展程度来看,无论是速度还是规模,发展非常快速,小程序基于微信,也有着良好的发展前景,随着小程序的发展,系统也会不断调整,适应时代发展。
由于缺少相关的经验,系统存在着一定的问题,后续还需完善,例如界面的设计还存在着一定的问题,需要对交互界面进行改善,用户喜好调查模块需要再进行详细的设计,细节考虑的不够周到,目前只可以推荐一些美食产品,后续可以增加对餐厅等的推荐。
时光瞬息变化,四年时间过的飞速,转眼间就到了毕业的时间,到了即将和校园时光说再见的时候了。
从初次踏进校园直到现在即将离开,心中五味陈杂,在学校的时光里给我了留下了许许多多宝贵的回忆,这四年中经历了很多事情,明白了很多道理,学了到很多知识。但是我觉得毕业不是终点,毕业以后的我们将会步入人生的另一个阶段,将会是人生的另一个起点。
在这里我要感谢我的导师们,王飞老师和陈佳美老师,两位老师在对我的毕业项目选题,项目指导方面给予了我莫大的帮助。与此同时,还有很多帮助过我的人,在此我都表达由衷的感谢。
我也要感谢这四年来朝夕相处的老师和同学们,谢谢这四年大家来对我的帮助与照顾,感谢我可爱的舍友们,为我的大学时光带来了很多欢乐,这四年我过得充实又快乐,在此谢谢各位对我的帮助以及和鼓励。
最后,再次感谢一直陪伴着我成长的老师和同学们,谢谢你们!
[1]Rungsawang,N. Angkawattanawit. Learnable topic-specific web crawler[J]. Journal ofNetwork and Computer Applications,28(2005):97-114
[2]康健.电影推荐系统微信小程序的设计与实现[D].西北民族大学,2019
[3]刘慧,李凤银,继国,崔璨,葛睿.基于影评挖掘的电影推荐系统设计与实现[J].电子技术,2018,47(12):83-86
[4]周桂清.视频标签互动系统的研究与实现[D].华南理工大学,2012
[5]于俊丽.高校图书馆应用微信小程序的实践与展望[J].出版广角,2018(12):73-75
[6]李安妮.基于微信小程序的口腔诊所服务平台设计与实现[J].软件工程,2019,22(04):40-43
[7]匡文波,李芮,任卓如.微信小程序面面观[J].新闻论坛,2017(02):15-18
[8]张雪云,牟艳,张九博.基于微信小程序的电源监测管理系统设计[J].计算机与现代化,2017(12):98-102+107
[9]彭守镇.微信小程序应用探究[J].信息与电脑(理论版),2018(22):22-23
[10]郝磊.网络商城微信小程序的设计与实现[D].西北民族大学,2019
[11]郑豪,何彦雨.基于Java平台的分布式网络爬虫系统研究[J].科技创新与应用,2017(01):112
[12]Sotiris Batsakis,Euripides G.M. Petrakis,Evangelos Milios. Improving the performance offocused web crawlers[J]. Data & Knowledge Engineering,68(2009):1001-1013
[13]Junghoo Cho,Hector Carcia-Molina. Parallel Crawlers[C]. International World Wide WebConference,2002:124-135
[14]廖嘉灿,侯超钧.基于SSM和HttpClient的在线选课辅助系统的设计与实现[J].计算机与现代化,2016(10):116-120+126
[15]王晓琳.基于HttpClient的代购同步技术研究与实现[J].微型电脑应用,2014,30(07):46-48
[16]Gu Wen,Cao Yang. Implementation of Web page adaptive conversion system based on jsoup [J]. Electronic technology and software engineering, 2017 (18):200-202
[17]Felipe Gutierrez.SpringBoot,Simplifying Everything[M]. Apress:2014:06-15
[18]姜璠.融合网络爬虫技术的移动APP开发及应用[D].大连交通大学,2018
[19]师明,曾丹.基于Vue.js和Spring Boot的校招日记系统[J].工业控制计算机,2020,33(01):95-97
[20]张峰.应用SpringBoot改变web应用开发模式[J].科技创新与应用,2017(23):193-194
[21]彭华.线程池调度对服务器性能影响的研究[J].通信技术,2019,52(09):2172-2176
[22]崔政,段利国.基于Java synchronized同步锁实现线程交互[J].软件工程,2018,21(02):1-3
[23]林泽斐.基于微信公众平台 API 的移动 OPAC 设计与实现[J].农业图书情报学刊,2015,27(02):44-46
[24]苏春莉,曹新淼.如何设计好的测试用例[J].价值工程,2020,39(03):219-220
[25]宋海洋,许晓飞,朱昭俊.基于WebService接口的软件测试技术探讨[J].科学技术创新,2019(14):64-66