💕💕Java项目
💕💕微信小程序项目
💕💕Android项目
💕💕Python项目
💕💕PHP项目
💕💕ASP.NET项目
💕💕Node.js项目
💕💕选题推荐
项目实战|基于python的内蒙古旅游景点数据分析与采集系统
1、选题背景
随着旅游业的快速发展和信息技术的广泛应用,游客对于获取旅游信息的需求日益增长,特别是在互联网平台上获取即时、准确、丰富的旅游信息成为游客的主要方式。内蒙古作为中国重要的旅游目的地,其景点众多且分布广泛。然而,目前缺乏一个系统化、智能化的工具来整合与分析这些景点数据,帮助游客更好地规划行程,同时也为旅游管理部门提供数据支持。因此,开发一个基于Python的内蒙古旅游景点数据可视化分析与采集系统显得尤为重要,它不仅可以自动采集并分析大量的旅游数据,还能通过直观的可视化展示,为用户和管理者提供决策依据。
2、研究目的和意义
本项目的主要目的是构建一个高效、智能的内蒙古旅游景点数据采集与可视化分析系统。通过Scrapy爬虫技术,系统能够自动从马蜂窝等旅游网站中获取与内蒙古景点相关的数据,并通过数据处理和清洗,确保数据的准确性和一致性。系统将这些数据存储在MySQL数据库中,并利用Echarts可视化框架生成各类统计图表,如用户年龄分布、性别比例、景点热度排行等。系统将这些数据通过一个基于Flask的Web平台展示给用户,提供旅游景点管理、周边住宿与美食推荐等功能,帮助游客做出更明智的旅游决策。
基于Python的内蒙古旅游景点数据可视化分析与采集系统的开发具有重要的现实意义,该系统通过自动化的数据采集与处理技术,提高了旅游数据的获取效率,减少了人工操作的繁琐与误差。系统的可视化分析功能能够直观地展示大量复杂的数据,帮助用户更好地理解旅游市场的动态与趋势。对旅游管理者来说,该系统还可以提供精准的数据支持,助力旅游业的发展与决策优化。总的来说,该系统不仅满足了当前市场对旅游信息智能化、数据化的需求,还为未来旅游信息化的发展提供了有力的参考与实践经验。
3、系统功能设计
本文研究基于Python的内蒙古旅游景点数据可视化分析与采集系统的设计与实现过程,系统需求分析部分将详细探讨用户需求和系统功能需求,明确该系统的主要功能模块,包括数据采集模块、数据处理与清洗模块、数据存储模块、以及数据可视化与分析模块。数据采集模块使用Scrapy爬虫技术从马蜂窝网站自动抓取内蒙古旅游景点相关数据,如景点名称、位置、用户评论、浏览次数、体验数量等信息。数据处理与清洗模块则负责对采集到的数据进行清洗与标准化处理,以确保数据的准确性和一致性。
接着本文将详细描述系统架构的设计与实现,特别是在使用Python与Flask进行后端开发的过程中如何高效地处理与存储大规模数据。MySQL数据库将用于存储内蒙古旅游景点的数据信息,确保数据的安全与可扩展性。系统将利用Echarts可视化框架,通过大屏展示用户年龄分布、性别统计、体验数量、旅游地点分布、浏览次数区间以及景点TOP10等信息,从而帮助用户更直观地理解旅游数据的分布与趋势。
最后本文将探讨系统的功能实现与测试,包括登录系统、旅游景点管理、周边住宿与美食信息的展示与管理等功能模块的具体实现过程。论文还将对系统的性能进行评估与优化,确保系统在处理大量数据时的稳定性与响应速度。同时,研究内容还涵盖了系统在实际应用中的可扩展性与未来发展方向,包括如何通过引入更多的数据源和高级分析算法,进一步提升系统的智能化与实用性。通过该研究,旨在为内蒙古旅游行业的数据分析与应用提供一个具有实际意义的技术参考和实现方案。
4、系统页面设计
如需要源码,可以扫取文章下方二维码联系咨询
5、参考文献
[1]简易,林岩,张书涵.基于POI数据的徐州市旅游景点空间分布特征及影响因素研究[J].智能建筑与智慧城市,2024,(06):36-39.DOI:10.13655/j.cnki.ibci.2024.06.010.
[2]李卫帆,刘晓静,毛磊,等.数据赋能特色旅游终端卷烟营销能力分析[J].财经界,2024,(13):57-59.DOI:10.19887/j.cnki.cn11-4098/f.2024.13.053.
[3]黄正鹏,马欣,陈雪,等.基于线性回归算法对多彩贵州旅游数据的分析及应用[J].软件工程,2024,27(03):63-66.DOI:10.19644/j.cnki.issn2096-1472.2024.003.013.
[4]丁宇阳,胡涵,王莹露,等.基于区块链技术的旅游服务及可视化分析系统设计[J].长江信息通信,2024,37(02):166-169.DOI:10.20153/j.issn.2096-9759.2024.02.050.
[5]梁旭楷,周尚武,杨曦.基于大数据技术的黔东南旅游可视化研究与应用[J].旅游纵览,2024,(01):80-82.
[6]邱奕超,张驰庚.旅游大数据的可视化设计和实现方法[J].信息与电脑(理论版),2023,35(17):120-123.
[7]范路桥,高洁,段班祥.基于Python+Flask+ECharts的国内热门旅游景点数据可视化系统[J].现代电子技术,2023,46(09):126-130.DOI:10.16652/j.issn.1004-373x.2023.09.024.
[8]李翔宇,李文凯,霍世童.基于数据可视化的酒店信息共享和分析平台的设计与开发[J].软件,2023,44(04):68-70.
[9]周倩.基于知识图谱的多元数据可视化方法[J].信息记录材料,2023,24(04):146-148.DOI:10.16009/j.cnki.cn13-1295/tq.2023.04.031.
[10]李慧斯,黄金钰,吴培超,等.基于Neo4j知识图谱的周边游热点分析——以茂名市为例[J].数字技术与应用,2022,40(11):58-60.DOI:10.19695/j.cnki.cn12-1369.2022.11.19.
[11]孙楚栋,王业.基于Python的旅游数据可视化应用[J].电脑编程技巧与维护,2022,(11):100-103.DOI:10.16184/j.cnki.comprg.2022.11.018.
[12]张乐,孙怡芳.基于Python的运城旅游数据可视化分析[J].计算机时代,2022,(10):85-88.DOI:10.16644/j.cnki.cn33-1094/tp.2022.10.021.
[13]刘建义,夏换,周洁.基于文本挖掘的后疫情时期民众诉求主题研究[J].计算机时代,2022,(10):77-80.DOI:10.16644/j.cnki.cn33-1094/tp.2022.10.019.
[14]赵赟.黎里古镇智慧旅游大数据汇聚及可视化平台建设探索[J].广播电视网络,2022,29(09):28-30.DOI:10.16045/j.cnki.catvtec.2022.09.030.
[15]操心慧,操金金,许丽娟,等.大数据可视化在城市规划中的应用[J].现代计算机,2022,28(16):77-83+110.
[16]张英伟,温守东,胡宇航,等.大数据视角下高职院校数据治理方案探究[J].河北旅游职业学院学报,2022,27(02):72-76.
[17]杨雯丽.基于语境感知的旅游推荐研究及实现[D].上海师范大学,2022. DOI:10.27312/d.cnki.gshsu.2022.001660.
[18]吴昊,谢玲玲,郭威.地区旅游经济发展动态可视化系统设计[J].自动化技术与应用,2022,41(05):180-183.DOI:10.20033/j.1003-7241(2022)05-0180-04.
[19]迟殿委.旅游酒店大数据分析平台的设计与实现[J].无线互联科技,2022,19(07):89-92+98.
[20]王涛,金钊,黄志鹏,等.国家自然科学基金区域创新发展联合基金管理数据可视化设计研究[J].中国科学基金,2022,36(01):153-159.DOI:10.16262/j.cnki.1000-8217.2022.01.021.
6、核心代码
# # -*- coding: utf-8 -*-
# 数据爬取文件
import scrapy
import pymysql
import pymssql
from ..items import LvyoujingdianItem
import time
from datetime import datetime,timedelta
import datetime as formattime
import re
import random
import platform
import json
import os
import urllib
from urllib.parse import urlparse
import requests
import emoji
import numpy as np
import pandas as pd
from sqlalchemy import create_engine
from selenium.webdriver import ChromeOptions, ActionChains
from scrapy.http import TextResponse
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
# 旅游景点
class LvyoujingdianSpider(scrapy.Spider):
name = 'lvyoujingdianSpider'
spiderUrl = 'https://www.mafengwo.cn/gonglve/ziyouxing/list/list_page?mddid=12720&page={}'
start_urls = spiderUrl.split(";")
protocol = ''
hostname = ''
realtime = False
def __init__(self,realtime=False,*args, **kwargs):
super().__init__(*args, **kwargs)
self.realtime = realtime=='true'
def start_requests(self):
plat = platform.system().lower()
if not self.realtime and (plat == 'linux' or plat == 'windows'):
connect = self.db_connect()
cursor = connect.cursor()
if self.table_exists(cursor, '7y935m2h_lvyoujingdian') == 1:
cursor.close()
connect.close()
self.temp_data()
return
pageNum = 1 + 1
for url in self.start_urls:
if '{}' in url:
for page in range(1, pageNum):
next_link = url.format(page)
yield scrapy.Request(
url=next_link,
callback=self.parse
)
else:
yield scrapy.Request(
url=url,
callback=self.parse
)
# 列表解析
def parse(self, response):
_url = urlparse(self.spiderUrl)
self.protocol = _url.scheme
self.hostname = _url.netloc
plat = platform.system().lower()
if not self.realtime and (plat == 'linux' or plat == 'windows'):
connect = self.db_connect()
cursor = connect.cursor()
if self.table_exists(cursor, '7y935m2h_lvyoujingdian') == 1:
cursor.close()
connect.close()
self.temp_data()
return
data = json.loads(response.body)
html_text = data["html"]
resp = response.replace(body=html_text)
list = resp.css('div[class="item clearfix"]')
for item in list:
fields = LvyoujingdianItem()
if '(.*?)' in '''div.detail h3::text''':
try:
fields["biaoti"] = str( re.findall(r'''div.detail h3::text''', item.extract(), re.DOTALL)[0].strip())
except:
pass
else:
try:
fields["biaoti"] = str( self.remove_html(item.css('div.detail h3::text').extract_first()))
except:
pass
if '(.*?)' in '''div.img img::attr(src)''':
try:
fields["fengmian"] = str( re.findall(r'''div.img img::attr(src)''', item.extract(), re.DOTALL)[0].strip())
except:
pass
else:
try:
fields["fengmian"] = str( self.remove_html(item.css('div.img img::attr(src)').extract_first()))
except:
pass
if '(.*?)' in '''span.location''':
try:
fields["didian"] = str( re.findall(r'''span.location''', item.extract(), re.DOTALL)[0].strip())
except:
pass
else:
try:
fields["didian"] = str( self.remove_html(item.css('span.location').extract_first()))
except:
pass
if '(.*?)' in '''span.view''':
try:
fields["liulanshu"] = str( re.findall(r'''span.view''', item.extract(), re.DOTALL)[0].strip())
except:
pass
else:
try:
fields["liulanshu"] = str( self.remove_html(item.css('span.view').extract_first()))
except:
pass
try:
fields["laiyuan"] = 'https://www.mafengwo.cn'+ str(self.remove_html(item.css('a[class="_j_item"]::attr(href)').extract_first()))
except:
pass
if '(.*?)' in '''<span>(.*?)人体验过</span></div>''':
try:
fields["tiyanshu"] = str( re.findall(r'''<span>(.*?)人体验过</span></div>''', item.extract(), re.DOTALL)[0].strip())
except:
pass
else:
try:
fields["tiyanshu"] = str( self.remove_html(item.css('<span>(.*?)人体验过</span></div>').extract_first()))
except:
pass
if '(.*?)' in '''div.detail ul li::text''':
try:
fields["kandian1"] = str( re.findall(r'''div.detail ul li::text''', item.extract(), re.DOTALL)[0].strip())
except:
pass
else:
try:
fields["kandian1"] = str( self.remove_html(item.css('div.detail ul li::text').extract_first()))
except:
pass
if '(.*?)' in '''div.detail ul li:nth-child(2)::text''':
try:
fields["kandian2"] = str( re.findall(r'''div.detail ul li:nth-child(2)::text''', item.extract(), re.DOTALL)[0].strip())
except:
pass
else:
try:
fields["kandian2"] = str( self.remove_html(item.css('div.detail ul li:nth-child(2)::text').extract_first()))
except:
pass
yield fields
# 数据清洗
def pandas_filter(self):
engine = create_engine('mysql+pymysql://root:123456@localhost/spider7y935m2h?charset=UTF8MB4')
df = pd.read_sql('select * from lvyoujingdian limit 50', con = engine)
# 重复数据过滤
df.duplicated()
df.drop_duplicates()
#空数据过滤
df.isnull()
df.dropna()
# 填充空数据
df.fillna(value = '暂无')
# 异常值过滤
# 滤出 大于800 和 小于 100 的
a = np.random.randint(0, 1000, size = 200)
cond = (a<=800) & (a>=100)
a[cond]
# 过滤正态分布的异常值
b = np.random.randn(100000)
# 3σ过滤异常值,σ即是标准差
cond = np.abs(b) > 3 * 1
b[cond]
# 正态分布数据
df2 = pd.DataFrame(data = np.random.randn(10000,3))
# 3σ过滤异常值,σ即是标准差
cond = (df2 > 3*df2.std()).any(axis = 1)
# 不满⾜条件的⾏索引
index = df2[cond].index
# 根据⾏索引,进⾏数据删除
df2.drop(labels=index,axis = 0)
# 去除多余html标签
def remove_html(self, html):
if html == None:
return ''
pattern = re.compile(r'<[^>]+>', re.S)
return pattern.sub('', html).strip()
# 数据库连接
def db_connect(self):
type = self.settings.get('TYPE', 'mysql')
host = self.settings.get('HOST', 'localhost')
port = int(self.settings.get('PORT', 3306))
user = self.settings.get('USER', 'root')
password = self.settings.get('PASSWORD', '123456')
try:
database = self.databaseName
except:
database = self.settings.get('DATABASE', '')
if type == 'mysql':
connect = pymysql.connect(host=host, port=port, db=database, user=user, passwd=password, charset='utf8')
else:
connect = pymssql.connect(host=host, user=user, password=password, database=database)
return connect
# 断表是否存在
def table_exists(self, cursor, table_name):
cursor.execute("show tables;")
tables = [cursor.fetchall()]
table_list = re.findall('(\'.*?\')',str(tables))
table_list = [re.sub("'",'',each) for each in table_list]
if table_name in table_list:
return 1
else:
return 0
# 数据缓存源
def temp_data(self):
connect = self.db_connect()
cursor = connect.cursor()
sql = '''
insert into `lvyoujingdian`(
id
,biaoti
,fengmian
,didian
,liulanshu
,laiyuan
,tiyanshu
,kandian1
,kandian2
)
select
id
,biaoti
,fengmian
,didian
,liulanshu
,laiyuan
,tiyanshu
,kandian1
,kandian2
from `7y935m2h_lvyoujingdian`
where(not exists (select
id
,biaoti
,fengmian
,didian
,liulanshu
,laiyuan
,tiyanshu
,kandian1
,kandian2
from `lvyoujingdian` where
`lvyoujingdian`.id=`7y935m2h_lvyoujingdian`.id
))
'''
cursor.execute(sql)
connect.commit()
connect.close()