大数据旅游数据分析:基于Python旅游数据采集可视化分析推荐系统

文章目录

  • 基于Python旅游数据采集可视化分析推荐系统
    • 一、项目概述
    • 二、项目说明
    • 三、开发环境
    • 四、功能实现
    • 五、系统页面实现
      • 用户登录注册
      • 系统首页
      • 数据操作管理
      • 价格与销量分析
      • 旅游城市和景点等级分析
      • 旅游数据评分情况分析
      • 旅游数据评论情况分析
      • 旅游景点推荐
      • Django系统后台管理
    • 六、结语

基于Python旅游数据采集可视化分析推荐系统

一、项目概述

在互联网时代,各行各业的人们都在寻求增长点,人们的日常生活越来越离不开互联网。以旅游信息为例,线下大量的各种旅游信息基本只会出现在旅游会上,但是现如今,人们越来越重视时间成本,所以越来越多的年轻人在网上查找自己想要查找的旅游就业信息。然而,在互联网信息和海量数据源混合的情况下,如何快速精确的找到自己想要的数据是一个值得探讨的问题。

本系统主要针对解决获取旅游信息滞后、参加线下旅行社和人工检索时间成本高等问题,运用网络爬虫信息技术设计思想,实现了一个基于Python的旅游信息推荐系统。本系统以Python语言为基础,使用 requests爬虫对去哪儿旅游信息源进行抓取,针对网页信息编写抽取规则,对旅游信息进行必要的过滤和提取,使用MySql对旅游信息进行数据存储。然后使用 Python 开源web框架 Django进行系统搭建,基于旅游信息采用机器学习协同过滤推荐算法完成对用户的旅游信息推荐,完成整个爬取以及数据检索到成功进行旅游推荐的网页端操作展示。

二、项目说明

基于python旅游采集数据分析可视化推荐系统是基于Django框架开发的一个旅游信息采集和推荐的应用。该系统通过爬虫技术从各个旅游网站抓取旅游信息,并利用推荐算法对用户进行个性化推荐,同时提供可视化展示界面。

以下是该系统的主要功能和组成部分的介绍:

旅游信息采集:系统通过编写爬虫程序,定期从各大旅游网站抓取旅游景点、酒店、机票等相关信息,包括价格、评价、位置等。这些采集到的数据会被保存到数据库中供后续使用。

用户注册与登录:用户可以注册自己的账号,并通过登录来获取个性化推荐和享受更多功能。

个性化推荐:系统会根据用户的历史浏览记录、收藏记录以及其他行为数据,利用推荐算法生成个性化推荐结果。推荐算法使用协同过滤、内容过滤方法,根据用户的兴趣和偏好为其推荐最相关的旅游信息。

可视化展示界面:系统会将采集的旅游信息以可视化方式展示给用户,包括地图标记、图片展示、价格对比等功能。用户可以通过地图选择感兴趣的地区,查看该地区的旅游景点、酒店等信息。

用户交互和反馈:系统提供用户评价、评论和收藏等功能,用户可以对自己的旅游经历进行评价,同时也可以保存自己喜欢的旅游信息以便日后查看。

后台管理:系统提供一个后台管理界面,管理员可以对用户信息、采集的数据、推荐算法参数等进行管理和配置。

三、开发环境

开发环境版本/工具
PYTHON3.9.0
开发工具PyCharm2021.2.1
操作系统Windows 10
内存要求16GB
浏览器Firefox
数据库MySQL 8.0.26
数据库工具Navicat 15 for MySQL
项目技术栈Python语言、Django框架、MySQL数据库、requests网络爬虫技术、机器学习算法、BootStrap、数据可视化

四、功能实现

