基于PHP的景点数据分析系统设计与实现

目 录

摘 要 I
Abstract II
引 言 1
1 关键理论与技术 3
1.1 框架技术 3
1.1.1 QueryList 3
1.1.2 ThinkPHP 3
1.1.3 Amaze UI 3
1.2 数据可视化技术 4
1.3 数据库技术 4
1.4 本章小结 4
2 需求分析 5
2.1 业务流程分析 5
2.2 功能需求分析 5
2.3 用例分析 7
2.4 非功能性需求 9
2.5 本章小结 10
3 系统设计 11
3.1 系统总体结构 11
3.2 系统功能模块设计 11
3.2.1 首页 11
3.2.2 数据统计模块 12
3.2.3 攻略库模块设计 12
3.2.4 个人中心模块 13
3.2.5 采集管理模块 14
3.2.6 系统管理模块 14
3.2.7 日志管理模块 15
3.3 系统数据库设计 15
3.4 本章小结 16
4 系统实现 17
4.1 系统实现概述 17
4.1.1 开发环境 17
4.1.2 用户环境 17
4.2 数据库实现 17
4.3 系统各部分功能模块实现 19
4.3.1 首页 19
4.3.2 数据统计模块 20
4.3.3 攻略库模块 22
4.3.4 个人中心模块 24
4.3.5 采集管理模块 25
4.3.6 日志管理模块 27
4.4 本章小结 28
5 系统测试 29
5.1 功能测试 29
5.2 压力测试 29
5.3 本章小结 30
结 论 31
致 谢 32
参考文献 33

摘 要

世界旅游组织对旅游业进行了预测,称在未来20年里该行业将持续呈上升趋势。同时,越来越多的旅游用户也面临着出行选择和旅游规划的问题。面对林林总总的景点选择,用户考虑的因素也随之增加,比如时间、景点热度、价格、景点位置、交通等,选择一个合适且满意的景点将会耗费用户大量的时间和精力。基于PHP的景点数据分析系统的开发,可以从海量的旅游景点中为用户提供个性化的景点数据展示服务,从而提高旅游质量。
本文主要以景点数据分析为展开点,利用PHP采集框架QueryList爬取“去哪儿?”官方网站的热门景点地理位置、门票价格、热度、销量以及热门游记等重要数据信息,分析爬取到的景点数据的价值,通过Highcharts等技术开发具有可视化界面的景点数据分析系统,制作包括但不限于旅游日历、景点销量排行、景点分类等数据图表,使游客能够通过可视化界面与该系统进行交互,方便用户进行个性化的决策,并使用轻量级PHP开发框架ThinkPHP构建景点数据分析系统,通过分析本系统中的用户角色,确定用户的等级分类,确保该系统能实现不同等级的用户的基础需求,比如登录、注册、用户信息修改、用户收藏景点、景点搜索、设置等多项功能。
该系统是一个为有旅游需求的用户提供的景点数据分析系统。在经过测试后,完成了对数据采集、数据分析、数据展示和信息管理的实现,达到了预期效果。

关键词:数据采集; 数据可视化; 信息管理; 景点数据

Abstract

The world tourism organization has forecast that the industry will continue to grow over the next 20 years.At the same time, more and more travel users are also facing the problem of travel choice and travel planning.In the face of a variety of scenic spots, users will consider more factors, such as time, heat, price, location, transportation, etc. Choosing a suitable and satisfactory scenic spot will consume users a lot of time and energy.The development of the scenic spot data analysis system based on PHP can provide users with personalized scenic spot data display service from a large number of scenic spots, thus improving the quality of tourism.
In this paper, scenic spot data analysis is mainly used as the expansion point, and the PHP collection framework QueryList is used to climb the "where to go?"The official website of the hot spots of the geographical position, the ticket price, the sales volume of heat, as well as popular travel notes, and other important data information, analysis of crawl to the value of scenic spots data, through the Highcharts technology development, such as the scenic spot data analysis system with visual interface, make including but not limited to, travel calendar, attractions ranked sales data chart, attractions classification, visitors can interact with the system through a visual interface, convenient user personalized decisions, and using lightweight PHP framework ThinkPHP build attractions data analysis system, by analyzing the user roles in this system,Determine the user level classification, to ensure that the system can achieve the basic needs of users of different levels, such as login, registration, user information modification, user favorite attractions, scenic spot search, Settings and other functions.
The system is a scenic spot data analysis system for users with tourism needs.After the test, the realization of data collection, data analysis, data display and information management was completed, and the expected results were achieved.

Keywords:data collection;data visualization;information management;scenic spot data

引 言

目前,通过对国内的主流旅游网站仔细观察和调研结果发现来看,国内旅游网站大都定位于为用户提供住宿、门票等产品的预定服务,以及旅游景点相关信息的介绍方面[1],并没有综合性景点数据分析服务。在这种环境中,用户在选择景点时将会耗费大量时间和精力,从而降低了信息获取的效率和影响了旅游体验,这样一来,游客不能在较短时间内快速选择出满意的出行景点,并且游客在旅游过程中个性化的信息需求也很难得到满足[2]。
针对这一现状,促进旅游信息化发展的景点数据分析系统应运而生。景点数据分析系统通过数据可视化技术,开发具有可视化界面的景点数据分析系统[3],使游客用户能够通过可视化界面与系统进行交互,进行个性化旅游景点数据分析结果展示,方便了用户快速定位自己感兴趣的信息。将该系统打造为一个集数据采集、数据分析、数据展示和信息管理于一体的系统,以游客为核心,展示景点数据分析结果,并在系统内及时发布景点、游记等信息,让游客主动感知并能及时了解这些有关旅游的信息,从而达到更加便于自助游的效果。
景点数据分析系统避免了传统旅游网站的以下普遍特性:几乎都只是旅游信息与互联网的简单结合,只方便游客浏览各种景点信息,并没有将景点等数据加以综合性的分析进而显示数据分析结果。游客在浏览景点时还需要自行将各大景点进行对比工作,这样降低了游客的使用体验,而且游客自行的比较结果有可能出现较大偏差,导致在后续的旅游行程中不如人意。景点数据分析系统不仅可以提供给用户浏览各种景点信息的功能,而且很直观明了的将各种景点数据对比结果展示在用户眼前,用户可直接通过数据分析结果来做出个性化决策,省时省力,而且由于数据量大,数据分析结果比用户自行对比结果更为精确可靠,从而提高用户的使用体验和旅游体验。
针对国内景点和有旅游需求的用户,景点数据分析系统重点解决了以下问题:1、分析旅游网站的数据价值,选取景点、旅游城市等方面的数据信息,通过数据采集技术来抓取这些数据信息,使得系统里数据量丰富且蕴含实际意义,解决了常规景点数据分析中数据来源单一、数据量小的问题。2、通过可视化技术,以图表形式将数据分析结果展示出来,开发具有可视化界面的景点数据分析系统,使得用户能直观明了的观察和对比各项景点数据,最终选择出一个合适的旅游景点,解决了常规文字形式旅游数据难以被游客了解且信息不全面的问题。3、构建用户信息管理系统,以满足各类型用户的基础需求,比如修改个人信息、收藏景点等。
本文的工作就是为了满足有旅游计划的用户而量身定制的,具体分析了各类用户的需求,描述了景点数据分析系统的功能结构,按照系统开发流程对该系统进行设计进而实现该系统的所有功能,并对系统进行测试工作。本文的章节安排如下:
第一章 关键理论与技术。依次介绍本系统所使用的核心技术,通过对理论知识的学习和积累,为后续系统的设计和开发做铺垫。
第二章 需求分析。介绍参与本系统中的主要用户角色分类,逐一分析各类不同角色用户的需求,并总结需求。
第三章 系统设计。根据需求分析对系统结构等进行设计,包括数据库和功能模块的设计。
第四章 系统实现。展示和说明系统实现的效果,采用功能描述和项目抓图的方式,列举系统内部分功能的具体实现。并包含开发环境、数据库等实现。
第五章 系统测试。按次序测试系统内各个模块的功能是否达到预期效果,展示系统部分功能的测试结果,对测试结果进行说明。

1 关键理论与技术

