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

news2025/2/24 23:28:46

文章目录

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

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

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

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

相关文章

mongo之常用数据库操作

目录 一、准备环境 二、日常记录及执行示范 连接数据库查询版本查询表总数模糊查询(使用正则)查询文档中数据条数排序大于等于查询有哪些库时间查询不在条件内的查询复制数据更新字段名称删除数据库 四、高阶查询 五、备份迁移数据库 总结 一、准备环境 借鉴:…

前端-BOM和DOM的区别和用法

首先上图,这是整个JAVASCRIPTD 结构,因此我们可以得出一个关系等式 JavaScript ECMAscript BOM DOMECMAscript: 是一种由 ECMA国际(前身为欧洲计算机制造商协会)通过 ECMA-262 标准化的脚本程序设计语言&#xff0…

初体验通义灵码-JS篇

安装 我是JetBrains IDEs的付费忠粉,使用的他们家的全家桶,故先选择在Webstorm安装通义灵码 按通义灵码的官方指引安装即可:https://tongyi.aliyun.com/lingma/download 使用 安装后重启webstorm,IED左右下会有通义灵码的登录…

form表单的自定义校验规则

需求&#xff1a;校验el-input输入为0-100的数字 <el-form :label-position"top" label-width"80px" ref"ogdiskForm" :model"originalDiskForm" :rules"rules" class"form"><el-form-item label"…

FLask会话技术和Flask模板语言

二、FLask会话技术和Flask模板语言 1.会话技术 cookie 客户端的会话技术&#xff1a;让服务器认识浏览器&#xff0c;常用于登录 cookie本身由浏览器保存&#xff0c;通过Response将cookie写到浏览器上&#xff0c;下一次访问&#xff0c;浏览器会根据不同的规则携带cookie过…

搭建LNMP架构 (下载nginx mysql PHP 论坛软件)

PHP(Hypertext Preprocessor 超文本预处理器)是通用服务器端脚本编程语言&#xff0c;主要用于web开发实现动态web页面&#xff0c;也是最早实现将脚本嵌入HTML源码文档中的服务器端脚本语言之一。同时&#xff0c;php还提供了一个命令行接口&#xff0c;因此&#xff0c;其也可…

抖音商品详情数据API接口采集(属性,主图,价格,sku等)item_get-获得抖音商品详情

item_get-获得抖音商品详情 douyin.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥WeChat18305163218api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,i…

Codeforces Round 929 (Div. 3)题解

A. Turtle Puzzle: Rearrange and Negate&#xff08;Problem - A - Codeforces&#xff09; 题目大意&#xff1a;现有一个数组a[]&#xff0c;我们需要执行两个操作&#xff0c;首先将原数组按照任意顺序排序&#xff08;当然也可以不排序&#xff09;&#xff0c;然后选择一…

Selenium操作360浏览器

Selenium操作360浏览器 1. 查看当前使用的360浏览器内核chrome是哪个版本&#xff1a; 2. 下载对应的chromedriver https://chromedriver.chromium.org/downloads 3. demo # 打开360浏栏器 from selenium import webdriver import contextlib options webdriver.ChromeOpt…

单词规律00

题目链接 单词规律 题目描述 注意点 pattern只包含小写英文字母s只包含小写英文字母和 ’ ’s不包含任何前导或尾随对空格s中每个单词都被 单个空格 分隔 解答思路 本题与上一次同构字符串类似&#xff0c;思路可以参照同构字符串 代码 class Solution {public boolean …

华为云项目部署

前端部署 将dist文件夹下的内容拷贝到/usr/local/nginx/html下 #启动脚本是在 # /usr/local/nginx/sbin/nginx #启动 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #停止 /usr/local/nginx/sbin/nginx -s stop #重载 /usr/local/nginx/sbin/nginx -s rel…

对猫毛过敏还能养猫吗?宠物空气净化器帮你缓解猫毛过敏

很多人都知道&#xff0c;猫咪会掉毛。然而&#xff0c;像猫狗这样的宠物可能会成为一些病毒的传播源&#xff0c;对于对空气质量要求很高的朋友来说&#xff0c;这可能会导致过敏。此外&#xff0c;如果猫咪的排泄物等不及时清理&#xff0c;也可能会导致环境质量下降&#xf…

如何在Linux系统Docker部署Wiki.js容器并结合内网穿透实现远程访问本地知识库

文章目录 1. 安装Docker2. 获取Wiki.js镜像3. 本地服务器打开Wiki.js并添加知识库内容4. 实现公网访问Wiki.js5. 固定Wiki.js公网地址 不管是在企业中还是在自己的个人知识整理上&#xff0c;我们都需要通过某种方式来有条理的组织相应的知识架构&#xff0c;那么一个好的知识整…

Django官网项目

项目准备 使用VSCODE做IDE。 检查Python版本。 sudo apt install sudo apt update python3 --version创建项目路径&#xff0c;创建虚拟环境&#xff0c;创建项目 路径 \mysite 进入路径&#xff0c;运行VSCODE 运行 "code ." 创建虚拟环境。 选择 >python: c…

【力扣hot100】刷题笔记Day15

前言 今天要刷的是图论&#xff0c;还没学过&#xff0c;先看看《代码随想录》这部分的基础 深搜DFS理论基础 深搜三部曲 确认递归函数、参数确认终止条件处理目前搜索节点出发的路径 代码框架 void dfs(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本节点…

11.以太网交换机工作原理

目录 一、以太网协议二、以太网交换机原理三、交换机常见问题思考四、同网段数据通信全过程五、跨网段数据通信全过程六、关键知识七、调试命令 前言&#xff1a;在网络中传输数据时需要遵循一些标准&#xff0c;以太网协议定义了数据帧在以太网上的传输标准&#xff0c;了解以…

详细讲解:文物预防性保护解决方案的目标

一、文物预防性保护方案的系统目标 可移动文物预防性保护监测与调控系统,是博物馆开展科学、有效的预防性保护策略的关键工程&#xff0c;整套系统包括监测系统平台建设、调控设备部署、数据传输设备部署和环境数据监测设备安装工程。项目完成时将达到以下目标: 1)构建覆盖全…

如何在群晖NAS中开启FTP服务并实现公网环境访问内网服务

文章目录 1. 群晖安装Cpolar2. 创建FTP公网地址3. 开启群晖FTP服务4. 群晖FTP远程连接5. 固定FTP公网地址6. 固定FTP地址连接 本文主要介绍如何在群晖NAS中开启FTP服务并结合cpolar内网穿透工具&#xff0c;实现使用固定公网地址远程访问群晖FTP服务实现文件上传下载。 Cpolar内…

Flutter 数据持久化存储之Hive库

Flutter 数据持久化存储之Hive库 前言正文一、配置项目二、UI① 增加UI② 显示和删除UI 三、使用Hive① 初始化Hive② TypeAdapter自定义对象③ 注册TypeAdapter③ CURD 四、源码 前言 在Flutter中&#xff0c;有多种方式可以进行数据持久化存储。以下是一些常见的方式&#xf…

linux下查看某个命令在哪里个安装包程序下,以ifconfig命令举例子

yum list | grep net-tools &#xff08;查看yum安装列表中有没有安装指定的软件工具&#xff09;