系统爬虫部分核心代码

  def spiderMain(self,resp,province):respJSON = resp.json()['data']['sightList']for index,travel in enumerate(respJSON):print('正在爬取该页第%s数据' % str(index + 1))time.sleep(2)detailAddress = travel['address']discount = travel['discount']shortIntro = travel['intro']price = travel['qunarPrice']saleCount = travel['saleCount']try:level = travel['star'] + '景区'except:level = '未评价'title = travel['sightName']cover = travel['sightImgURL']sightId = travel['sightId']# ================================= 详情爬取detailUrl = self.detailUrl % sightIdrespDetailXpath = etree.HTML(self.send_request(detailUrl).text)score = respDetailXpath.xpath('//span[@id="mp-description-commentscore"]/span/text()')if not score:score = 0star = 0else:score = score[0]star = int(float(score)*10)commentsTotal = respDetailXpath.xpath('//span[@class="mp-description-commentCount"]/a/text()')[0].replace('条评论','')detailIntro = respDetailXpath.xpath('//div[@class="mp-charact-intro"]//p/text()')[0]img_list = respDetailXpath.xpath('//div[@class="mp-description-image"]/img/@src')[:6]# ================================= 评论爬取commentSightId = respDetailXpath.xpath('//div[@class="mp-tickets-new"]/@data-sightid')[0]commentsUrl = self.commentUrl % commentSightIdcomments = []try:commentsList = self.send_request(commentsUrl).json()['data']['commentList']for c in commentsList:if c['content'] != '用户未点评,系统默认好评。':author = c['author']content = c['content']date = c['date']score = c['score']comments.append({'author': author,'content': content,'date': date,'score': score})except:comments = []resultData = []

在这里插入图片描述

基于用户的协同过滤推荐算法,用于根据用户的评分数据推荐其可能喜欢的其他景点。

基于用户的协同过滤算法部分核心代码:

在这里插入图片描述

def user_bases_collaborative_filtering(user_id,user_ratings,top_n=20):
# def user_bases_collaborative_filtering(user_id, user_ratings, top_n=3):# 获取目标用户的评分数据target_user_ratings = user_ratings[user_id]# 初始化一个字段,用于保存其他用户与目标用户的相似度得分user_similarity_scores = {}# 将目标用户的评分转化为numpy数组target_user_ratings_list = np.array([rating for _ , rating in target_user_ratings.items()])# 计算目标用户与其他用户之间的相似度得分for user,ratings in user_ratings.items():if user == user_id:continue# 将其他用户的评分转化为numpy数组user_ratings_list = np.array([ratings.get(item,0) for item in target_user_ratings])# 计算余弦相似度similarity_score = cosine_similarity([user_ratings_list],[target_user_ratings_list])[0][0]user_similarity_scores[user] = similarity_score# 对用户相似度得分进行降序排序sorted_similar_user = sorted(user_similarity_scores.items(),key=lambda x:x[1],reverse=True)# 选择 TOP N 个相似用户喜欢的景点 作为推荐结果recommended_items = set()for similar_user,_ in sorted_similar_user[:top_n]:recommended_items.update(user_ratings[similar_user].keys())# 过滤掉目标用户已经评分过的景点recommended_items = [item for item in recommended_items if item not in target_user_ratings]return recommended_items
  1. user_bases_collaborative_filtering 函数接受三个参数:
    • user_id: 目标用户的ID。
    • user_ratings: 包含用户评分信息的字典,其中键是用户ID,值是包含景点及其评分的字典。
    • top_n: 选择推荐结果的前N个景点,默认为20。
  2. target_user_ratings = user_ratings[user_id]:获取目标用户的评分数据,即目标用户对各个景点的评分。
  3. user_similarity_scores = {}:初始化一个空字典,用于保存其他用户与目标用户的相似度得分。
  4. target_user_ratings_list = np.array([...]):将目标用户的评分转换为 NumPy 数组,以便后续计算余弦相似度。
  5. 遍历 user_ratings 中的每个用户,计算目标用户与其他用户之间的相似度得分:
    • 将其他用户的评分转化为 NumPy 数组。
    • 使用余弦相似度计算两个用户之间的相似度得分。
    • 将相似度得分存储在 user_similarity_scores 字典中。
  6. sorted_similar_user = sorted(user_similarity_scores.items(),key=lambda x:x[1],reverse=True):对用户相似度得分进行降序排序,得到一个包含用户ID和相似度得分的元组列表。
  7. recommended_items = set():初始化一个集合,用于保存推荐的景点。
  8. 遍历排序后的相似用户列表,选择前 top_n 个相似用户喜欢的景点,将这些景点添加到 recommended_items 集合中。
  9. recommended_items = [item for item in recommended_items if item not in target_user_ratings]:过滤掉目标用户已经评分过的景点,得到最终的推荐结果。
  10. 返回 recommended_items,即推荐给目标用户的景点列表。