1.1 框架技术
1.1.1 QueryList
该系统最主要的技术之一就是采集技术,即根据给定的旅游网站的网址与制定的规则,按照约定格式提取所需的景点数据[4]。PHP还提供了snoopy、simple_html_dom、socket等数据采集方法,但由于QueryList不是利用复杂的正则表达式来采集,而是根据CSS选择器来进行数据的采集,完全模块化的设计,使得采集代码雅观且易维护,并且提供了丰富的多线程、图片下载等功能插件。QueryList无需依靠框架和架构,在项目根目录使用composer命令即可安装,使用前只需导入自动加载文件和QueryList类,可单独使用也可引入任意PHP开发框架中,使得语法简洁且可扩展性强。针对表格采集和递归多级列表采集,分别采用伪选择器和在getData方法里多次调用QueryList即可实现,简单易懂。
1.1.2 ThinkPHP
ThinkPHP是快速且简单的基于MVC和面向对象的轻量级PHP开发框架[5],为了简化企业级应用开发和敏捷Web应用开发而诞生[6]。ThinkPHP具有详细日志信息、严格的错误检测与安全机制,便于开发过程中处理和解决各种疑难杂症。ThinkPHP不仅可以帮助开发人员快速开发,而且可以提高应用稳定性。ThinkPHP支持composer和PHPunit等,这源于ThinkPHP的扩展机制,便于queryList等其他框架的下载使用,使得扩展更为灵活方便。可对数据库可进行链式操作,比起SQL语句,链式操作更为简捷高效。这都为WEB应用开发提供了强有力的支持。目前,ThinkPHP框架大体分为ThinkPHP3版和ThinkPHP5版两类[7],这两种版本里,ThinkPHP5.1对接口更加亲切,页面也更加新颖,因此我选择使用ThinkPHP5.1来开发本设计。
1.1.3 Amaze UI
Amaze UI 含多个CSS组件、JS组件和不同主题的 Web 组件。它拥有的UA识别技术即浏览器标识可以自动识别客户端的操作系统及版本、浏览器及版本等,从而判断用户是Web端还是移动端,使得网页自适应客户端。它含有的懒加载技术使用延迟加载在可提高网页下载速度,从而减轻服务器负载。拥有丰富的图标库和表单提示等组件,可自行进行排版设计,使得界面更加美观且保证系统界面的一致性。
1.2 数据可视化技术
本项目所采用了Highcharts和ECharts两种数据可视化技术[8]。
Highcharts是基于Jquery框架开发的图表库,包含了Highcharts JS、Highstock JS和Highmaps JS 三款软件[9]。操作灵活简单,只需引入相关图表的JS文件并设置配置项,即可使用 Highcharts在页面快速绘制具有交互性的图表。含有条形图、折线图等众多类型的图表,图表类型丰富且多元化,每个图表还可进行全屏显示,并且许多不同类型的图表可以集成在同一个图形中形成混合图[10]。图表组件样式全面且精美,可以根据需求灵活设置图表背景颜色、文字样式等,使得图表内容丰富且美观。提供了将图表转化为各类型图片和Excel并下载的功能,由此可比较不同数据量阶段的趋势变化等。
ECharts是百度推出的可视化开源开发框架[11]。底层依赖轻量级的矢量图形库ZRender[12],主要的图表绘制方式为Canvas绘图,提供直观的数据可视化图表库[13]。它拥有拖拽重计算、数据视图等特性,这些创新的特性增强了用户体验并赋予了用户对数据进行挖掘、整合的能力[14]。只需简单引入相关图表的JS文件并设置配置项,就可以灵活的控制数据展示形式和视觉效果,操作简单灵活。可添加图表标注和说明等组件,使得数据形式美观、可读性强。
1.3 数据库技术
MySQL是一个开放源码的轻量级关系型数据库[15]。MySQL由于其免费、维护简单、使用成本低等特点被越来越多地应用到web类服务器中[16]。MySQL数据库是以“C/S”模式实现的,由于该数据库的运行效率很高且开源的特性,正好弥补了中小数据库市场的空白。MySQL中含有的5种索引能加快查询速度、提升查询效率。使用workbench数据库工具,无需依靠命令行操作,操作起来更加方便。
1.4 本章小结
本章主要描述了实现该系统采用的核心技术,包括QueryList、ThinkPHP、Highcharts、ECharts、MySQL等,从应用的前台框架到后端应用,包括数据库技术、采集技术、数据可视化等都有详细描述。

2 需求分析

2.1 业务流程分析
景点数据分析系统系统首先需要进行采集工作,即对“去哪儿?”官方网站的旅游景点数据进行抓取。通过对采集的景点数据进行分析之后存储到数据库中,并把存储到数据库的数据根据需求进行不同处理,将分析处理后的数据分别展示到前端页面适宜的图表中,同时实现系统内部的各项信息管理功能。由此就能构成一个集数据采集、数据分析、数据展示和信息管理于一体的系统,本系统的业务流程如图2.1 所示。
在这里插入图片描述

图2.1 “景点数据分析系统”业务流程图
流程中信息管理部分分为普通用户和系统管理员两种不同登录身份,该系统必须登录之后才能使用。普通用户可以对个人信息进行管理并查看景点数据分析结果;系统管理员不仅拥有普通用户的权限而且可以对数据采集、日志及整个系统的管理。通过这四部分的关联,就可以完整的展现出系统的基本结构。
2.2 功能需求分析
本系统是一个针对有出行旅游需求的用户而设计的系统,通过对这个群体进行调研和实际观察,深入地剖析了有关该群体的特点,最后确定将该系统的用户分为普通用户和管理员两种角色。针对这两种角色,在各项权限方面,系统管理员高于普通用户,普通用户拥有的权限系统管理员同样拥有,比如浏览数据分析结果等。而系统管理员能访问的页面、拥有的权限等普通用户不一定可以访问或拥有,因为整个系统是交由系统管理员来统一管理的,这样一来,系统角色分工明确,层次将更加清晰,利于系统的维护和管理。
系统为普通用户提供的功能。系统的新用户需要注册一个新账号才能称为本系统的成员;用户成为本系统的新成员后,可通过注册时填写用户名和密码进行登录;用户必须在登录之后才能访问本系统;当用户想要退出该系统时,选择“退出”功能即可实现;修改个人信息是指用户可修改注册时填写的个人信息或个人资料;浏览首页是指用户在登录后可以访问首页数据。除此之外,还提供给用户个人中心、数据统计和攻略库三个模块的功能。
个人中心模块。用户可以根据出行习惯或爱好填写关于旅游出行的问卷调查,并且在该页面下方,会以图表形式统计出问卷调查的分析结果;修改问卷调查是指用户可以修改之前填写的问卷调查的内容;用户可根据自己最近的出行计划填写行程计划,并选择是否公开该行程计划;用户可根据自身需要对自己的行程计划进行删改和查询;用户可浏览系统发布的公告消息,还可根据消息标题或时间对公告消息进行查询;用户可浏览自己收藏的所有景点,并且可对收藏的景点按照指定排序方式进行排序和根据景点名或景点地址查询。
数据统计模块。浏览数据统计是指用户可以查看景点数据分析结果,包括旅游日历、景点分析、游记分析等页面;还可在某些图表里对景点或城市进行搜索,查看该景点或城市的某些数据分析结果。
攻略库模块。查看攻略库是指用户可以访问攻略库模块下的界面,包括景点数据、游记数据和行程计划,其中行程计划是指用户公开的行程计划;查询景点信息是指用户可以查询想要搜索的景点信息;景点信息排序是指用户可以根据指定的排序方式对景点数据进行排序;收藏景点是指用户可以收藏自己感兴趣的景点,当然也可取消收藏已经失去兴趣的景点;查询景点信息是指用户在游记数据页面,查询用户想要搜索的游记信息;游记信息排序是指用户可以根据指定的排序方式对游记数据进行排序;查询行程计划是指用户可在攻略库模块下的行程计划页面,根据景点或出发时间查询公开的行程计划。
系统为系统管理员提供了采集管理、系统管理和日志管理,除此之外管理员还可以查看系统访问人数和系统当日的登录人数。
采集管理是指管理员可以制定采集规则来对本系统所需要的数据进行采集,并且每采集一次就记录一次,将采集规则、时间、类型等信息都记录下来。管理员可以根据采集时间对采集记录进行查询。
系统管理包括用户信息管理和公告消息管理。用户信息管理是指用户可以查看系统所有用户的个人信息,可初始化某个用户的登录密码,也可将普通用户的权限升级成系统管理员。公告消息管理是指管理员可以发布公告消息,也可对公告消息进行删除或查询。
日志管理是指管理员可以浏览并查询邮件发送日志记录、文件上传日志记录、密码修改日志记录、采集日志记录。
2.3 用例分析
该系统设计了普通用户和系统管理员两类角色,均可启动用户功能用例包含的常规系统基本功能。此外,普通用户可访问首页、个人中心、数据统计模块,而系统管理员除了普通用户的可访问的模块外,还可以访问采集管理、日志管理和系统管理,如图2.2所示。
在这里插入图片描述

图2.2 “景点数据分析系统”总体用例图
其中,普通用户除了可进行注册、登录、注销和修改密码等基础功能之外,还可进行浏览景点数据分析结果、浏览和查询公告消息、发布和删改行程计划、填写和修改问卷调查、收藏和取消收藏景点等功能,如图2.3所示,由图可知,除了注册功能,其余普通用户功能都必须是在登录状态下才可实现。
在这里插入图片描述

图2.3 “景点数据分析系统”普通用户用例图
管理员除了拥有用户用户的所有功能之外,还可自行制定采集规则对景点数据进行采集、浏览日志信息、初始化用户密码、设置系统管理员等功能,如图2.4所示,由图可知,管理员特有功能也都必须是在登录状态下才可实现。
在这里插入图片描述

