大数据旅游数据分析:基于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 % sightId
            respDetailXpath = etree.HTML(self.send_request(detailUrl).text)
            score = respDetailXpath.xpath('//span[@id="mp-description-commentscore"]/span/text()')
            if not score:
                score = 0
                star = 0
            else:
                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 % commentSightId
            comments = []
            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旅游采集数据分析可视化推荐系统的目标是为用户提供便捷的旅游信息获取和个性化推荐,并通过可视化展示使用户更好地了解和选择适合自己的旅游产品。它可以帮助用户节省时间和精力,提高旅行的满意度。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

技术派数据库表自动初始化(学习)

不需要在db中手动创建或者导入相关的schema、data&#xff0c;项目启动自动创建对应的表&#xff0c;并初始化。实现该过程。 Liquibase数据库版本管理 依赖配置 在paicoding-web模块中&#xff0c;pom.xml 文件中添加 <dependency><groupId>org.liquibase</g…

Java毕业设计 基于SSM SpringBoot vue购物比价网站

Java毕业设计 基于SSM SpringBoot vue购物比价网站 SSM vue 购物比价网站 功能介绍 首页 图片轮播 商品 商品分类 商品详情 评论 收藏 商品攻略 商品信息 公告栏 在线反馈 登录 注册 个人中心 我的收藏 后台管理 登录 注册商品户 个人中心 修改密码 个人信息 商品户管理 用户…

污水处理设备远程监控:HiWoo Cloud如何打造智慧环保新时代

随着工业化和城市化的快速推进&#xff0c;污水处理成为了保护环境、维护生态平衡的重要一环。传统的污水处理设备管理方式往往依赖于人工巡检和现场控制&#xff0c;不仅效率低下&#xff0c;而且难以实时掌握设备的运行状况。在这个背景下&#xff0c;HiWoo Cloud平台推出了污…

如何使用固定公网地址远程访问本地RStudio Server【内网穿透】

文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE&#xff0c;并通过 Web 浏览器进行访问…

【小沐学C++】C/C++包管理工具Conan使用(C++、Python、CMake、Conan)

文章目录 1、简介2、Conan下载安装3、Conan命令3.1 查看conan版本3.2 更新conan库3.3 搜索软件包3.4 显示conan所有源3.5 查看软件包3.6 通过conanfile.txt安装依赖包 结语 1、简介 Conan是C和C语言的依赖项和包管理器。它是免费和开源的&#xff0c;适用于所有平台&#xff0…

知识蒸馏 pytorch官网源码分析

参考连接&#xff1a; Knowledge Distillation Tutorial — PyTorch Tutorials 2.2.1cu121 documentation 方法一 &#xff1a; 知识蒸馏的损失函数只接受两个相同维度的输入&#xff0c;所以我们需要采取措施使他们在进入损失函数之前是相同维度的。我们将使用平均池化…

考研初试没过线怎么办?你还有这些机会!

2024年研考初试成绩已经发布。 研究生考试国家线大概率在下个月公布。 过了国家线的同学可以继续准备复试或者选择调剂。 如果初试失利没过线&#xff0c;也不要急着放弃&#xff01; 我们还有上岸拿硕士学位的机会&#xff01; 考研初试没过线,我们还可以这样入学&#x…

【JavaEE进阶】 Spring AOP详解

文章目录 &#x1f38b;前言&#x1f38d;Spring AOP核心概念&#x1f6a9;切点(Pointcut)&#x1f6a9;连接点(Join Point)&#x1f6a9;通知(Advice)&#x1f6a9;切面(Aspect) &#x1f340;通知类型&#x1f6a9;注意事项 &#x1f332;PointCut&#x1f384;切面优先级Ord…

【JavaEE进阶】 Spring AOP快速上手

文章目录 &#x1f343;什么是AOP&#x1f333;什么是Spring AOP&#x1f334;上手Spring AOP&#x1f6a9;引入依赖&#x1f6a9;编写AOP程序 ⭕总结 &#x1f343;什么是AOP AOP是Aspect Oriented Programming的简称&#xff08;又称为面向切⾯编程&#xff09; 什么是面向…

面试笔记系列四之SpringBoot+SpringCloud+计算机网络基础知识点整理及常见面试题