这个函数接受目标用户ID、用户评分字典以及要返回的推荐结果数量作为参数。它计算目标用户与其他用户的相似度得分,然后选择相似度最高的用户喜欢的景点作为推荐结果。

– 获取目标用户的评分数据

– 初始化一个字典,用于保存其他用户与目标用户的相似度得分

– 将目标用户的评分转化为numpy数组

– 计算目标用户与其他用户之间的相似度得分(余弦相似度)

– 对用户相似度得分进行降序排序

– 选择TOP N个相似用户喜欢的景点作为推荐结果

– 过滤掉目标用户已经评分过的景点

五、系统页面实现

启动项目,在终端窗口输入命令,这里我设置的端口在8091:

python manage.py runserver 8091

在这里插入图片描述

用户登录注册

在这里插入图片描述

系统首页

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

数据操作管理

在这里插入图片描述

价格与销量分析

在这里插入图片描述

旅游城市和景点等级分析

在这里插入图片描述

旅游数据评分情况分析

在这里插入图片描述

旅游数据评论情况分析

在这里插入图片描述

旅游景点推荐

在这里插入图片描述

Django系统后台管理

http://127.0.0.1:8091/admin

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

六、结语

基于python旅游采集数据分析可视化推荐系统的目标是为用户提供便捷的旅游信息获取和个性化推荐,并通过可视化展示使用户更好地了解和选择适合自己的旅游产品。它可以帮助用户节省时间和精力,提高旅行的满意度。

需项目资料/商业合作/交流探讨等可以添加下面个人名片,后续有时间会持续更新更多优质内容,感谢各位的喜欢与支持!

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

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

相关文章

【前端早早聊直播回顾】Harmony 时代的跨端方案

上周末,凡泰极客CTO - 徐鹏受邀出席「前端早早聊」直播活动,并以【跨端新挑战-鸿蒙时代的跨端】为主题进行演讲。 摘取部分分享实录: 终端系统的数量和种类不断增长,开发者面临着多平台开发的挑战。以往开发者一般只需要维护iOS、…

2024年3月阿里云服务器大规模价格下调后优惠折扣表

阿里云服务器ECS等核心产品价格全线下调,最高幅度达55%,2024年3月1日生效,针对ECS部分在售产品的官网折扣价、ECS计算型节省计划进行调整,生效后,基于官网折扣价的新购和续费,将按照新的价格进行计费。阿里…

程序媛的mac修炼手册-- Node.js入门篇

最近因为参与一个微信小程序的开发,开始摸索JavaScript。期间,需要基于Node.js安装微信开发工具的依赖项,所以又顺带学习了Node.js的包管理工具npm(Node Package Manager)。不过,之前看到国外的全栈大佬​​…

flutter学习(一) 安装以及配置环境

首先需要下载flutter,然后解压 然后配置环境变量,配置到bin目录就行 配置完之后cmd运行flutter doctor 你就会发现,都是错 此时脑海里响起,卧槽,怎么回事,咋办 别着急,我教你。。。 问题 这…

内网穿透 nas/树莓派+ipv4服务器 (ipv6)

nas 1.有个服务器 2.有个nas https://github.com/snail007/goproxy/blob/master/README_ZH.md https://github.com/snail007/proxy_admin_free/blob/master/README_ZH.md 2个官网一个是程序,一个是网站 手册 https://snail007.host900.com/goproxy/manual/zh/#/?i…

rocketmq+rocket-dashboard win10安装部署+注册为Windows服务

1.1 首先去官网下载zip包 选择自己需要的版本 下载 | RocketMQ 1.2 、下载后,解压到指定目录 1.3、配置RocketMQ环境变量 注意,看对应的版本需要jdk版本 1.4、启动mqnameserver 进入bin目录下,双击启动mqnamesrv.cmd 启动后,…

事物管理(黑马学习笔记)

事物回顾 在数据库阶段我们已学习过事务了,我们讲到: 事物是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功,要么同时…

Gson使用Object接收长数字问题