图2.4 “景点数据分析系统”系统管理员用例图
由以上的用例图可知,在系统的7个模块中,个人中心可以扩展出行程计划、收藏、问卷调查、公告消息等;系统管理可以扩展出设置管理员、初始化用户密码、发布公告消息、删除公告消息等;采集管理包含了采集数据,扩展了查询采集日志记录;攻略库扩展了对景点信息和游记数据的排序与查询等。每个用例包含或扩展了许多不同功能,具体如表2.1所示。
表2.1 “景点数据分析系统”用例表
用例名称 用例关系 用例名称 角色
发布行程计划 扩展 个人中心 用户、管理员
删改查行程计划 扩展 个人中心 用户、管理员
浏览行程计划 包含 个人中心 用户、管理员
修改问卷调查 扩展 个人中心 用户、管理员
填写问卷调查 扩展 个人中心 用户、管理员
浏览问卷调查 包含 个人中心 用户、管理员
浏览问卷调查结果分析 包含 个人中心 用户、管理员
查询公告消息 扩展 个人中心 用户、管理员
浏览公告消息 包含 个人中心 用户、管理员
排序、查询收藏景点 扩展 个人中心 用户、管理员
浏览查询收藏景点 包含 个人中心 用户、管理员
取消收藏景点 扩展 个人中心 用户、管理员
采集数据 包含 采集管理 管理员
查询采集日志记录 扩展 采集管理 管理员
设置管理员 扩展 系统管理 管理员
初始化用户密码 扩展 系统管理 管理员
查看用户信息 包含 系统管理 管理员
发布、删除公告消息 扩展 系统管理 管理员
浏览公告消息 包含 系统管理 管理员
浏览各类日志信息 包含 日志管理 管理员
查询各类日志信息 扩展 日志管理 管理员
浏览景点数据 包含 攻略库 用户、管理员
浏览游记数据 包含 攻略库 用户、管理员
排序、查询景点数据 扩展 攻略库 用户、管理员
排序、查询游记数据 扩展 攻略库 用户、管理员
收藏、取消收藏景点 扩展 攻略库 用户、管理员
浏览所有公开的行程计划 扩展 攻略库 用户、管理员
查询公开的行程计划 扩展 攻略库 用户、管理员
旅游日历 包含 数据统计 用户、管理员
景点分析 包含 数据统计 用户、管理员
游记分析 包含 数据统计 用户、管理员
搜索某个城市的热门景点 扩展 数据统计 用户、管理员
显示当前系统定位和时间 包含 首页 用户、管理员
显示当前数据库内各项景点数据量 包含 首页 用户、管理员
在地图图表上显示旅游城市数据 包含 首页 用户、管理员
2.4 非功能性需求
非功能性需求,指的是信息系统中保证性能、系统可靠性、可扩展性要求等方面相应的需求要素[17]。纵观景点数据分析系统,为了使用户有良好的使用性和用户体验,本系统也做了许多非功能性需求,比如系统响应时间、数据分析结果精度、系统友好性等。
该系统为了让用户使用起来操作简单,无需采用复杂的显示方式来进行数据展示,采用浏览器来达到高效显示和使用。无论是web浏览器或是移动端浏览器均可兼容显示,这样使得用户使用起来得心应手。
为了提升用户的使用体验和系统的友好性,该系统设计了很多用户提示信息,帮助和提示用户进行功能性操作,不会让用户在操作不当是产生无助或烦躁情绪。并且为了界面美观和照顾用户使用本系统时的心情,本系统在开发时选用意义明确的图标和色彩鲜明的提示,页面简洁明了,搜索框位置统一且明显,表格风格统一。
在系统做数据分析时,当数据量越多,景点数据分析的结果就越精确。为了提高系统数据分析的结果精度,需要尽可能多地采集相关景点数据。正是因为需要保证结果精度,所以本系统的数据量相对较大,在查询分析结果时,系统响应速度可能会响应的变慢,为了达到用户在系统响应速度方面的需求,显示数据分析结果时,对不同类型的数据分析结果进行分模块显示,这样一来,能提高系统响应的速度并且减小服务器的压力。
为了验证用户身份的可靠性,用户的邮箱数据不能为空且是唯一的。在注册系统用户时,给用户注册的邮箱里发送激活邮件,用户需要点击该激活链接进入系统进行激活账号操作,激活成功才算是注册成功,否则未激活账号的用户也是不能登录该系统的。相应的,用户修改个人信息的邮箱信息时,也是需要向新修改的邮箱里发送验证链接,点击该链接进入系统进行重新绑定邮箱的操作,这样才进行数据库更新操作,更新成功才算是修改成功,否则不能修改成功。
2.5 本章小结
本章主要讲述了景点数据分析系统的功能需求分析、用例描述和非功能需求等,简述了不同角色进入系统后,可进行不同操作的工作流程。由以上分析可知,除了注册功能,该系统的其他所有功能都必须是在登录状态下才可进行操作,不同角色的用户分别对应着不同的功能操作,使得系统层次分明、功能清晰。

3 系统设计

3.1 系统总体结构
通过系统内部用户身份的不同来构建功能结构,分别分析不同用户身份登录状态下系统可实现的功能。景点数据分析系统的功能结构图如图3.1所示。
在这里插入图片描述

图3.1 系统功能结构图
由图3.1系统的功能结构图可以看出,该系统存在普通用户和管理员两种身份,功能模块分别为首页、数据统计、攻略库、个人中心、采集管理、日志管理、系统管理七大模块,并包含登录、注册、忘记密码、修改个人信息、统计当日登录人数和访问人数等功能。该系统必须登录之后才能使用,普通用户可以浏览首页、数据统计、攻略库和使用个人中心四个模块。系统管理、日志管理、采集管理、查看系统访问人数和当日登录人数只提供给系统管理员使用。
3.2 系统功能模块设计
3.2.1 首页
用户登录成功后,即可访问系统首页。系统首页显示了当前定位、系统时间、当前系统内所含的景点数据量和景点地图等景点数据信息,首页的时序分析如图3.2所示。普通用户和系统管理员是共用首页界面的,只是根据权限的不同,显示的内容有细微的差别。如果由登录提交来的用户权限是普通用户,则不显示采集管理、日志管理、系统管理三个模块,并且不显示统计的当日登录数量和系统访问总人数。
在这里插入图片描述

图3.2 首页时序图
3.2.2 数据统计模块
数据统计模块主要包括了旅游日历、景点分析、游记分析三个部分的图表展示。在进行图表展示之前,需要对采集来的数据进行综合分析,思考数据应该怎样展示才能更直观明了的被人理解和接收[18]。图3.3为数据展示时序图,数据展示是将上述数据分析的结果直接以图表的形式展现出来,为用户提供可视化的界面,进行个性化旅游景点数据分析。该模块主要展示了旅游日历展示、月销量top10 景点展示等。
在这里插入图片描述

图3.3 数据统计之数据展示时序图
3.2.3 攻略库模块设计
攻略库模块也是数据展示的一部分,即将系统中的数据信息进行前端展示的过程。将短时间内不会更改的数据直接显示到攻略库模块。因此攻略库模块包括景点景区、精选游记和行程计划三部分部分内容,是展示当前系统景点数据、游记数据和行程计划数据,其中行程计划是由该系统的用户发布的未来的出行计划,展示这部分内容是提供给其他用户关于旅游的新思路与新选择,方便用户进行个性化的决策。下面将以景区景点数据为例来对攻略库模块的功能设计进行讲解。
在景点景区页面,将分页显示系统数据库内所有的景点数据信息,包括但不限于景点名、景点地址、景点图片、景点月销量、景点热度等信息。在此页面,用户可以按自己的需求对景点数据进行排序,系统提供了热度、月销量、最低花销三种排序方式,分别按照热度由高到低、月销量由高到低、最低花销由低到高排序;用户可以根据已知景点名或景点地址对景点信息进行查询操作;用户也可以收藏自己感兴趣的景点,或者取消收藏已经失去旅游兴趣的景点。景点景区模块的时序图如图3.4所示。
在这里插入图片描述

图3.4 景区景点模块时序图
3.2.4 个人中心模块
个人中心模块分别包含了问卷调查、行程计划、消息列表和收藏四个小模块。问卷调查模块包括对问卷调查的填写、显示、修改、浏览问卷调查分析结果等;行程计划模块包括对用户个人的行程计划的发布、修改、显示、删除、查询等;消息列表模块包含对公告消息的显示、查询等;收藏模块需要显示用户个人所收藏的所有景点数据信息,包含景点数据的排序、查询和取消收藏等。以下将以行程计划模块为例对个人中心模块功能设计进行讲解。
在行程计划页面,将分页显示用户个人所发布的所有行程计划信息,包括但不限于景点名、出发时间、发布时间、人物、预计费用等信息。在此页面,用户可以选择景点、填写出发时间和预计费用等信息发布行程计划;用户可以删除发布过的行程计划;用户可以选择某条行程计划修改该行程计划的内容,包括景点、状态等;用户也可以根据景点或出发时间查询相关行程计划信息。行程计划模块如图3.5所示。
在这里插入图片描述

图3.5 行程计划模块时序图
3.2.5 采集管理模块
采集管理模块包括对城市、游记、景点等数据的采集,以采集景点数据为例进行说明。在采集景点数据页面,将分页显示之前每一次采集景点数据的记录,包括但不限于更新数量、当前系统景点总数量、采集总耗时、采集关键词、采集城市名和采集景点主题等信息。在此页面,管理员可以选择采集关键字、采集城市、采集主题信息来制定采集策略并进行景点数据的采集操作;管理员也可以根据采集时间来对景点数据采集日志进行查询。采集城市数据时序图如图 3.6所示。
在这里插入图片描述

