当前位置: 首页 > news >正文

基于python flask的旅游数据大屏实现,有爬虫有数据库

背景

随着旅游行业的快速发展,数据在旅游决策和规划中的重要性日益凸显。基于 Python Flask 的旅游数据大屏实现研究旨在结合爬虫技术和数据库存储,为用户提供全面、实时的旅游信息展示平台。

爬虫技术作为数据采集的重要手段,能够从各种网络数据源中高效地抓取和提取信息。通过自动化爬虫程序,可以实现对各大旅游网站、景点信息平台和交通服务网站的数据采集,实时获取旅游相关数据并保持更新。

数据库的运用则能够有效管理和存储大量的旅游数据,为后续的数据处理和展示提供支持。通过建立数据库模型和利用 Flask 的数据库扩展,可以实现数据的持久化存储和快速检索,保证数据的准确性和可靠性。

结合 Python Flask 框架开发旅游数据大屏,可以将爬虫获取的数据与数据库存储相结合,实现数据的动态展示和交互功能。这样的研究背景旨在为旅游行业提供更加智能和便捷的数据应用解决方案,提升用户体验和决策效率。

技术栈

flask框架

html+js+css

mysql8.0

pandas

echarts可视化

requests爬虫

前端设计

页面结构:

页面采用HTML5标准,包含了<!doctype html>声明,<html>、<head>和<body>等标签。
页面主要内容集中在<body>标签内,包括头部(header)和主要内容区域。


样式和脚本:

在<head>标签内引入了jQuery库和各种ECharts相关的JavaScript文件,用于数据可视化的图表展示。
引入了CSS样式表和自定义的JavaScript文件,用于页面的样式设置和交互效果的实现。


动态元素:

页面包含动态的粒子效果图(canvas)和加载动画,为用户呈现视觉效果。
使用iframe嵌入外部页面(index.html)以展示动态内容。


数据展示:

页面主要分为三栏布局,每栏内包含不同的数据可视化图表(如柱状图、饼图、词云图等)和数据展示区域。
使用ECharts库实现数据可视化,通过Ajax请求获取后端数据,并动态更新图表内容。


实时刷新:

使用JavaScript定时函数(setInterval)定时刷新页面数据,保持数据的实时性。
不同图表的刷新频率可能有所不同,以确保数据的及时更新和展示。


响应式设计:

页面部分元素设置了固定高度,适应不同屏幕尺寸的展示需求。
图表和内容区域的布局灵活,以适配不同的显示设备。

flask实现主要代码:

	def echart6(self):# 去除停用词def drop_stopwords( contents, stopword_list):contents_clean = []all_words = []for line in contents:line_clean = []for word in line:# 过滤停用词if word in stopword_list:continue# 过滤词个数小于等于1的词语if len(word) <= 1:continue# 过滤包含数字和特殊符号、英文的词语if re.search(r'\d|\W|[a-zA-Z]', word):continueline_clean.append(word)all_words.append(str(word))contents_clean.append(line_clean)return contents_clean, all_wordsengine = create_engine('mysql+pymysql://root:root@localhost:3306/旅游数据可视化')sql='select 简介 from 旅游数据详情;'one = pd.read_sql(sql, con=engine)stopwords = pd.read_csv("停用词.txt", index_col=False, sep="\t", quoting=3, names=['stopword'], encoding='utf-8')print(stopwords.head())content = one[one['简介'].notnull()]['简介'].values.tolist()content_S = []

爬虫主要代码:

 for j in url:try:res=requests.get(j[0],headers).textsoup = BeautifulSoup(res, 'lxml')dw = soup.find_all('li')for i in dw:try:chengshi=j[1]jingdian = i.find('div', class_="title").find('b').textprint(jingdian)xingji=j[2]print(xingji)xiaoliang = int((i.find('div', class_="title").find('span').text.split('人'))[0])print(xiaoliang)danjia = i.find_all('span', class_="price")dj = int(danjia[0].find('b').text) if danjia else 1print(dj)lianjie=i.find('a').get('href')print(lianjie)a.append(chengshi)b.append(jingdian)c.append(xingji)d.append(xiaoliang)e.append(dj)g.append(lianjie)

可视化主要代码:

