大数据旅游数据分析:基于Python旅游数据采集可视化分析推荐系统
文章目录
- 基于Python旅游数据采集可视化分析推荐系统
- 一、项目概述
- 二、项目说明
- 三、开发环境
- 四、功能实现
- 五、系统页面实现
- 用户登录注册
- 系统首页
- 数据操作管理
- 价格与销量分析
- 旅游城市和景点等级分析
- 旅游数据评分情况分析
- 旅游数据评论情况分析
- 旅游景点推荐
- Django系统后台管理
- 六、结语
基于Python旅游数据采集可视化分析推荐系统
一、项目概述
在互联网时代,各行各业的人们都在寻求增长点,人们的日常生活越来越离不开互联网。以旅游信息为例,线下大量的各种旅游信息基本只会出现在旅游会上,但是现如今,人们越来越重视时间成本,所以越来越多的年轻人在网上查找自己想要查找的旅游就业信息。然而,在互联网信息和海量数据源混合的情况下,如何快速精确的找到自己想要的数据是一个值得探讨的问题。
本系统主要针对解决获取旅游信息滞后、参加线下旅行社和人工检索时间成本高等问题,运用网络爬虫信息技术设计思想,实现了一个基于Python的旅游信息推荐系统。本系统以Python语言为基础,使用 requests爬虫对去哪儿旅游信息源进行抓取,针对网页信息编写抽取规则,对旅游信息进行必要的过滤和提取,使用MySql对旅游信息进行数据存储。然后使用 Python 开源web框架 Django进行系统搭建,基于旅游信息采用机器学习协同过滤推荐算法完成对用户的旅游信息推荐,完成整个爬取以及数据检索到成功进行旅游推荐的网页端操作展示。
二、项目说明
基于python旅游采集数据分析可视化推荐系统是基于Django框架开发的一个旅游信息采集和推荐的应用。该系统通过爬虫技术从各个旅游网站抓取旅游信息,并利用推荐算法对用户进行个性化推荐,同时提供可视化展示界面。
以下是该系统的主要功能和组成部分的介绍:
旅游信息采集:系统通过编写爬虫程序,定期从各大旅游网站抓取旅游景点、酒店、机票等相关信息,包括价格、评价、位置等。这些采集到的数据会被保存到数据库中供后续使用。
用户注册与登录:用户可以注册自己的账号,并通过登录来获取个性化推荐和享受更多功能。
个性化推荐:系统会根据用户的历史浏览记录、收藏记录以及其他行为数据,利用推荐算法生成个性化推荐结果。推荐算法使用协同过滤、内容过滤方法,根据用户的兴趣和偏好为其推荐最相关的旅游信息。
可视化展示界面:系统会将采集的旅游信息以可视化方式展示给用户,包括地图标记、图片展示、价格对比等功能。用户可以通过地图选择感兴趣的地区,查看该地区的旅游景点、酒店等信息。
用户交互和反馈:系统提供用户评价、评论和收藏等功能,用户可以对自己的旅游经历进行评价,同时也可以保存自己喜欢的旅游信息以便日后查看。
后台管理:系统提供一个后台管理界面,管理员可以对用户信息、采集的数据、推荐算法参数等进行管理和配置。
三、开发环境
| 开发环境 | 版本/工具 |
|---|---|
| PYTHON | 3.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
user_bases_collaborative_filtering函数接受三个参数:user_id: 目标用户的ID。user_ratings: 包含用户评分信息的字典,其中键是用户ID,值是包含景点及其评分的字典。top_n: 选择推荐结果的前N个景点,默认为20。
target_user_ratings = user_ratings[user_id]:获取目标用户的评分数据,即目标用户对各个景点的评分。user_similarity_scores = {}:初始化一个空字典,用于保存其他用户与目标用户的相似度得分。target_user_ratings_list = np.array([...]):将目标用户的评分转换为 NumPy 数组,以便后续计算余弦相似度。- 遍历
user_ratings中的每个用户,计算目标用户与其他用户之间的相似度得分:- 将其他用户的评分转化为 NumPy 数组。
- 使用余弦相似度计算两个用户之间的相似度得分。
- 将相似度得分存储在
user_similarity_scores字典中。
sorted_similar_user = sorted(user_similarity_scores.items(),key=lambda x:x[1],reverse=True):对用户相似度得分进行降序排序,得到一个包含用户ID和相似度得分的元组列表。recommended_items = set():初始化一个集合,用于保存推荐的景点。- 遍历排序后的相似用户列表,选择前
top_n个相似用户喜欢的景点,将这些景点添加到recommended_items集合中。 recommended_items = [item for item in recommended_items if item not in target_user_ratings]:过滤掉目标用户已经评分过的景点,得到最终的推荐结果。- 返回
recommended_items,即推荐给目标用户的景点列表。
这个函数接受目标用户ID、用户评分字典以及要返回的推荐结果数量作为参数。它计算目标用户与其他用户的相似度得分,然后选择相似度最高的用户喜欢的景点作为推荐结果。
– 获取目标用户的评分数据
– 初始化一个字典,用于保存其他用户与目标用户的相似度得分
– 将目标用户的评分转化为numpy数组
– 计算目标用户与其他用户之间的相似度得分(余弦相似度)
– 对用户相似度得分进行降序排序
– 选择TOP N个相似用户喜欢的景点作为推荐结果
– 过滤掉目标用户已经评分过的景点
五、系统页面实现
启动项目,在终端窗口输入命令,这里我设置的端口在8091:
python manage.py runserver 8091