图3.6 采集景点数据时序图
3.2.6 系统管理模块
系统管理模块主要是对用户信息和公告消息进行管理。用户信息管理包含显示、查询用户信息以及初始化用户密码和设置管理员等功能;公告消息包含对公告消息的发布、删除、查看详情、查询等功能。下面将以用户信息管理为例对系统管理模块功能设计进行讲解。
在用户信息管理页面,将分页显示该系统所有用户的信息,包括但不限于登录名、密码、邮箱、性别手机号、所在地等信息。在此页面,管理员可以根据用户名或邮箱对用户信息进行查询;管理员也可以选定某个用户,查看该用户的详细信息。在用户信息详情页面,管理员可初始化密码;管理员也可以修改该用户的等级状态,将普通用户升级为系统管理员。用户信息管理时序图如图 3.7所示。
在这里插入图片描述

图3.7 查询用户数据时序图
3.2.7 日志管理模块
日志管理模块包括上传日志、邮箱日志、采集日志等,以邮箱日志管理为例进行说明。在系统触发发送邮件的功能后,例如重新绑定邮箱、注册激活账号和忘记密码等功能时,系统会记录每一次发送邮件的时间、收件人、内容等。管理员在邮箱日志管理页面可以根据邮件类型、收件人、发送时间来查询某条具体的邮箱记录日志信息,查询邮箱日志时序图如图3.8所示。
在这里插入图片描述

图3.8 查询邮箱日志时序图
3.3 系统数据库设计
景点数据分析系统的实体关系图如图3.9所示。由图可知,该系统一共设计了21个实体,其中有1个1对1关系、23个1对多关系。表3.1展示了该系统所需要设计的21张表以及对应的描述。
在这里插入图片描述

图3.9 景点数据分析系统的实体关系图
表3.1 景点数据分析系统数据库总设计
编号 表名 描述
01 travel_qunar_calendar 采集去哪儿旅行日历数据表
02 travel_qunar_city 采集去哪儿全部旅行目的地推荐(城市)表
03 travel_qunar_notes 采集去哪儿游记数据表
04 travel_qunar_scenic 采集去哪儿旅行景点表
05 travel_spider_log 采集日志表
06 travel_collection 用户收藏记录表
07 travel_email_log 发送邮箱日志记录表
08 travel_email_reset 邮箱重置日志表
09 travel_message 公告消息表
10 travel_plan 行程计划表
11 travel_questionnaire 用户的问卷调查表
12 travel_qunar_scenic_detail 景点标签表
13 travel_scenic_subject 景点主题表
14 travel_spider_calendar 旅游日历爬虫日志表
15 travel_spider_city 旅游城市爬虫日志表
16 travel_spider_notes 游记爬虫日志表
17 travel_spider_scenic 景点爬虫日志表
18 travel_upload_log 上传文件记录表
19 travel_user 用户表
20 travel_user_login 用户登录次数记录表
21 travel_user_reset 用户重置密码记录表
3.4 本章小结
本章主要是进行整个系统的设计工作,包括对系统总体、功能模块和数据库的设计,这是后续系统实现的基础。该章应用功能结构图、用例图、时序图对功能模块的设计进行说明,并列出实现该系统所需的数据表以及每个数据表所对应的功能。

4 系统实现

4.1 系统实现概述
4.1.1 开发环境
系统的开发环境是一个非常重要的因素,本系统所依赖的操作系统是Windows 10,数据库为MySQL5.7,开发语言为PHP7.0.4,处理器为i7,另外使用的开发工具PHPStorm和Web服务器Apache2.4.18。通过使用这些技术并结合第2章所提到的相关关键技术框架来完成景点数据分析系统,保证每个功能模块和对应的子功能都能够正常使用。
4.1.2 用户环境
为了能够精准实现景点数据分析系统的每一个功能操作,用户环境起着决定性作用。为了能更好的的使用该系统,建议在以下用户环境中操作该系统。服务器硬件方面:i5以上处理器;大于512MB的内存;大于40G的硬盘。服务器软件方面:Windows 10系统;MySQL数据库服务器;Apache2.0或以上版本的Web服务器。客服端软件方面:Windows系统;FireFox 76.0以上或Google Chrome 81.0以上的浏览器;PHPStorm 2018.2以上版本的开发工具。
4.2 数据库实现
由本文的3.3章节可知,为了该系统的连贯性以及合理性,至少需要创建21张表。下面针对数据库实现部分介绍数据库中比较重要的核心数据表,逻辑结构如表4.1至表4.4所示,主要介绍核心数据表内的字段名、数据类型、约束条件和字段描述等内容。
城市采集数据表即travel_qunar_city如表4.1所示,该表用于存储从“去哪儿”旅游网站采集到的城市数据,表中共有5个字段,其中href指去哪儿网站中介绍该城市详情页的链接。
表4.1 城市采集数据表
字段名 数据类型(精度范围) 空/非空 约束条件 其它说明
cid INT(11) 非空 主键约束,非空约束 自增长
area VARCHAR(45) 非空 非空约束 区域
province VARCHAR(45) 非空 非空约束 省份
city VARCHAR(45) 非空 非空约束 城市
href VARCHAR(100) 非空 非空约束 城市链接
旅行日历采集数据表即travel_qunar_calendar如表4.2所示,该表用于存储从“去哪儿”旅游网站采集到的旅行日历数据,表中共有5个字段,其中href指去哪儿网站中介绍该城市详情页的链接。
表4.2 旅行日历采集数据表
字段名 数据类型(精度范围) 空/非空 约束条件 其它说明
caid INT(11) 非空 主键约束,非空约束 自增长
calendar INT(11) 非空 非空约束 月份
city VARCHAR(45) 非空 非空约束 城市
area VARCHAR(45) 非空 非空约束 区域
href VARCHAR(100) 非空 非空约束 城市链接
游记采集数据表即travel_qunar_notes如表4.3所示,该表用于存储从“去哪儿”旅游网站采集到的游记数据,表中共有14个字段,其中href指去哪儿网站中介绍该游记详情页的链接。
表4.3 游记采集数据表
字段名 数据类型(精度范围) 空/非空 约束条件 其它说明
nid INT(11) 非空 主键约束,非空约束 自增长
title VARCHAR(255) 非空 非空约束 标题
href VARCHAR(100) 非空 非空约束 游记链接
city_name VARCHAR(100) 非空 非空约束 游玩城市
days VARCHAR(255) 非空 非空约束 游玩天数
fee INT(11) 非空 非空约束 人均费用
trip VARCHAR(255) 非空 非空约束 游玩方式
people VARCHAR(10) 非空 非空约束 人物
places VARCHAR(255) 非空 非空约束 景点名称
start_date VARCHAR(50) 非空 非空约束 出发时间
reading INT(8) 非空 非空约束 阅读量
like_num INT(8) 非空 非空约束 点赞量
comment INT(8) 非空 非空约束 评论量
month VARCHAR(45) 非空 非空约束 出行月份
景点采集数据表即travel_qunar_scenic如表4.4所示,该表用于存储从“去哪儿”旅游网站采集到的景点数据,表中共有11个字段,其中href指去哪儿网站中介绍该景点详情页的链接,picture指的是采集的该景点的图片信息。
表4.4 景点采集数据表
字段名 数据类型(精度范围) 空/非空 约束条件 其它说明
sid INT(11) 非空 主键约束,非空约束 自增长
scenic_name VARCHAR(50) 非空 非空约束 景点名
city VARCHAR(45) 非空 非空约束 所在城市
site VARCHAR(255) 非空 非空约束 详细地址
level VARCHAR(20) 非空 非空约束 景区等级
hot FLOAT 非空 非空约束 热度
monthly_sales INT(11) 非空 非空约束 月销量
floor_cost FLOAT 非空 非空约束 最低花销
picture VARCHAR(255) 非空 非空约束 图片
scenic_introduction VARCHAR(255) 非空 非空约束 景点简介
href TEXT 非空 非空约束 景点链接
4.3 系统各部分功能模块实现
4.3.1 首页
用户进入本系统并且登录成功后,即可进入首页,首页显示登录用户当前定位、系统当前时间、系统当前所含各种爬取的数据数量,比如景点数量、游记数量等,最重要的是显示国内地图,并在地图上的每个省份标注了当前各自比较热门的旅游城市及数量。如果是普通用户,左侧菜单栏只能显示首页、数据统计、攻略库和个人中心四个模块,导航栏只显示用户信息及公告信息数量。如果是系统管理员,左侧菜单栏还要显示采集管理、系统管理、日志管理三个模块,并且导航栏还显示了系统总访问人数及当日用户登录数,如图4.1所示。
在这里插入图片描述