tooltip: {show: true,formatter: function(params) {if (params.value.length > 1) {return '&nbsp;&nbsp;' + params.name + '&nbsp;&nbsp;&nbsp;' + params.value[2] + '热度&nbsp;&nbsp;';} else {return '&nbsp;&nbsp;' + params.name + '&nbsp;&nbsp;&nbsp;' + params.value + '热度&nbsp;&nbsp;';}},},geo: {map: 'china',show: true,roam: false,label: {emphasis: {show: false}},layoutSize: "100%",itemStyle: {normal: {borderColor: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{offset: 0,color: '#00F6FF'}, {offset: 1,color: '#53D9FF'}], false),borderWidth: 3,shadowColor: 'rgba(10,76,139,1)',shadowOffsetY: 0,shadowBlur: 60}}},series: [{type: 'map',map: 'china',aspectScale: 0.75,//zoom:1.1,label: {normal: {show: false,},emphasis: {show: false,}},itemStyle: {normal: {areaColor: {x: 0,y: 0,x2: 0,y2: 1,colorStops: [{offset: 0,color: '#073684' // 0% 处的颜色}, {offset: 1,color: '#061E3D' // 100% 处的颜色}],},borderColor: '#215495',borderWidth: 1,},emphasis: {areaColor: {x: 0,y: 0,x2: 0,y2: 1,colorStops: [{offset: 0,color: '#073684' // 0% 处的颜色}, {offset: 1,color: '#061E3D' // 100% 处的颜色}],},}},data: outdata,}, {type: 'effectScatter',coordinateSystem: 'geo',rippleEffect: {brushType: 'stroke'},showEffectOn: 'render',itemStyle: {normal: {color: {type: 'radial',x: 0.5,y: 0.5,r: 0.5,colorStops: [{offset: 0,color: 'rgba(5,80,151,0.2)'}, {offset: 0.8,color: 'rgba(5,80,151,0.8)'}, {offset: 1,color: 'rgba(0,108,255,0.7)'}],global: false // 缺省为 false},}},label: {normal: {show: true,color: '#fff',fontWeight: 'bold',position: 'inside',formatter: function(para) {return '{cnNum|' + para.data.value[2] + '}'},rich: {cnNum: {fontSize: 13,color: '#D4EEFF',}}},},symbol: 'circle',symbolSize: function(val) {if (val[2] === 0) {return 0;}var a = (maxSize4Pin - minSize4Pin) / (max - min);var b = maxSize4Pin - a * max;return a * val[2] + b * 1.2;},data: convertData(outdata),zlevel: 1,}]
};

最终效果:

相关文章:

  • 算法的时间与空间复杂度
  • 【C++面试100问】第八十五问:有了const,C++11为什么还要引入constexpr
  • 【busybox记录】【shell指令】readlink
  • Google发布的CAT3D,在1分钟内,能够从任意数量的真实或生成的图像创建3D场景。
  • 基于STM32+NBIOT(BC26)设计的物联网观赏鱼缸
  • 【前端每日基础】day27——小程序开发
  • 居间人从事光伏行业需要了解的关键因素
  • STM32实验之USART串口发送+接受数据(二进制/HEX/文本)
  • Putty: 随心御剑——远程启动服务工具plink
  • 【XR806开发板试用】基础篇,从零开始搭建一个LCD彩屏时钟(ST7735S驱动)
  • jenkins插件之Warnings
  • 稳住!一招制胜:打造JavaScript防抖函数的终极指南【含代码示例】
  • Spring6基础笔记
  • css卡片翻转 父元素翻转子元素不翻转效果
  • [RK3588-Android12] 关于EDP屏外设为Panel,不支持HPD的配置
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • Apache Pulsar 2.1 重磅发布
  • AWS实战 - 利用IAM对S3做访问控制
  • express + mock 让前后台并行开发
  • JAVA 学习IO流
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Yeoman_Bower_Grunt
  • Zepto.js源码学习之二
  • 工作中总结前端开发流程--vue项目
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 通过几道题目学习二叉搜索树
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 昨天1024程序员节,我故意写了个死循环~
  • ​Python 3 新特性:类型注解
  • ​ssh免密码登录设置及问题总结
  • #100天计划# 2013年9月29日
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (理论篇)httpmoudle和httphandler一览
  • (三)uboot源码分析
  • (杂交版)植物大战僵尸
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • *2 echo、printf、mkdir命令的应用
  • .java 9 找不到符号_java找不到符号
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .Net IE10 _doPostBack 未定义
  • .Net 中Partitioner static与dynamic的性能对比
  • .net2005怎么读string形的xml,不是xml文件。
  • .net连接MySQL的方法
  • //TODO 注释的作用
  • ::什么意思
  • @SuppressWarnings(unchecked)代码的作用
  • [ 蓝桥杯Web真题 ]-布局切换
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [04] Android逐帧动画(一)
  • [2669]2-2 Time类的定义
  • [4]CUDA中的向量计算与并行通信模式
  • [BT]小迪安全2023学习笔记(第29天:Web攻防-SQL注入)
  • [C/C++随笔] char与unsigned char区别