用户登录注册

系统首页




数据操作管理

价格与销量分析

旅游城市和景点等级分析

旅游数据评分情况分析

旅游数据评论情况分析

旅游景点推荐

Django系统后台管理
http://127.0.0.1:8091/admin




六、结语
基于python旅游采集数据分析可视化推荐系统的目标是为用户提供便捷的旅游信息获取和个性化推荐,并通过可视化展示使用户更好地了解和选择适合自己的旅游产品。它可以帮助用户节省时间和精力,提高旅行的满意度。
需项目资料/商业合作/交流探讨等可以添加下面个人名片,后续有时间会持续更新更多优质内容,感谢各位的喜欢与支持!
相关文章:
大数据旅游数据分析:基于Python旅游数据采集可视化分析推荐系统
文章目录 基于Python旅游数据采集可视化分析推荐系统一、项目概述二、项目说明三、开发环境四、功能实现五、系统页面实现用户登录注册系统首页数据操作管理价格与销量分析旅游城市和景点等级分析旅游数据评分情况分析旅游数据评论情况分析旅游景点推荐Django系统后台管理 六、…...
打造智能汽车微服务系统平台:架构的设计与实现
随着智能汽车技术的飞速发展,微服务架构在汽车行业中的应用越来越广泛。采用微服务架构可以使汽车系统更加灵活、可扩展,并且有利于快速推出新功能和服务。本文将从设计原则、关键技术、数据安全等方面,介绍如何搭建智能汽车微服务系统平台架…...
机试指南:Ch5:线性数据结构 Ch6:递归与分治
文章目录 第5章 线性数据结构1.向量 vector2.队列 queue(1)队列的特点、应用(2)基本操作(3)例题例题1:约瑟夫问题2 (难度:中等) (4)习题习题1:排队打饭 (难度:中等) 3.栈 stack(1)栈…...
展厅设计的理念是什么
1、立足当地文化 升华本地精神 ,因地制宜,深入挖掘本土文化特色,撷取其精华,灵活运用、巧妙融入,做到掌控宏观全局。 重点突出,努力打造本土拳头品牌,挖掘其内涵,拓展延伸、着重展示…...
springboot 定时任务备份mysql数据库
记录在Linux 系统上定时备份MySQL数据库 1、在代码中添加备份 package org.jeecg.modules.xczxhhr.job;import lombok.extern.slf4j.Slf4j; import org.quartz.Job; import org.quartz.JobExecutionContext;import java.io.BufferedReader; import java.io.File; import java…...
PMP考试之20240301
1、在回顾项目团队最新的绩效报告时,项目经理注意到他们的产出出现了重大下降。项目经理决定: A.增加每个团队成员在截止日期前完成任务的压力 B.增加状态报告和团队评审会议的频率 C.为表现最好的团队成员提供特别奖励 D.改善和促进团队成员之间的信任和凝聚力…...
什么是MAC地址? win10电脑查看MAC地址的多种方法
您是否知道连接到家庭网络的每件硬件都有自己的身份?正如每个设备都分配有自己的 IP 地址一样,每个硬件都有一个唯一的网络标识符。 该标识符称为MAC 地址。MAC 代表媒体访问控制。您可能需要 MAC 地址来解决网络问题或配置新设备。在 Windows 中查找您…...
vue3中的基本语法
目录 基础素材 vue3的优化 使用CompositionAPI理由 1. reactive() 函数 2. ref() 函数 2.1. ref的使用 2.2. 在 reactive 对象中访问 ref 创建的响应式数据 3. isRef() 函数 4. toRefs() 函数 5. computed() 5.1. 通过 set()、get()方法创建一个可读可写的计算属性 …...
Timeplus-proton流处理器调研
概念 Timeplus是一个流处理器。它提供强大的端到端功能,利用开源流引擎Proton来帮助数据团队快速直观地处理流数据和历史数据,可供各种规模和行业的组织使用。它使数据工程师和平台工程师能够使用 SQL 释放流数据价值。 Timeplus 控制台可以轻松连接到不…...
H3C防火墙安全授权导入
一、防火墙授权概述 前面我们已经了解了一些防火墙的基本概念,有讲过防火墙除了一些基本功能,还有一些高级安全防护,但是这些功能需要另外独立授权,不影响基本使用。这里以H3C防火墙为例进行大概了解下。 正常情况下,防…...
使用 OpenCV 通过 SIFT 算法进行对象跟踪
本文介绍如何使用 SIFT 算法跟踪对象 在当今世界,当涉及到对象检测和跟踪时,深度学习模型是最常用的,但有时传统的计算机视觉技术也可能有效。在本文中,我将尝试使用 SIFT 算法创建一个对象跟踪器。 为什么人们会选择使用传统的计…...
SHELL 脚本: 导出NEO4j DUMP并上传SFTP
前提 开通sftp账号 安装expect 示例 NEO4J_HOME/path/to/neo4j # neo4j 安装目录 DUMP_PATH/data/dump # DUMP本地保存目录 DUMP_FILEneo4j_$(date %F).dump #导出文件名称 UPLOAD_DIR/path/to/stfp/dump/ #上传目录 $NEO4J_HOME/bin/neo4j-admin dump --databaseneo4j --t…...
Vue 封装一个函数,小球原始高度不固定,弹起比例不固定、计算谈几次后,高度低于1米
## 简介 本文将介绍如何使用Vue封装一个函数,计算小球弹跳的次数,直到高度低于1米。函数的参数包括小球的原始高度和弹起比例。通过代码案例演示了如何使用Vue进行封装和调用。 ## 函数封装 vue <template> <div> <label for&qu…...
外地人能申请天津公租房吗?2024天津积分落户租房积分怎么加?
相关推荐:在天津工作的外地人可以申请天津公共租赁住房吗? 外地人可以申请天津公共租赁住房吗? 2024年定居天津租房如何加分? 根据《天津居住证积分指标及积分表》的规定,在天津租房也可以参加积分结算,每…...
毕业设计——基于springboot的聊天系统设计与实现(服务端 + 客户端 + web端)
整个工程包含三个部分: 1、聊天服务器 聊天服务器的职责一句话解释:负责接收所有用户发送的消息,并将消息转发给目标用户。 聊天服务器没有任何界面,但是却是IM中最重要的角色,为表达敬意,必须要给它放个…...
公告栏功能:自动弹出提醒,重要通知不再错过
发布查询时,您是否遇到这样的困扰: 1、查询发布时间未到,学生进入查询主页后发现未发布任何查询,不断进行咨询。 2、有些重要事项需要进入查询主页就进行强提醒,确保人人可见,用户需要反馈“我知道了”才能…...
网络编程学习
思维导图 代码练习 TCP实现通信 服务器端代码 #include <myhead.h> #define SER_IP "192.168.152.135" #define SER_PORT 8910 int main(int argc, const char *argv[]) {//1创建用于监听的套接字int sfd -1;sfd socket(AF_INET,SOCK_STREAM,0)…...
centos物理电脑安装过程(2024年1月)
开机时:CtrlAltDelete键重启电脑 重启开始时:按F11,桌面弹出蓝色框,选择第二个SSK SFD142 1.00,回车 选择install centos7安装 选择后弹出选择安装选项,选择语言 连接无线网络 安装设置,选择磁…...
Web自动化测试平台开发---Automated_platform
一、项目简介 历时一个假期,Automated_platform 第一版完工,是一款基于po模式的自动化测试平台,采用后端技术为DjangoceleryRabbitMQmysql 配置mysql数据库,进行数据迁移后,运行项目后,即可成功访问http://127.0.0.1:8…...
mybatis-plus: 多租户隔离机制
文章目录 一、TenantLineHandler1、介绍2、包含的方法 二、简单实例三、实践1、实现TenantLineHandler接口 一、TenantLineHandler 1、介绍 TenantLineHandler 是 Mybatis-Plus 中用于处理多租户的接口,用于实现多租户数据隔离的具体逻辑。通过实现这个接口&#…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
