Python+Scrapy基于Hadoop的黑龙江旅游景点数据分析系统(源码+vue+hadoop+hive+部署文档+可视化大屏展示等)
💗博主介绍:✨全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,专注于Java/Python/小程序app/深度学习等计算机设计,主要对象是咱们计算机相关专业的大学生,希望您们都能前途无量!✨💗👇🏻 精彩专栏 推荐订阅👇🏻计算机毕业设计设计精品实战案例✅黑龙江旅游景点数据分析系统旨在通过收集和分析游客数据,优化旅游资源管理和提升游客体验。系统综合运用地理信息系统(GI
收藏关注不迷路!!
🌟文末获取源码+数据库🌟
感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
前言
💗博主介绍:✨全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,专注于Java/Python/小程序app/深度学习等计算机设计,主要对象是咱们计算机相关专业的大学生,希望您们都能前途无量!✨💗
👇🏻 精彩专栏 推荐订阅👇🏻
计算机毕业设计设计精品实战案例✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
详细视频演示
文章底部名片,联系我看更详细的演示视频
项目介绍
黑龙江旅游景点数据分析系统旨在通过收集和分析游客数据,优化旅游资源管理和提升游客体验。系统综合运用地理信息系统(GIS)、大数据分析、云计算等技术,系统内容主要有用户、周边住宿、周边美食、美食分类、黑龙江景点、系统管理、个人资料等。
本论文将总体分析黑龙江旅游景点数据分析系统需求,再从不同角度分析具体功能需求,运用python相关技术,采用MySQL数据库,讨论如何设计并实现一个黑龙江旅游景点数据分析系统。分析和设计主要从管理员和用户个角色上展开研究,介绍了各个功能模块的实现,并通过系统测试对黑龙江旅游景点数据分析系统进行调试,将各个功能的测试结果与期望设计进行逐一比对,找出BUG和欠缺之处,从而进一步优化改进系统。
本套基于python黑龙江旅游景点数据分析系统的设计与实现,希望能让用户通过互联网得到方便而快捷的系统管理体验,在此基础的同时提高工作效益。
技术介绍
开发语言:Python
python框架:Django
软件版本:python3.7/python3.8
数据库:mysql 5.7或更高版本
数据库工具:Navicat11
开发软件:PyCharm/vs code
前端框架:vue.js
功能介绍
黑龙江旅游景点数据分析系统将从需求和现状中进行分析,使得本系统的设计实现具有可使用的价。做出一个实用性好的黑龙江旅游景点数据分析系统,使其能满足用户的需求,并可以让用户更方便快捷地了解黑龙江旅游景点数据分析系统信息。黑龙江旅游景点数据分析系统的设计开发,目的主要是为了简化黑龙江旅游景点数据分析系统信息的管理过程,使管理员更好地完成工作,在工作中实现高效快捷的管理效率。
本文从黑龙江旅游景点数据分析系统的实际需要出发,为降低系统的耦合性,完成了系统总体架构的设计,以提高系统的重用性、可适用性及可维护性。系统包括管理员和用户两个角色;
核心代码
# 数据爬取文件
import scrapy
import pymysql
import pymssql
from ..items import LvyoujingdianItem
import time
import re
import random
import platform
import json
import os
import urllib
from urllib.parse import urlparse
import requests
import emoji
# 旅游景点
class LvyoujingdianSpider(scrapy.Spider):
name = 'lvyoujingdianSpider'
spiderUrl = 'https://you.ctrip.com/sight/lanzhou231/s0-p{}.html'
start_urls = spiderUrl.split(";")
protocol = ''
hostname = ''
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def start_requests(self):
plat = platform.system().lower()
if plat == 'linux' or plat == 'windows':
connect = self.db_connect()
cursor = connect.cursor()
if self.table_exists(cursor, '5295r_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 plat == 'windows_bak':
pass
elif plat == 'linux' or plat == 'windows':
connect = self.db_connect()
cursor = connect.cursor()
if self.table_exists(cursor, '5295r_lvyoujingdian') == 1:
cursor.close()
connect.close()
self.temp_data()
return
list = response.css('div.list_wide_mod2 div.list_mod2')
for item in list:
fields = LvyoujingdianItem()
if '(.*?)' in '''dt a::attr(href)''':
fields["laiyuan"] = re.findall(r'''dt a::attr(href)''', response.text, re.DOTALL)[0].strip()
else:
fields["laiyuan"] = self.remove_html(item.css('dt a::attr(href)').extract_first())
if '(.*?)' in '''div.leftimg a img::attr(src)''':
fields["fengmian"] = re.findall(r'''div.leftimg a img::attr(src)''', response.text, re.DOTALL)[0].strip()
else:
fields["fengmian"] = self.remove_html(item.css('div.leftimg a img::attr(src)').extract_first())
if '(.*?)' in '''div.rdetailbox dl dt a::text''':
fields["biaoti"] = re.findall(r'''div.rdetailbox dl dt a::text''', response.text, re.DOTALL)[0].strip()
else:
fields["biaoti"] = self.remove_html(item.css('div.rdetailbox dl dt a::text').extract_first())
if '(.*?)' in '''b.hot_score_number::text''':
fields["redu"] = re.findall(r'''b.hot_score_number::text''', response.text, re.DOTALL)[0].strip()
else:
fields["redu"] = self.remove_html(item.css('b.hot_score_number::text').extract_first())
if '(.*?)' in '''dd.ellipsis::text''':
fields["dizhi"] = re.findall(r'''dd.ellipsis::text''', response.text, re.DOTALL)[0].strip()
else:
fields["dizhi"] = self.remove_html(item.css('dd.ellipsis::text').extract_first())
if '(.*?)' in '''a.score strong::text''':
fields["pingfen"] = re.findall(r'''a.score strong::text''', response.text, re.DOTALL)[0].strip()
else:
fields["pingfen"] = self.remove_html(item.css('a.score strong::text').extract_first())
if '(.*?)' in '''a.recomment::text''':
fields["pinglun"] = re.findall(r'''a.recomment::text''', response.text, re.DOTALL)[0].strip()
else:
fields["pinglun"] = self.remove_html(item.css('a.recomment::text').extract_first())
if '(.*?)' in '''p[class="bottomcomment ellipsis open_popupbox_a"]''':
fields["dianping"] = re.findall(r'''p[class="bottomcomment ellipsis open_popupbox_a"]''', response.text, re.DOTALL)[0].strip()
else:
fields["dianping"] = self.remove_html(item.css('p[class="bottomcomment ellipsis open_popupbox_a"]').extract_first())
detailUrlRule = item.css('dt a::attr(href)').extract_first()
if self.protocol in detailUrlRule:
pass
elif detailUrlRule.startswith('//'):
detailUrlRule = self.protocol + ':' + detailUrlRule
else:
detailUrlRule = self.protocol + '://' + self.hostname + detailUrlRule
fields["laiyuan"] = detailUrlRule
yield scrapy.Request(url=detailUrlRule, meta={'fields': fields}, callback=self.detail_parse, dont_filter=True)
# 详情解析
def detail_parse(self, response):
fields = response.meta['fields']
try:
if '(.*?)' in '''<div class="baseInfoItem"><p class="baseInfoTitle">官方电话</p><p class="baseInfoText">(.*?)</p></div>''':
fields["gfdh"] = re.findall(r'''<div class="baseInfoItem"><p class="baseInfoTitle">官方电话</p><p class="baseInfoText">(.*?)</p></div>''', response.text, re.S)[0].strip()
else:
if 'gfdh' != 'xiangqing' and 'gfdh' != 'detail' and 'gfdh' != 'pinglun' and 'gfdh' != 'zuofa':
fields["gfdh"] = self.remove_html(response.css('''<div class="baseInfoItem"><p class="baseInfoTitle">官方电话</p><p class="baseInfoText">(.*?)</p></div>''').extract_first())
else:
fields["gfdh"] = emoji.demojize(response.css('''<div class="baseInfoItem"><p class="baseInfoTitle">官方电话</p><p class="baseInfoText">(.*?)</p></div>''').extract_first())
except:
pass
try:
if '(.*?)' in '''div[class="detailModule normalModule"]''':
fields["detail"] = re.findall(r'''div[class="detailModule normalModule"]''', response.text, re.S)[0].strip()
else:
if 'detail' != 'xiangqing' and 'detail' != 'detail' and 'detail' != 'pinglun' and 'detail' != 'zuofa':
fields["detail"] = self.remove_html(response.css('''div[class="detailModule normalModule"]''').extract_first())
else:
fields["detail"] = emoji.demojize(response.css('''div[class="detailModule normalModule"]''').extract_first())
except:
pass
return fields
# 去除多余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
,laiyuan
,fengmian
,biaoti
,redu
,dizhi
,pingfen
,pinglun
,dianping
,gfdh
,detail
)
select
id
,laiyuan
,fengmian
,biaoti
,redu
,dizhi
,pingfen
,pinglun
,dianping
,gfdh
,detail
from `5295r_lvyoujingdian`
where(not exists (select
id
,laiyuan
,fengmian
,biaoti
,redu
,dizhi
,pingfen
,pinglun
,dianping
,gfdh
,detail
from `lvyoujingdian` where
`lvyoujingdian`.id=`5295r_lvyoujingdian`.id
))
limit {0}
'''.format(random.randint(10,15))
cursor.execute(sql)
connect.commit()
connect.close()
数据库参考
--
-- Current Database: `pythonfu3slnz4`
--
/*!40000 DROP DATABASE IF EXISTS `pythonfu3slnz4`*/;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `pythonfu3slnz4` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
USE `pythonfu3slnz4`;
--
-- Table structure for table `19ec523m_hljjd`
--
DROP TABLE IF EXISTS `19ec523m_hljjd`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `19ec523m_hljjd` (
`id` bigint(20) NOT NULL DEFAULT '0' COMMENT '主键',
`addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`title` varchar(200) CHARACTER SET utf8 DEFAULT NULL COMMENT '标题',
`address` varchar(200) CHARACTER SET utf8 DEFAULT NULL COMMENT '地址',
`pic` varchar(200) CHARACTER SET utf8 DEFAULT NULL COMMENT '图片',
`hotnumber` double DEFAULT NULL COMMENT '热度',
`score` double DEFAULT NULL COMMENT '评分',
`commentcount` int(11) DEFAULT NULL COMMENT '评论条数',
`opentime` varchar(200) CHARACTER SET utf8 DEFAULT NULL COMMENT '开放时间',
`phone` longtext CHARACTER SET utf8 COMMENT '官方电话',
`info` longtext CHARACTER SET utf8 COMMENT '介绍',
`laiyuan` longtext CHARACTER SET utf8 COMMENT '来源'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `aboutus`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `aboutus` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`title` varchar(200) NOT NULL COMMENT '标题',
`subtitle` varchar(200) DEFAULT NULL COMMENT '副标题',
`content` longtext NOT NULL COMMENT '内容',
`picture1` longtext COMMENT '图片1',
`picture2` longtext COMMENT '图片2',
`picture3` longtext COMMENT '图片3',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='关于我们';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `aboutus`
--
LOCK TABLES `aboutus` WRITE;
/*!40000 ALTER TABLE `aboutus` DISABLE KEYS */;
INSERT INTO `aboutus` VALUES (1,'2024-04-23 13:47:21','关于我们','ABOUT US','当你设想门外是寒冷可怕的世界时,你还应该开门出去看看,是否真的如此。如果你有信心,你对前途就不犹豫了。如果你有勇气,你就不怕前途是否有困难或危险了每个人心中都应有两盏灯,一盏是希望的灯,一盏是勇气的灯。有了这两盏灯,我们就不怕海上的黑暗和风涛的险恶了。人的一生很像是在雾中行走。远远望去,只是迷蒙一片,辨不出方向和吉凶。可是,当你鼓起勇气,放下恐惧和怀疑,一步一步向前走去的时候,你就会发现,每走一步,你都能把下一步路看得清楚一点。“往前走,别站在远远的地方观望!”你就可以找到你的方向。','upload/aboutus_picture1.jpg','upload/aboutus_picture2.jpg','upload/aboutus_picture3.jpg');
/*!40000 ALTER TABLE `aboutus` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `config`
--
DROP TABLE IF EXISTS `config`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `config` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(100) NOT NULL COMMENT '配置参数名称',
`value` varchar(100) DEFAULT NULL COMMENT '配置参数值',
`url` varchar(500) DEFAULT NULL COMMENT 'url',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='配置文件';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `config`
--
LOCK TABLES `config` WRITE;
/*!40000 ALTER TABLE `config` DISABLE KEYS */;
INSERT INTO `config` VALUES (1,'picture1','upload/picture1.jpg',NULL),(2,'picture2','upload/picture2.jpg',NULL),(3,'picture3','upload/picture3.jpg',NULL);
/*!40000 ALTER TABLE `config` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `discusshljjd`
--
DROP TABLE IF EXISTS `discusshljjd`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `discusshljjd` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`refid` bigint(20) NOT NULL COMMENT '关联表id',
`userid` bigint(20) NOT NULL COMMENT '用户id',
`avatarurl` longtext COMMENT '头像',
`nickname` varchar(200) DEFAULT NULL COMMENT '用户名',
`content` longtext NOT NULL COMMENT '评论内容',
`reply` longtext COMMENT '回复内容',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='hljjd评论表';
/*!40101 SET character_set_client = @saved_cs_client */;
系统效果图
文章目录
目录
目录 III
第1章 绪论 1
1.1课题背景与意义 1
1.2国内外研究现状 1
1.3论文结构 2
第2章 相关技术和系统环境 3
2.1开发工具 3
2.2 Python语言简介 3
2.3 Django框架介绍 3
2.4 Vue.js框架 3
2.5 MySQL数据库 4
2.6 B/S结构 4
2.7 Hadoop介绍 4
2.8 Scrapy介绍 4
2.9 协同过滤算法 5
第3章 系统需求分析 6
3.1总体分析 6
3.2功能需求分析 6
3.3 系统可行性分析 7
3.3.1技术可行性 7
3.3.2经济可行性 7
3.3.3操作可行性 8
3.4系统流程分析 8
3.4.1 用户登录流程 8
3.4.2 系统操作流程 8
3.4.3修改信息流程 9
3.4.4输入信息流程 10
第4章 系统设计 11
4.1 功能模块设计 11
4.2 数据库设计 11
4.2.1 E-R模型结构设计 11
4.2.2 数据库逻辑设计 12
第5章 系统功能实现 19
5.1前台功能实现 19
5.1.1 首页页面功能实现 19
5.1.2个人中心页面 20
5.2管理员功能实现 21
第6章 系统测试 26
6.1 软件测试的意义 26
6.2 测试方法 26
总 结 28
参考文献 29
致 谢 I
源码获取
下方名片联系我即可!!
大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻
更多推荐
所有评论(0)