目录 Spring Boot 什么是 Spring Boot&#xff1f; Spring Boot 有哪些优点&#xff1f; SpringBootApplication注解 Spring Boot 的启动流程 Spring Boot属性加载顺序 springboot自动配置原理是什么&#xff1f;&#xff08;*&#xff09; 如何理解springboot中的start…

ISP代理是什么?跨境账号养号为什么要选择它?

在跨境出海业务中&#xff0c;代理IP对于您的在线任务至关重要&#xff0c;尤其是对于那些运行多个帐户的人来说。为您的帐户选择正确类型的代理对于确保帐户安全非常重要&#xff0c;劣质的IP容易使账号遭受封号风险。IPFoxy的多种代理IP类型应用范围各有侧重&#xff0c;其中…

ICML 2023 | 可证明的动态多模态融合框架论文整理

主要思想 提出一种针对低质量数据的通用的动态多模态融合框架&#xff0c;利用多模态融合得到的泛化误差去动态更新各个单模态预测器, 使得多模态决策倾向于更多地依赖于高质量模态 &#xff0c;而不是其他模态 。通过动态确定每种模态的融合权重来减轻不可靠模态的影响。&…

3月5日济南,2024生物发酵展全新起航!助力打造生物产业经济新时代

生物发酵是生物产业的重要组成部分&#xff0c;近年来&#xff0c;我国生物产业发展迅猛&#xff0c;生物发酵技术也已广泛应用于食品、农业、医药、饲料、日化、材料等领域&#xff0c;市场前景广阔。2022年5月&#xff0c;国家发改委发布的《“十四五”生物经济发展规划》明确…

霍格沃兹遗产显示找不到emp.dll无法继续执行此代码的多种解决方法

在《霍格沃茨&#xff1a;遗产》这款游戏中&#xff0c;如果发现无法找到必要的文件emp.dll&#xff0c;emp.dll作为游戏运行过程中不可或缺的核心组件之一&#xff0c;它的缺失会导致游戏根本无法启动&#xff0c;玩家将无法正常进入并探索这个充满魔法与奇幻色彩的霍格沃茨世…

MySQL(基础篇)——函数、约束

一.函数 1.定义 函数是指一段可以直接被另一段程序调用的程序或代码。 2.字符串函数 常见如下&#xff1a; -- 字符串拼接 SELECT CONCAT(hello,MySql) AS CONCAT -- 将字符串全部转为小写 SELECT LOWER(HEllo MYSql) AS LOWER -- 将字符串全部转为大写 SELECT UPPER(Hello…

(C语言)二分查找

在⼀个升序的数组中查找指定的数字n&#xff0c;很容易想到的⽅法就是遍历数组&#xff0c;但是这种⽅法效率⽐较低。⽐如我买了⼀双鞋&#xff0c;你好奇问我多少钱&#xff0c;我说不超过300元。你还是好奇&#xff0c;你想知道到底多少&#xff0c;我就让你猜&#xff0c;你…

谷歌SEO推广提高网站点击率的10个秘籍-华媒舍

在当今数字化时代&#xff0c;拥有一个高点击率的网站对于企业和个人而言至关重要。通过谷歌SEO推广&#xff0c;可以帮助网站吸引更多的流量&#xff0c;并在搜索引擎结果页面&#xff08;SERP&#xff09;中获得更好的排名。本文将介绍10个谷歌SEO推广的秘籍&#xff0c;帮助…

ubuntu新建ap热点并分享

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

基于React, Redux实现的俄罗斯方块游戏及源码

分享一个俄罗斯方块游戏游戏框架使用的是 React Redux&#xff0c;其中再加入了 Immutable&#xff0c;用它的实例来做来Redux的state。&#xff08;有关React和Redux的介绍可以看 安装 npm install运行 npm start浏览自动打开 http://127.0.0.1:8080/ 打包编译 npm run …

码住!2024抖音电商爆品攻略,21个行业68个类目一文集齐

小商家&#xff0c;大生意。 2023年&#xff0c;抖音电商高歌猛进&#xff0c;用直播带货创造增量&#xff0c;以商品卡承接用户资产&#xff0c;跑出2万亿市场&#xff0c;带动万千品牌实现二次增长&#xff0c;无数中小商家随奔腾浪潮涌出&#xff0c;从无名到争先&#xff…