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

简介: 本文介绍了一个基于Python Flask框架开发的旅游数据大屏系统,该系统集成了爬虫技术、数据库存储和ECharts数据可视化,提供了一个全面、实时更新的旅游信息展示平台,旨在提升旅游行业用户体验和决策效率。

背景

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

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

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

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

技术栈

flask框架

html+js+css

mysql8.0

pandas

echarts可视化

requests爬虫

前端设计

页面结构:

页面采用HTML5标准,包含了<!doctype html>声明,

、和等标签。
页面主要内容集中在标签内,包括头部(header)和主要内容区域。

样式和脚本:

标签内引入了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):
                        continue
                    line_clean.append(word)
                    all_words.append(str(word))
                contents_clean.append(line_clean)
            return contents_clean, all_words
        engine = 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).text
            soup = BeautifulSoup(res, 'lxml')
            dw = soup.find_all('li')
            for i in dw:
                try:
                    chengshi=j[1]
                    jingdian = i.find('div', class_="title").find('b').text
                    print(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 1
                    print(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,
    }]
};

最终效果:

相关文章
|
3天前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
94 68
|
3天前
|
数据采集 存储 数据库
Python中实现简单爬虫的入门指南
【10月更文挑战第22天】本文将带你进入Python爬虫的世界,从基础概念到实战操作,一步步指导你如何使用Python编写一个简单的网络爬虫。我们将不展示代码示例,而是通过详细的步骤描述和逻辑讲解,帮助你理解爬虫的工作原理和开发过程。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你打开一扇通往数据收集新世界的大门。
|
4天前
|
数据采集 Python
python爬虫抓取91处理网
本人是个爬虫小萌新,看了网上教程学着做爬虫爬取91处理网www.91chuli.com,如果有什么问题请大佬们反馈,谢谢。
20 4
|
2天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
10 1
|
2天前
|
JSON API 数据格式
构建RESTful APIs:使用Python和Flask
构建RESTful APIs:使用Python和Flask
10 1
|
4天前
|
关系型数据库 MySQL 数据处理
探索Python中的异步编程:从asyncio到异步数据库操作
在这个快节奏的技术世界里,效率和性能是关键。本文将带你深入Python的异步编程世界,从基础的asyncio库开始,逐步探索到异步数据库操作的高级应用。我们将一起揭开异步编程的神秘面纱,探索它如何帮助我们提升应用程序的性能和响应速度。
|
13天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
16 4
|
14天前
|
Web App开发 SQL 数据库
使用 Python 解析火狐浏览器的 SQLite3 数据库
本文介绍如何使用 Python 解析火狐浏览器的 SQLite3 数据库,包括书签、历史记录和下载记录等。通过安装 Python 和 SQLite3,定位火狐数据库文件路径,编写 Python 脚本连接数据库并执行 SQL 查询,最终输出最近访问的网站历史记录。
21 4
|
13天前
|
JSON API 数据格式
使用Python和Flask构建简单的RESTful API
【10月更文挑战第12天】使用Python和Flask构建简单的RESTful API
34 1
|
13天前
|
JSON API 数据格式
构建RESTful APIs:使用Python和Flask
【10月更文挑战第12天】本文介绍了如何使用Python和Flask构建一个简单的RESTful API。首先概述了API的重要性及RESTful API的基本概念,接着详细讲解了Flask框架的特性和安装方法。通过创建一个基本的Flask应用,定义了处理“图书”资源的GET、POST、PUT和DELETE方法的路由,展示了如何处理请求和响应,以及如何进行错误处理。最后,提供了运行和测试API的方法,总结了Flask在构建RESTful API方面的优势。
27 1