近期发现公司同事在使用Gson对数字进行反序列列化时出现丢失精度的问题,在这里搬运一下,做个记录~ 现象 使用Gson反序列化长Long数字(大于16位),如果用Object类型来接收则会丢失精度。 Gson会将数字反序列化为double类型,double类型本身就容易丢精度。…

小程序基础

小程序基础 1. 认识什么是小程序 什么是微信小程序 微信小程序是一种运行在微信内部的 轻量级 应用程序。 在使用小程序时 不需要下载安装,用户 扫一扫 或 搜一下 即可打开应用。它也体现了 “用完即走” 的理念,用户不用关心安装太多应用的问题。它…

Metasploit安装及使用教程(非常详细)从零基础入门到精通,看完这一篇就够了。

通过本篇文章,我们将会学习以下内容: 1、在Windows上安装Metasploit 2、在Linux和MacOS上安装Metasploit 3、在Kali Linux中使用 Metasploit 4、升级Kali Linux 5、使用虚拟化软件构建渗透测试实验环境 6、配置SSH连接 7、使用SSH连接Kali 8、配…

JVM运行流程

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:JavaEE 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 JVM 1. 运行流程2. 运行时数据区2.1 堆&am…

ubuntu新建ap热点并分享

测试环境ubuntu16,只有一台笔记本电脑,不插网线,无线网卡既连wifi,又作为热点 1.方法1 直接手动新建ap热点 参考https://jingyan.baidu.com/article/ea24bc39b03fc6da62b331f0.html https://jingyan.baidu.com/article/363872ecd8f35d6e4ba…

机试指南:Ch5:线性数据结构 Ch6:递归与分治

文章目录 第5章 线性数据结构1.向量 vector2.队列 queue(1)队列的特点、应用(2)基本操作(3)例题例题1:约瑟夫问题2 (难度:中等) (4)习题习题1:排队打饭 (难度:中等) 3.栈 stack(1)栈…

前端 JS 经典:Content-type 详解

1. 什么是 Content-Type Content-Type 是 HTTP 协议中的一个请求头或响应头字段,用于指示发送或接收的实体的媒体类型,告诉服务器或客户端如何解析和处理请求或响应的主体部分。 2. Content-Type 的构成 Content-Type 由两部分组成:媒体类型…

视频在线压缩

video2edit 一款免费的在线视频编辑软件,可以进行视频合并、视频剪辑、视频压缩以及转换视频格式等。 链接地址:在线视频编辑器和转换器 - 编辑,转换和压缩视频文件 打开视频压缩页面,上传想要压缩视频,支持MP4&…

收入稳步增长 助力持续发展 尼康发布截至2024年3月财年第三季度财报

近日,尼康截至2024年3月财年的第三季度(2023年10月1日-2023年12月31日)财报正式发布。数据显示,尼康集团第三财季销售收入共计1977亿日元,较去年同期上涨300亿日元,涨幅约17.9%。其中影像业务领域&#xff…

视频记录仪_基于联发科MT6762的智能4G记录仪方案

智能记录仪采用联发科强劲八核处理器,12nm制程工艺的记录仪具便是满足这些需求的理想选择。搭载4GB32GB内存,并运行Android 11.0操作系统,这款记录仪具展现出强劲的性能表现。 首先,这款记录仪具具备优秀的视频录制功能。它能完整…

WPS如何共享文件和文件夹

1 WPS共享单个文件 用WPS打开要分享的文件,点击右上角的“分享”键,选择上传到云端。 之后点击“创建并分享”,即可分享该文档。 2 WPS创建共享文件夹 2.1 如何共享文件夹 首先打开WPS,点击左上角的首页。在首页栏中&#…

Ubuntu系统下DPDK环境搭建

目录 一.虚拟机配置1.添加一个网卡(桥接模式)2.修改网卡类型3.修改网卡名称4.重启虚拟机5.查看网卡信息6.dpdk配置内存巨型页 三 DPDK源代码下载和编译1.下载源代码2.解压源代码3.安装编译环境4.编译5.设置dpdk的环境变量6.禁止多队列网卡7.加载igb_uio模块8.网卡绑定9.验证测试…

Vue3自定义文章列表组件

一、Vue3的代码展示 <template><div><div v-for"article in articles" :key"article.id" class"article-card"><div class"author-info"><img :src"article.avatar" alt"Author Avatar&qu…