图4.1 系统管理员首页实现
首页的核心代码,主要是介绍在后台查询城市景点导航部分每个省份所要显示的景点城市数据,并将这些数据进行封装返回给前端页面。
public function cityMap(){
$result = array(); // 用于存储查询到的城市
$count = array(); // 用于存储查询到的城市数量
p r o v i n c e = d b ( ′ q u n a r c i t y ′ ) − > g r o u p ( ′ p r o v i n c e ′ ) − > f i e l d ( ′ p r o v i n c e ′ ) − > s e l e c t ( ) ; f o r e a c h ( province = db('qunar_city') ->group('province') ->field('province') ->select(); foreach ( province=db(qunarcity)>group(province)>field(province)>select();foreach(province as KaTeX parse error: Expected 'EOF', got '&' at position 17: …rovince_key => &̲province_value) { // 循环遍历省份
$city_map[‘province’] = [‘in’, $province_value[‘province’]];
c i t y = d b ( ′ q u n a r c i t y ′ ) − > w h e r e ( city = db('qunar_city')->where( city=db(qunarcity)>where(city_map)->field(‘province,city’)
->select();
t o t a l = d b ( ′ q u n a r c i t y ′ ) − > w h e r e ( total = db('qunar_city') ->where( total=db(qunarcity)>where(city_map)
->field(‘count(city) as total’)
->select();
foreach ($city as KaTeX parse error: Expected 'EOF', got '&' at position 13: city_key => &̲city_value) { // 循环遍历城市
r e s u l t [ result[ result[city_value[‘province’]][] = KaTeX parse error: Expected 'EOF', got '}' at position 29: …ity']; }̲ foreac…total as KaTeX parse error: Expected 'EOF', got '&' at position 14: total_key => &̲total_value) {
$count[] = $total_value[‘total’];
}
}
t h i s − > a s s i g n ( ′ c o u n t ′ , j s o n e n c o d e ( this->assign('count', json_encode( this>assign(count,jsonencode(count));
t h i s − > a s s i g n ( ′ p r o v i n c e ′ , j s o n e n c o d e ( a r r a y k e y s ( this->assign('province', json_encode(array_keys( this>assign(province,jsonencode(arraykeys(result)));
t h i s − > a s s i g n ( ′ c i t y ′ , j s o n e n c o d e ( a r r a y v a l u e s ( this->assign('city', json_encode(array_values( this>assign(city,jsonencode(arrayvalues(result)));
}
4.3.2 数据统计模块
以旅行日历分析为例来说明数据统计模块的实现。旅行日历一共包含四个图表,均采用highCharts技术进行实现。其中包括城市旅游月份分析、部分法定节假日出行百分比、五一节出行城市Top10、国庆节出行城市Top10,如图4.2和图4.3所示,其中城市旅游月份分析图表可进行折线图、柱状图和面积图的转换,并且系统内的每个图表均有将图表转换成各类型格式的图片和Excel下载的功能,且可将图表全屏显示。
在这里插入图片描述

图4.2 旅行日历实现一
在这里插入图片描述

图4.3 旅行日历实现二
旅行日历分析的核心代码,主要介绍了在后台查询每个月份的适宜旅游城市总数、不同节假日出行总数统计等,并将这些数据进行封装返回给前端页面。
public function travelCalendar(){
$calendar = db(‘qunar_calendar’)
->group(‘calendar’)->field(‘count(city) as total’)
->select(); // 查询城市总数量
c o u n t = a r r a y c o l u m n ( count = array_column( count=arraycolumn(calendar, ‘total’); // 返回输入数组中total列的值
t h i s − > a s s i g n ( ′ t r a v e l c a l e n d a r c o u n t ′ , j s o n e n c o d e ( this->assign('travel_calendar_count', json_encode( this>assign(travelcalendarcount,jsonencode(count));
}
public function travelVocation(){
$travelVocation = Db::name(‘qunar_notes’)->count();
$new_year = Db::name(‘qunar_notes’)->where(‘start_date’, ‘like’, ‘%-01-01’)->count(); // 元旦节
$tomb_sweeping = Db::name(‘qunar_notes’)
->where(‘start_date’, ‘like’, ‘%-04-04’)
->whereOr(‘start_date’, ‘like’, ‘%-04-05’)
->whereOr(‘start_date’, ‘like’, ‘%-04-06’)
->count(); // 查询清明节出行数量
$labour_day = Db::name(‘qunar_notes’)
->where(‘start_date’, ‘like’, ‘%-05-01’)
->whereOr(‘start_date’, ‘like’, ‘%-05-02’)
->whereOr(‘start_date’, ‘like’, ‘%-05-03’)
->whereOr(‘start_date’, ‘like’, ‘%-05-04’)
->whereOr(‘start_date’, ‘like’, ‘%-05-05’)
->count(); // 查询五一节出行数量
$national_day = Db::name(‘qunar_notes’)
->where(‘start_date’, ‘like’, ‘%-10-01’)
->whereOr(‘start_date’, ‘like’, ‘%-10-02’)
->whereOr(‘start_date’, ‘like’, ‘%-10-03’)
->whereOr(‘start_date’, ‘like’, ‘%-10-04’)
->whereOr(‘start_date’, ‘like’, ‘%-10-05’)
->whereOr(‘start_date’, ‘like’, ‘%-10-06’)
->whereOr(‘start_date’, ‘like’, ‘%-10-07’)
->count(); // 查询国庆节出行数量
$new_year_percent = $new_year / $travelVocation; // 计算元旦占比
$tomb_sweeping_percent = $tomb_sweeping / $travelVocation; // 计算清明占比
$labour_day_percent = $labour_day / $travelVocation;// 计算五一占比
$national_day_percent = $national_day / $travelVocation;// 计算国庆占比
t h i s − > a s s i g n ( ′ n e w y e a r p e r c e n t ′ , j s o n e n c o d e ( this->assign('new_year_percent', json_encode( this>assign(newyearpercent,jsonencode(new_year_percent));
t h i s − > a s s i g n ( ′ t o m b s w e e p i n g p e r c e n t ′ , j s o n e n c o d e ( this->assign('tomb_sweeping_percent',json_encode( this>assign(tombsweepingpercent,jsonencode(tomb_sweeping_percent));
t h i s − > a s s i g n ( ′ l a b o u r d a y p e r c e n t ′ , j s o n e n c o d e ( this->assign('labour_day_percent',json_encode( this>assign(labourdaypercent,jsonencode(labour_day_percent));
t h i s − > a s s i g n ( ′ n a t i o n a l d a y p e r c e n t ′ , j s o n e n c o d e ( this->assign('national_day_percent',json_encode( this>assign(nationaldaypercent,jsonencode(national_day_percent));
}
4.3.3 攻略库模块
以景区景点管理为例来对攻略库模块的实现进行说明,景区景点展示了系统当前所有的景点数据信息,如图4.4所示。在该页面可以点击下拉框选择排序方式对景点信息进行排序,可在搜索框输入景点名或景点地址进行查询景点信息,可点击收藏按钮收藏景点信息,也可点击取消收藏按钮取消收藏景点。
在这里插入图片描述

图4.4 景区景点的实现
景区景点管理的核心代码,主要介绍了收藏和取消收藏功能的实现,首先需要确定当前系统登录用户,整理每条数据信息,进行新增操作。如果新增成功则收藏成功,反之失败;如果删除成功则取消收藏成功,反之失败。并将数据提示信息以json格式返回前段页面。
public function scenicCollection(){
$scenic_id = Request::post(‘scenic_id’);
$collection_data = [
‘collection_type’ => 0,
‘scenic_id’ => $scenic_id,
‘collection_time’ => time(),
‘collection_ip’ => request()->ip(),
‘user_id’ => session(‘user_id’),
]; // 查询条件
c o l l e c t i o n = D b : : n a m e ( ′ c o l l e c t i o n ′ ) − > i n s e r t G e t I d ( collection = Db::name('collection')->insertGetId( collection=Db::name(collection)>insertGetId(collection_data); // 写入操作
if (!$collection) {
$result = [
‘code’ => 0,
‘msg’ => ‘收藏失败’,
];
return $result;
}
$result = [
‘code’ => 1,
‘msg’ => ‘收藏成功’,
];
return $result;
}
public function cancelCollection(){
$scenic_id = Request::post(‘scenic_id’); // 接收景点数据id
$collection_data = [‘collection_type’ => 0,‘scenic_id’ => $scenic_id,‘user_id’ => session(‘user_id’),];
c o l l e c t i o n = D b : : n a m e ( ′ c o l l e c t i o n ′ ) − > w h e r e ( collection = Db::name('collection') ->where( collection=Db::name(collection)>where(collection_data)
->delete(); // 删除操作
if (!$collection) {
$result = [
‘code’ => 0,
‘msg’ => ‘取消收藏失败’,
];
return $result;
}
$result = [
‘code’ => 1,
‘msg’ => ‘取消收藏成功’,
];
return $result;
}
4.3.4 个人中心模块
以行程计划管理为例来对个人中心模块的实现进行说明。如图4.5所示,个人中心的行程计划只显示当前登录用户自己发布过的行程计划。用户可以录入景点、预计费用、人物、游玩天数等数据信息,点击蓝色发布按钮,验证通过后即可发布行程计划。在搜索条内分别输入对应的景点名和发布时间即可进行行程计划的查询操作。
在这里插入图片描述

图4.5 行程计划实现
行程计划管理的核心代码,主要介绍了根据景点和发布时间进行查询的查询功能的实现。首先判断是否有搜索条件,如果没有,则根据当前等用户的uuid进行查询操作;反之,还需要加上搜索条件进行模糊查询操作。查询完毕将查询数据返回前段页面。
public function planData($places_search, KaTeX parse error: Expected '}', got 'EOF' at end of input: … if (empty(places_search)) {
$places_map = [];
} else {
p l a c e s m a p = [ [ ′ p l a c e s ′ , ′ l i k e ′ , ′ places_map = [['places', 'like', '%'. placesmap=[[places,like,places_search.‘%’]]; // 根据景点地址进行模糊查询
}
$today_begin_time = $start_date_search . ’ 0:0:0’; // 当天开始时间
$today_end_time = s t a r t d a t e s e a r c h . ′ 23 : 59 : 5 9 ′ ; / / 当天结束时间 i f ( e m p t y ( start_date_search . ' 23:59:59'; // 当天结束时间 if (empty( startdatesearch.23:59:59;//当天结束时间if(empty(start_date_search)) {
$start_date_map = [];
} else {
// 匹配当天数据
s t a r t d a t e m a p = [ [ ′ s t a r t d a t e ′ , ′ b e t w e e n t i m e ′ , [ start_date_map = [['start_date','between time', [ startdatemap=[[startdate,betweentime,[today_begin_time, $today_end_time]],];
}
p l a n = D b : : n a m e ( ′ p l a n ′ ) − > w h e r e ( ′ u s e r i d ′ , s e s s i o n ( ′ u s e r i d ′ ) ) − > w h e r e ( plan = Db::name('plan') ->where('user_id',session('user_id'))->where( plan=Db::name(plan)>where(userid,session(userid))>where(places_map)
->where($start_date_map)
->paginate(5, false, [
‘query’ => request()->param(),
]);
return $plan;
}
4.3.5 采集管理模块
以采集景点数据为例进行采集管理模块的说明。采集景点数据如图5.6所示,用户可以在此页面选择采集规则进行采集景点数据,每进行采集一次,采集景点数据日志就多一条数据,并且采集成功之后系统会提示此次采集共耗时多长和更新了多少条数据,并且管理员可以根据采集时间进行查找采集记录。
在这里插入图片描述

图4.6 采集景点数据实现
采集景点数据的核心代码,主要介绍了使用queryList技术根据页面相关采集内容的类名来进行采集功能的实现。首先需要将前端页面管理员制定的采集规则传递给后端,根据采集规则确定采集的网址。然后制定页面采集规则rules和range,进而进行采集工作。并将采集的数据传到模型中,在模型里对数据库进行新增和修改操作,与此同时还需写入采集日志,当所有对数据库的写入和更新操作成功之后才算采集成功。其中,为了防止触发旅游网站的反爬虫机制,需要对采集操作进行时间限制,设置每隔10分钟才能执行采集操作,以物理方法解决反爬虫机制;其次,可设置http代理和伪造http头的方式解决反爬虫。
public function scenicPlot($keyword, $city, $subject){
$proxy = fakeIP(); // 代理IP
$rules = [ // 制定采集规则
‘scenic_name’ => [‘.sight_item_about .sight_item_caption .name’,‘text’], // 景点名
‘city’ => [‘.sight_item_about .sight_item_info .clrfix .area’,‘text’], // 城市
‘level’ => [‘.sight_item_about .sight_item_info .clrfix .level’,‘text’], // 等级
‘hot’ => [
‘.sight_item_about .sight_item_info .clrfix .sight_item_hot .product_star_level’,
‘text’
], // 热度
‘site’ => [‘.sight_item_about .sight_item_info .address’,‘text’,‘-a’], // 地址
‘floor_cost’ => [‘.sight_item_pop .sight_item_price’,‘text’], // 最低消费
‘monthly_sales’ => [‘.sight_item_pop .sight_item_sold-num’,‘text’], // 月销量
‘picture’ => [‘.sight_item_show .show>a>img’,‘data-original’], // 图片
‘href’ => [‘.sight_item_show .show>a’,‘href’], // 链接
‘scenic_introduction’ => [‘.sight_item_about .sight_item_info .intro’,‘text’] // 景点描述
];
r a n g e = ′ . s i g h t i t e m . s i g h t i t e m d e t a i l ′ ; / / 采集规则 f o r ( range = '.sight_item .sight_item_detail'; // 采集规则 for ( range=.sightitem.sightitemdetail;//采集规则for(i = 1; $i <= 3; $i++) {
$page = i ∗ 1 ; i * 1; i1;urls[] = $page; // 采集页数
}
libxml_use_internal_errors(true); // 屏蔽输出非标准格式等警告信息
q l = Q u e r y L i s t : : r u l e s ( ql = QueryList::rules( ql=QueryList::rules(rules)->range( r a n g e ) ; / / 调用采集规则 f o r e a c h ( range); // 调用采集规则 foreach ( range);//调用采集规则foreach(urls as KaTeX parse error: Expected 'EOF', got '&' at position 12: url_key => &̲url_value) {
$scenic = $ql->get(‘https://piao.qunar.com/ticket/list.htm?’, [ // 采集网址
‘keyword’ => $keyword,‘city’ => $city,
‘subject’ => $subject,‘page’ => $url_value
], [‘proxy’ => $proxy,‘timeout’ => 30,]) // proxy设置代理IP
->query()
->getData(); // 开始采集
$url = ‘http://piao.qunar.com/ticket/list.htm?’ . ‘keyword=’ . $keyword . ‘&page=’ . $url_value .
‘&city=’ . $city . ‘&subject=’ . s u b j e c t ; f o r e a c h ( subject; foreach ( subject;foreach(scenic as KaTeX parse error: Expected 'EOF', got '&' at position 15: scenic_key => &̲scenic_value) {
self::dataPreProcessing($scenic_value, $subject, $url); // 调用数据预处理方法
}
}
KaTeX parse error: Expected 'EOF', got '}' at position 36: …毁当前QueryList对象 }̲ private functi…scenic_value, $subject, $url){ // 对数据进行简单预处理
s c e n i c v a l u e [ ′ h o t ′ ] = c u t s t r i n g 2 ( scenic_value['hot'] = cut_string2( scenicvalue[hot]=cutstring2(scenic_value[‘hot’]);
$scenic_value[‘href’] = ‘https://piao.qunar.com’ . $scenic_value[‘href’];
s c e n i c v a l u e [ ′ s i t e ′ ] = c u t s t r i n g 2 ( scenic_value['site'] = cut_string2( scenicvalue[site]=cutstring2(scenic_value[‘site’]);
s c e n i c v a l u e [ ′ m o n t h l y s a l e s ′ ] = c u t s t r i n g 2 ( scenic_value['monthly_sales'] = cut_string2( scenicvalue[monthlysales]=cutstring2(scenic_value[‘monthly_sales’]);
s c e n i c v a l u e [ ′ f l o o r c o s t ′ ] = c u t s t r i n g 2 ( scenic_value['floor_cost'] = cut_string2( scenicvalue[floorcost]=cutstring2(scenic_value[‘floor_cost’]);
QunarScenic::getScenic($scenic_value, $subject, $url);
}
4.3.6 日志管理模块
以采集日志管理为例进行日志管理模块实现的说明。采集日志管理如图4.7所示,该页面显示了本系统所有管理员采集数据的记录。管理员按照页面提示选择采集类型、输入采集时间均可搜索相关采集记录信息。
在这里插入图片描述

图4.7 日志景点数据实现
日志管理模块的核心代码,主要介绍了在采集景点数据页面,根据采集类型和时间对采集日志记录进行查询功能的实现。首先判断是否有搜索条件,如果没有,则查询采集日志的所有数据;反之,还需要加上搜索条件进行查询操作。查询完毕将查询数据返回前段页面。
public function spiderLogSearch(){
$spider_type_search = Request::post(‘spider_type_search’); // 查询类型
$spider_time_search = Request::post(‘spider_time_search’); // 查询时间
s p i d e r l o g = s e l f : : s p i d e r D a t a ( spider_log = self::spiderData( spiderlog=self::spiderData(spider_type_search, s p i d e r t i m e s e a r c h ) ; / / 查询数据库 i f ( spider_time_search); // 查询数据库 if ( spidertimesearch);//查询数据库if(spider_log->isEmpty()) {
$result = [
‘code’ => 0,
‘msg’ => ‘未找到有关采集日志数据信息’,
];
return $result;
}
$result = [
‘code’ => 1,
‘msg’ => ‘查询成功’,
];
return KaTeX parse error: Expected 'EOF', got '}' at position 9: result; }̲ private functi…spider_type_search,KaTeX parse error: Expected '}', got 'EOF' at end of input: …选择查询类型 if (spider_type_search == 1) {
KaTeX parse error: Expected 'EOF', got '}' at position 59: …]; // 旅游城市 }̲ elseif (spider_type_search == 2) {
KaTeX parse error: Expected 'EOF', got '}' at position 59: …]; // 旅行日历 }̲ elseif (spider_type_search == 3) {
KaTeX parse error: Expected 'EOF', got '}' at position 57: …],]; // 游记 }̲ elseif (spider_type_search == 4) {
$spider_type_map = [[‘spider_type’, ‘=’, 3],]; // 景点
} else {
$spider_type_map = [];// 类型查询条件为空
}
$today_begin_time = $spider_time_search . ’ 0:0:0’; // 当天开始时间
$today_end_time = s p i d e r t i m e s e a r c h . ′ 23 : 59 : 5 9 ′ ; / / 当天结束时间 i f ( e m p t y ( spider_time_search . ' 23:59:59'; // 当天结束时间 if (empty( spidertimesearch.23:59:59;//当天结束时间if(empty(spider_time_search)) {
$spider_time_map = []; // 时间查询条件为空
} else {
// 匹配当天数据信息
s p i d e r t i m e m a p = [ [ ′ s p i d e r t i m e ′ , ′ b e t w e e n t i m e ′ , [ spider_time_map = [['spider_time','between time',[ spidertimemap=[[spidertime,betweentime,[today_begin_time, $today_end_time]],];
}
s p i d e r l o g = D b : : n a m e ( ′ s p i d e r l o g ′ ) − > w h e r e ( spider_log = Db::name('spider_log') ->where( spiderlog=Db::name(spiderlog)>where(spider_type_map)->where($spider_time_map) // 查询条件
->paginate(20, false, [‘query’ => request()->param(),]); // 分页显示
return $spider_log;
}
4.4 本章小结
本章主要叙述了系统的开发环境、用户环境以及数据库的实现、每个模块重点功能的实现等。其中,主要通过对项目里各模块核心内容的实现进行截图以及相对应的功能描述,将项目完成效果如实展现出来,并通过各部分的核心代码,将项目核心准确体现出来。

5 系统测试

5.1 功能测试
系统测试是系统软件在完成开发之后所需要进行的最重要的一个步骤,通过科学的测试方法来验证系统的功能模块的可行性和高效性[19]。因此,做好软件测试的过程是系统真正完成的标志[20]。本系统在开发的同时也进行着单元测试工作,系统开发完毕,将对整个项目的各个功能进行测试工作,如果测试不达标,会进一步调试修改代码,直至系统的每一个功能均达到预期效果。表5.1即为系统部分功能测试结果。
表5.1 系统部分功能测试结果
序号 测试内容描述 前置条件 输入条件 测试结果
01 新用户注册 注册页面 用户名、邮箱、密码 通过
02 登录 登录页面 用户名、密码 通过
03 采集游记数据 采集游记数据页面 游记类型、月份、天数等 通过
04 密码修改 设置页面 旧密码、新密码 通过
05 找回密码 找回密码页面 邮箱、验证码 通过
06 修改个人信息 资料页面 头像、用户名等 通过
07 重新绑定邮箱 设置页面 邮箱 通过
08 浏览首页 首页 无 通过
09 查看旅行日历分析结果 旅行日历页面 无 通过
10 查看景点分析结果 景点分析页面 无 通过
11 查看游记分析结果 游记分析页面 无 通过
12 浏览景点数据 旅行日历页面 无 通过
13 景点排序 景区景点页面 月销量、热度、花销 通过
14 查找景点 景区景点页面 景点名、景点地址 通过
15 浏览游记数据 精选游记页面 无 通过
16 游记排序 精选游记页面 评论量、点赞量、阅读量 通过
17 查找游记 精选游记页面 标题、景点名 通过
18 浏览行程计划 行程计划页面 无 通过
19 查找行程计划 行程计划页面 景点名、发布时间 通过
20 填写问卷调查 问卷调查页面 性别、出生日期等 通过
21 修改问卷调查 问卷调查页面 性别、出生日期等 通过
22 浏览问卷调查分析图表 问卷调查页面 无 通过
23 发布行程计划 行程计划页面 景点名、出行费用等 通过
24 修改行程计划 行程计划页面 景点名、出行费用等 通过
25 删除行程计划 行程计划页面 根据行程计划id 通过
5.2 压力测试
在Web性能测试中,JMeter[21]软件是被当做Web服务器与浏览器之间的一个代理网管,以为了方便捕获浏览器的请求和Web服务器的之间的响应[22]。
模拟指定时间内的用户访问数量来对系统进行压力测试,测试配置如图5.1所示,设置10秒中之内有300个用户同时访问系统一次。
在这里插入图片描述

图5.1 系统测试配置
测试结果如图5.2至图5.3所示。由测试结果可知,当300个用户在10秒内同时访问一次系统时,平均响应时间是561毫秒,错误率为2.67%,说明每同时访问系统300个用户里可能有8个左右的用户得不到响应,由此可知系统的性能一般。虽然性能一般,但本系统为小众数据分析系统,这已达最初的预期效果,当然后续也会对这部分内容加以优化改进。
在这里插入图片描述

图5.2 聚合报告分析
在这里插入图片描述

图5.3 测试结果的汇总图
5.3 本章小结
本章主要讲述了在系统开发完毕之后对系统的各个功能模块进行测试的操作,其中列举了系统项目里随机抽取的部分模块功能的测试结果,并采用JMeter对系统进行了压力测试。由以上测试结果可知,该系统已达到预期结果。

结 论

随着旅游行业的信息化和人们对于旅游观念的转变,人们普遍选择在各大旅游网站上来筛选旅游景点,但是目前国内各大旅游网站都缺乏数据分析展示和数据对比。由此看来,景点数据可挖掘的隐藏价值是十分巨大的。现今众多的第三方服务网站都开始了旅游行业数据信息的挖掘[23],使得用户在出行前对各大景点有一个宏观的认识和粗略的了解。同时也引起了许多的学者来分析和挖掘这些数据来得到潜在的信息而产生更符合大众需求的服务[24]。
本系统定位于当前大数据时代的环境下[25],首先筛选了旅游网站中比较关键且含有隐藏价值的景点数据,比如游记数据、景点数据、旅游城市数据等,通过对筛选出的数据进行采集和分析。把这些数据构成到景点数据分析系统中,结合具体用户的个性化需求,将这些数据经过加工处理以图表形式展示于用户眼前,并与系统管理功能相结合,设计了一套适用于有出行计划的用户的系统。
虽然目前系统已实现了预期效果,但是该系统的扩展性强,还有很大的延展空间。比如可研究有关景点推荐方面的功能实现,根据用户的收藏、经常访问和搜索记录,来匹配相似的景点,并将相似景点推荐给用户。还可研究在某个旅游城市的景点路线规划,设计该城市最合适的游览顺序等。总而言之,该系统在旅游景点功能实现方面还有很大的提升空间,系统的设计与实现也不会就此止步。

致 谢

四年的大学时光一晃即过,在沈阳城市学院校园文化氛围的熏陶下,感觉自己每天过的都很充实,四年时光,说长不长,但种种经历对我来说却弥足珍贵,让我受益良多。
特别感谢我的导师陈思老师,无论是在学习还是在工作中,陈老师言传身教的示范,深深地影响了我对工作生活的态度。在学术研究上,陈老师大胆假设、小心求证,让我学会了踏实求真的研究态度。在工作学习上,陈老师严谨负责,一丝不苟的态度成为了今后工作生活中的学习榜样。感谢董超老师,但在过去的四年时间里,无论是在专业知识学习还是为人处世上董老师都给予我非常多指导,为我的学习和研究指明了方向,感谢董老师帮助和督促我们形成良好的科研习惯,塑造正确的科研精神。
本次毕业设计的工作历时两个多月,再次感谢我的指导老师们,感谢老师们对我论文的指导。感谢同学们平时对我的帮助,不论是学习上还是生活上,同学们都给予了我很多的帮助。感谢我的家人,是他们不遗余力的支持,才使得我有机会接受高等的教育,才能坐在沈阳城市学院的教室、图书馆学习我渴求已久的专业知识。

参考文献

[1]黄建. 旅游推荐系统的研究与设计[D]. 浙江:浙江理工大学, 2017
[2]那俊豪. 旅游网站数据采集及分析系统的设计与实现[D].成都:电子科技大学,2017
[3]王怡人. 大数据与信息可视化文献综述[J]. 工业设计,2018(04):121-122
[4]王小洁. 基于PHP的网络数据采集[J]. 山西:山西电子技术, 2018(06):65-76
[5]Tao ZHANG. Realization and Design of Office Website Based on ThinkPHP Framework[C]. Science And Engineering Research Center.Proceedings of 2017 2nd International Conference on Electrical and Electronics: Techniques and Applications(EETA2017).Science And Engineering Research Center:Science and Engineering Research Center,2017:368-370
[6]王俊芳,李隐峰,王池. 基于MVC模式的ThinkPHP框架研究[J]. 电子科技, 2014, 27(04):151-158
[7]胡六四. ThinkPHP框架分析与应用实践研究[J]. 电脑迷,2017(04):127-188
[8]李春芳,石民勇. 数据可视化原理与实例[M]. 北京:中国传媒大学出版社,2018:1-30
[9]Shilong Guo. Research and implementation of Highcharts in patent map[C]. 信息化与工程国际学会.Proceedings of 2016 4th International Conference on Machinery,Materials and Computing Technology(ICMMCT 2016).信息化与工程国际学会:计算机科学与电子技术国际学会(Computer Science and Electronic Technology International Society),2016:1581-1584
[10]钟文广,万强,徐常福. Highcharts图表库在Web开发中的应用[J]. 科技广场,2017(04):55-58
[11]WANG Li,CAO Xiaoshu,LI Tao,GAO Xingchuan.Accessibility Comparison and Spatial Differentiation of Xi"an Scenic Spots with Different Modes Based on Baidu Real-time Travel[J].Chinese Geographical Science,2019,29(05):848-860
[12]Deqing Li,Honghui Mei,Yi Shen,Shuang Su,Wenli Zhang,Junting Wang,Ming Zu,Wei Chen. ECharts: A declarative framework for rapid construction of web-based visualization[J]. Visual Informatics, 2018, 2(2):30-50
[13]崔蓬. ECharts在数据可视化中的应用[J]. 软件工程, 2019, 22(06):42-46
[14]赵海国.Ajax支持下的ECharts图形报表技术的应用[J].电子技术,2018,47(04):66-69
[15]Szymon Berski, Martyna Bilau. Safety Mechanisms in Relational Database as Part of the IT System of the Enterprise[J]. 2019, 2(2):12-23
[16]蒋睿. MySQL数据库安全研究[J]. 电脑知识与技术, 2020, 16(09):3-4+21
[17]李响. 标准管理系统非功能性需求分析[J]. 四川建材, 2014, 40(03):328-329
[18]翟曜, 李芬芬, 张正伟, 刘俊, 王雨豪. 学堂在线MOOC课程的数据爬取与统计分析[J]. 电脑与电信, 2019(09):33-35
[19]薛金川. Web系统压力测试方法研究与实践[J]. 科技创新与应用, 2016(19):80
[20]李翼, 冯焱, 冯菲. 基于12306的Web应用系统测试方法[J]. 铁路计算机应用, 2017, 26(02):35-38
[21]陈有为, 郭建峰, 冯楠. 基于Jmeter的Web性能自动化测试用例设计应用研究[J]. 自动化与仪器仪表, 2016(05):172-173+176
[22]李形. 基于分布式环境压力测试问题的研究[D]. 苏州大学, 2011
[23]王兵兵. 基于自媒体的旅游信息挖掘与可视化研究[D]. 上海:上海师范大学, 2019
[24]王泽云,刘子豪. 数据挖掘在旅游电子商务中的应用与研究[J]. 中国管理信息化, 2019, 22(20):138-139
[25]殷复莲. 数据分析与数据挖掘实用教程[M]. 北京:中国传媒大学出版社,2017:1-30

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/729706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

it-tools工具箱

it-tools 是一个在线工具集合&#xff0c;包含各种实用的开发工具、网络工具、图片视频工具、数学工具等 github地址&#xff1a;https://github.com/CorentinTh/it-tools 部署 docker run -d --name it-tools --restart unless-stopped -p 8080:80 corentinth/it-tools:lat…

yolov8多batch推理,nms后处理

0. 背景 在高速公路监控视频场景下&#xff0c;图像分辨率大都是1920 * 1080或者2560 * 1440&#xff0c;远处的物体&#xff08;车辆和行人等&#xff09;都比较小。考虑需要对图像进行拆分&#xff0c;然后把拆分后的数据统一送入模型中&#xff0c;推理的结果然后再做nms&am…

【微前端乾坤】 vue2主应用、vue2+webpack子应用,vue3+webpack子应用、vue3+vite子应用的配置

因公司需求 需要将原本vue2iframe 形式的项目改成微前端乾坤的方式。 之前iframe都是直接嵌套到vue2项目的二级目录或者三级目录下的(反正就是要随处可嵌) 用乾坤的原因&#xff1a; 1、iframe嵌套的方式存在安全隐患&#xff1b; 2、项目是联合开发的&#xff0c; 乾坤的方便…

Hack The Box-Crafty

目录 信息收集 rustscan whatweb WEB 漏洞利用 漏洞说明 漏洞验证 提权 get user.txt get Administrator 总结 信息收集 rustscan ┌──(root㉿ru)-[~/kali/hackthebox] └─# rustscan -a 10.10.11.249 --range0-65535 --ulimit5000 -- -A -sC [~] Automatically…

NLP:自定义模型训练

书接上文&#xff0c;为了完成指定的任务&#xff0c;我们需要额外训练一个特定场景的模型 这里主要参考了这篇博客&#xff1a;大佬的博客 我这里就主要讲一下我根据这位大佬的博客一步一步写下时&#xff0c;遇到的问题&#xff1a; 文中的cfg在哪里下载&#xff1f; 要不…

Fastjson漏洞利用合集

0x01 Fastjson 概述 1.应用场景 接口返回数据 Ajax异步访问数据RPC远程调用前后端分离后端返回的数据开放API(一些公司开放接口的时候&#xff0c;我们点击请求&#xff0c;返回的数据是JSON格式的)企业间合作接口(数据对接的时候定义的一种规范&#xff0c;确定入参&#x…

BUUCTF-MISC-[HDCTF2019]信号分析1

题目链接&#xff1a;BUUCTF在线评测 (buuoj.cn) 下载附件是一个WAV的文件&#xff0c;题目又叫做信号分析&#xff0c;用Adobe Audition 打开分析了 发现有很多长短不一样的信号&#xff0c;只需要分析一段 猜测长的是一短的为0 最后得到0101010101010101000000110 百度得知…

vscode如何远程到linux python venv虚拟环境开发?(python虚拟环境、vscode远程开发、vscode远程连接)

文章目录 1. 安装VSCode2. 安装扩展插件3. 配置SSH连接4. 输入用户名和密码5. 打开远程文件夹6. 创建/选择Python虚拟环境7. 安装Python插件 Visual Studio Code (VSCode) 提供了一种称为 Remote Development 的功能&#xff0c;允许用户在远程系统、容器或甚至 Windows 子系统…

【致逝去的青春】《龙珠》作者鸟山明逝世,享年68岁

鸟山明工作室&#xff08;BIRD STUDIO&#xff09;于3月8日发布讣告&#xff1a;鸟山明已于2024年3月1日因急性硬膜下血肿逝世&#xff0c;享年68岁。 《龙珠》从 1984 年开始于《周刊少年Jump》连载&#xff0c;过后曾改编曾多部动画、剧场版、游戏&#xff0c;相关周边商品也…

opengl 学习(二)-----你好,三角形

你好&#xff0c;三角形 分类demo效果解析 分类 opengl c demo #include "glad/glad.h" #include "glfw3.h" #include <iostream> #include <cmath> #include <vector>using namespace std;/** * 在学习此节之前&#xff0c;建议将这…

Alveo 概念拓扑结构

在 Alveo 加速卡中,涉及到的概念拓扑结构主要包括 Alveo 卡上的各个关键组件以及与主机系统之间的通信结构。以下是对这些概念拓扑结构的简要介绍: 1.DDR 即双数据率内存(Double Data Rate memory),是一种常见的计算机内存类型,用于存储和提供处理器所需的数据和指令。…

macos m1 arm芯片 使用jpype报错 FileNotFoundError: [Errno 2] JVM DLL not found

startJVM(jpype.getDefaultJVMPath()) 报错 Traceback (most recent call last):File "/Users/thomas990p/PycharmProjects/tuya/volcano-biz-scripts/WenKongFa/FinalCode/java2python/CallJavaAPI.py", line 12, in <module>startJVM(jpype.getDefaultJVMPa…

基于springboot实现大学生兼职网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现大学生兼职系统演示 摘要 现代化的市场中&#xff0c;人们日常的工作、生活都在不断的提速&#xff0c;而人们在工作与生活中与互联网的结合也越来越紧密&#xff0c;通过与互联网紧密的结合可以更好地实现日常工作的线上化、信息化、便捷化。现如今的各行各…

ebpf入门---监听所有新进程

什么是ebpf eBPF 全称 extended Berkeley Packet Filter&#xff0c;中文意思是 扩展的伯克利包过滤器。一般来说&#xff0c;要向内核添加新功能&#xff0c;需要修改内核源代码或者编写 内核模块 来实现。而 eBPF 允许程序在不修改内核源代码&#xff0c;或添加额外的内核模…

鸿蒙App基础

像素单位 .1、基础单位 为开发者提供4种像素单位&#xff0c;框架采用vp为基准数据单位。 PS&#xff1a;个人建议使用lpx&#xff0c;配置好配置文件&#xff0c;这里就可以按照UI设计稿实际的来&#xff0c;可以更好的实现设计效果 名称描述px屏幕物理像素单位vp屏幕密度相…

一拖二快充线独特优势

在现代社会&#xff0c;手机已成为我们生活中不可或缺的一部分。随着科技的不断进步&#xff0c;手机的功能越来越强大&#xff0c;从通讯工具逐渐转变为工作、学习和娱乐的得力助手。然而&#xff0c;手机的电量问题一直是困扰着我们的难题。为了解决这个问题&#xff0c;市场…

3•8向女同胞致敬|营销枢纽SaaS厂商乐通达(ltd.com)正式更名枢纽云

为了向女同胞致敬&#xff0c;我们特地选择3月8日女神节变更公司名称&#xff0c;因为《如果SaaS有性别&#xff0c;那 TA一定是女性 》。 2024年3月8日&#xff0c;“杭州乐通达网络有限公司”名称正式变更为“杭州枢纽云计算有限公司”&#xff08;简称&#xff1a;营销枢纽&…

测试常用的Linux命令

前言 直接操作硬件 将把操作硬件的代码封装成系统调用&#xff0c;供程序员使用 虚拟机软件 可以模拟的具有完整硬件系统的功能 可以在虚拟机上安装不同的操作系统 Linux内核只有一个&#xff0c;发行版有很多种 内核来运行程序和管理像磁盘和打印机等硬件设备的核心程序 终端…

积鼎科技两款国产流体仿真软件入选《上海市工业软件推广目录》!

为落实《上海市促进工业软件高质量发展行动计划(2021-2023年)》&#xff0c;聚焦重点行业和领域痛点问题&#xff0c;提升关键软件技术创新和供给能力&#xff0c;推动工业软件产品应用和产业生态建设更好支撑全市制造业数字化转型&#xff0c;《2023年上海市工业软件推荐目录》…

YOLOv8改进 | 独家创新篇 | 利用DCNv3集合DLKA形成全新的注意力机制(全网独家创新)

一、本文介绍 本文给大家带来的机制是由我独家创新结合Deformable Large Kernel Attention (D-LKA) 注意力机制和DCNv3可变形卷积的全新注意力机制模块(算是二次创新),D-LKA的基本原理是结合了大卷积核和可变形卷积的注意力机制,通过采用大卷积核来模拟类似自我关注的感受…