五一去长沙吃喝玩乐
前几天发表过一篇文章厦门不止鼓浪屿,得到了一些朋友的肯定,让我再写下其他城市。这两天又获取到了两份关于长沙的数据:长沙景点和长沙美食,之后进行了分析,如果有朋友想去长沙或者周边城市玩,要仔细看看喔。

导入库
1import pandas as pd 2import re 3import csv 4import json 5import requests 6import random 7 8# 显示所有列 9# pd.set_option('display.max_columns', None) 10 11# 显示所有行 12# pd.set_option('display.max_rows', None) 13 14# 设置value的显示长度为100,默认为50 15# pd.set_option('max_colwidth',100) 16 17# 绘图相关 18import jieba 19import matplotlib.pyplot as plt 20from pyecharts.globals import CurrentConfig, OnlineHostType 21from pyecharts import options as opts # 配置项 22from pyecharts.charts import Bar, Pie, Line, HeatMap, Funnel, WordCloud, Grid, Page # 各个图形的类 23from pyecharts.commons.utils import JsCode 24from pyecharts.globals import ThemeType,SymbolType 25 26import plotly.express as px 27import plotly.graph_objects as go 28
长沙景点
数据获取
长沙景点的数据获取方法和之前那篇关于厦门的文章是一样的,只是重新跑了一遍代码,具体过程不再阐述,感兴趣的朋友可以看之前的文章,爬取的字段:

-
中文名
-
英文名
-
攻略数
-
评价数
-
位置
-
排名
-
驴友占比
-
简介
具体的源代码如下:

最终数据有1152条,数据中绝大部分是长沙的景点数据,也有少量少量周边城市,比如:宁乡、浏阳等的数据,整体的数据前5行如下:

下面重点介绍数据分析的过程
整体情况
首先看看整体的数据情况:
1fig = px.scatter(changsha[:10], # 前10个 2 x="strategy", # 攻略数 3 y="comment", # 评论数 4 color="comment", # 颜色选取 5 size="comment", # 散点大小 6 hover_name="cn_title", 7 text="cn_title" # 显示文字 8 ) 9 10fig.update_traces(textposition='top center') # 文本顶部居中显示 11 12fig.show() 13

很显然:橘子洲、岳麓山、岳麓书院、太平老街排名靠前
排名靠前景点
看看排名靠前的景点是哪些?
1# 根据ranking排序取出前20名数据,排除ranking=0的数据,再取出前10数据 2 3changsha1 = changsha[changsha["ranking"] != 0].sort_values(by=["ranking"])[:20].reset_index(drop=True) 4changsha1.head(10) 5

通过排名我们发现:橘子洲(烟火、大桥、天心阁)、岳麓山(书院)、黄兴路步行街、马王堆汉墓遗址、湖南省博物馆,整体排名很靠前,深受游客们欢迎,具体看看排名前20的景点:

评论火爆景点
很多游客到了一个景点喜欢写评论,看下哪些景点获得大量的评论:
1changsha2 = changsha[changsha["comment"] != 0].sort_values(by=["comment"],ascending=False)[:10] 2 3# 绘图 4fig = px.scatter( 5 changsha2, 6 x="cn_title", 7 y="comment", 8 size="comment", 9 color="comment", 10 text="cn_title" 11) 12 13fig.update_traces(textposition="top center") 14 15fig.show() 16

攻略在手,旅游不愁
出门旅游之前最好还是做一份旅游攻略,看看提供攻略最多的前10景点是哪些:

如果我们考虑前20个景点的攻略数:

驴友占比
我们爬取到的驴友数据是百分比,类型是字符串类型,我们现在去掉%符号,取出左边的数值,如果没有则用0代替,方便最终画图,具体操作如下:
1# 去掉%取出左边数据 2changsha["lvyou_number"] = changsha["lvyou"].apply(lambda x:x.split("%")[0]) 3changsha["lvyou_number"] = changsha["lvyou_number"].astype(int) 4changsha.head() 5

取出排名前10的驴友占比景点:

景点介绍
获取到的abstract字段是用来描述景点的基本信息,可以用来制作词云图,具体处理过程如下:
1abstract_list = changsha["abstract"].tolist() 2 3# 1、分词 4jieba_name = [] 5for i in range(len(abstract_list)): 6 # seg_list只是一个generator生成器:<class 'generator'> 7 seg_list = jieba.cut(str(abstract_list[i]).strip(), cut_all=False) 8 # 对list(seg_list)中的每个元素进行追加 9 for each in list(seg_list): 10 jieba_name.append(each) 11 12# 2、去停用词 13# 创建停用词list 14def stopwordslist(filepath): 15 stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()] 16 return stopwords 17 18# 传入路径,加载去停用词 19stopwords = stopwordslist('/Users/peter/Desktop//nlp_stopwords.txt') 20 21stopword_list = [] 22for word in jieba_name: # jieba_name中的word不在停用词表中,且不是\t制表符 23 if word not in stopwords: 24 if word != "\t" and word != " " and word != "nan": 25 stopword_list.append(word) 26 27# 3、统计单词出现个数 28dic = {} 29number = 0 30 31for each in stopword_list: 32 if each in dic.keys(): 33 number += 1 34 dic[each] = number 35 else: 36 dic[each] = 1 # 不存在则结果为1 37 38# 4、字典转成json数据,绘制词云图需要 39tuple_list = [] 40for k,v in dic.items(): 41 tuple_list.append(tuple([k,v])) 42 43tuple_list[:20] 44

长沙美食
第二部分介绍的是长沙(附近部分长沙)的美食,接下来从3个方面介绍:
-
字段获取
-
数据保存及处理
-
美食数据分析
发送请求
1url = "https://travel.qunar.com/p-cs300022-changsha-meishi?page=1" 2 3headers = {"user-agent": "个人请求头"} 4 5response = requests.get(url=url,headers=headers) 6result = response.content.decode() 7
字段获取
-
名称cn_title
-
评分socre
-
均价person_avg
-
地址address
-
推荐菜recommand
-
评价comment

1、源码结构
网页显示每页有10个景点(最后页未必是10个),总共200页的数据,每个景点的信息包括在一个<li></li>标签对中,我们只需要从标签中获取到相应的信息即可


2、名称和评分两个字段的获取相对简单,直接通过正则表达式来获取,关键字定位需要准确(以后会详细详解正则表达式的使用)

1# 中文名 2cn_title = re.findall('cn_tit">(.*?)</span>.*?countbox',result,re.S) 3

1# 得分:没有得分用--表示 2score = re.findall('cur_score">(.*?)</span>.*?total_score',result,re.S) 3

3、关于剩下4个字段的获取,相对复杂。因为他们并不是在每个店的信息中存在,有的,但是他们有一个共同点:全部是隐藏一个<div></div>标签对中,而且每个字段都有自己的关键词


具体处理方法:先大后小
1、先整体:提取sublistbox下面的全部信息

2、从步骤1的信息进行判断,获取4个单独字段
1# 均价 2person_avg = [] 3 4for i in range(len(sublistbox)): 5 try: 6 if "均" in sublistbox[i]: # 如果均价存在 7 person_avg.append(re.findall('¥ (.*?)</dd></dl>',sublistbox[i],re.S) [0]) # 将解析出来的第一个字段放入列表中 8 else: # 否则,不存在的话,添加0 9 person_avg.append(0) 10 continue # 遇到报错继续往下执行 11 except: 12 person_avg.append(0) 13
剩下3个字段处理类似:
1address = [] 2 3for i in range(len(sublistbox)): 4 try: 5 if "址" in sublistbox[i]: # 关键词 6 address.append(re.findall('址.*?des_line">(.*?)</dd></dl>',sublistbox[i],re.S)[0]) 7 else: 8 address.append("无") 9 continue 10 except: 11 address.append("无") 12
1recommand = [] 2 3for i in range(len(sublistbox)): 4 try: 5 if "推荐菜" in sublistbox[i]: 6 recommand.append(re.findall('推荐菜.*?des_line">(.*?)</dd></dl>',sublistbox[i],re.S)[0]) 7 else: 8 recommand.append("无") 9 continue 10 except: 11 recommand.append("无") 12
1comment = [] 2 3for i in range(len(sublistbox)): 4 try: 5 if "desbox" in sublistbox[i]: # 关键词 6 comment.append(re.findall('.*?txt">(.*?)<span class="img_doublequote img_r">',sublistbox[i],re.S)[0]) 7 else: 8 comment.append("无") 9 continue 10 except: 11 comment.append("无") 12
4、上面是获取单页数据的解析过程,下面讲解如何获取200页的字段数据:
1# 中文名:得分字段类似 2cn_title_list = [] 3 4for i in range(1,201): 5 url = "https://travel.qunar.com/p-cs300022-changsha-meishi?page={}".format(i) 6 headers = {"user-agent": "请求头"} 7 response = requests.get(url=url,headers=headers) 8 result = response.content.decode() 9 cn_title = re.findall('cn_tit">(.*?)</span>.*?countbox',result,re.S) 10 for each in cn_title: 11 cn_title_list.append(each) 12 13cn_title_list 14
1# 均价字段:地址、推荐菜、评价类似 2# 某个字段不存在,用0或者无代替 3person_avg_list = [] 4 5for i in range(1,201): 6 url = "https://travel.qunar.com/p-cs300022-changsha-meishi?page={}".format(i) 7 headers = {"user-agent": ""} 8 response = requests.get(url=url,headers=headers) 9 result = response.content.decode() 10 11 # 1、先整体提取 12 sublistbox = re.findall('sublistbox">(.*?)</div>', result, re.S) 13 # 2、再局部提取 14 person_avg = [] 15 for i in range(len(sublistbox)): 16 try: 17 if "均" in sublistbox[i]: 18 person_avg.append(re.findall('¥ (.*?)</dd></dl>',sublistbox[i],re.S)[0]) 19 else: 20 person_avg.append(0) 21 continue 22 except: 23 person_avg.append(0) 24 25 for each in person_avg: 26 person_avg_list.append(each) 27 28 29# 地址 30address_list = [] 31 32for i in range(1,201): 33 url = "https://travel.qunar.com/p-cs300022-changsha-meishi?page={}".format(i) 34 headers = {"user-agent": "请求头"} 35 response = requests.get(url=url,headers=headers) 36 result = response.content.decode() 37 38 # 1、先整体提取 39 sublistbox = re.findall('sublistbox">(.*?)</div>', result, re.S) 40 # 2、再局部提取 41 address = [] 42 43 for i in range(len(sublistbox)): 44 try: 45 if "址" in sublistbox[i]: 46 address.append(re.findall('址.*?des_line">(.*?)</dd></dl>',sublistbox[i],re.S)[0]) 47 else: 48 address.append("无") 49 continue 50 except: 51 address.append("无") 52 53 for each in address: 54 address_list.append(each) 55 56address_list[:20] 57
获取全网数据
5、提取到每个字段后生成整体数据,并保存:
1# 1、生成数据 2 3df = pd.DataFrame({ 4 "中文名": cn_title_list, 5 "得分": score_list, 6 "均价": person_avg_list, 7 "地址": address_list, 8 "推荐菜": recommand_list, 9 "评价": comment_list 10}) 11# 2、保存数据 12# df.to_csv("长沙美食.csv",index=False,encoding='utf_8_sig') # 防止乱码 13

美食数据分析
前期处理
在进行数据分析之前,需要进行前期的处理:
1df["得分"] = df["得分"].apply(lambda x: x.replace("--","0")) # 将得分中的--替换成0 2
改变两字字段的数据类型:

长沙到底有几家文和友?
1、文和友是长沙的知名老店,那获取到的数据中有几家和文和友相关的店?
数据显示:20家

看看前5家:

2、哪家文和友得分最高?
我们看看前5名:
1fig = px.scatter( 2 wenheyou_score[:5], 3 x="中文名", 4 y="得分", 5 color="得分", 6 size="得分", 7 text="地址" 8) 9 10fig.update_traces(textposition="top center") 11fig.show() 12

可以看到:府中路的这家店是评分最高的,网友给的评价是:
虾肉很新鲜,口感嫩滑,入味极佳,个人觉得不是很辣,但是如果对于吃辣程度一般的人来说,绝对足够了。
臭豆腐香不香?
1、看看数据中有臭豆腐店
数据显示有19家,我们看看前5家店


2、臭豆腐的价格如何?
太平街21号的一份臭豆腐31块?不知道香不香!!!

3、整体臭豆腐店的分布,基于得分和均价两个字段
1px.scatter(choudoufou,x="得分",y="均价",color="中文名",size="均价") # 只筛选均价大于0 2

茶颜悦色好喝吗?
1、数据中几家茶颜悦色的店?
数据显示是10家,但是我想长沙肯定是不止10家!!!数据量还是太少了

2、茶颜悦色价格如何?
筛选出价格大于0的,我们:茶颜悦色的价格基本在17元左右
1chayanyuese[chayanyuese["均价"] > 0] 2

湖南人爱嗦粉
湖南人非常喜欢吃粉,尤其是常德的米粉非常出名
1、看看数据中有几家粉店?
数据显示有103家!!!果然湖南人爱嗦粉

2、查看得分排名前10的粉店
1`mifen.sort_values("得分",ascending=False).head(10) 2`

排名靠前的10位店价格基本上控制在14-15左右
3、米粉店整体分布
1px.scatter(mifen,x="得分",y="均价",color="中文名",size="均价") 2

4、店铺汇总
另外,查看数据发现,还有15家酒吧,28家火锅店,我们汇总下。数据量过少,仅供参考
1doors = pd.DataFrame({ 2 "数量":[19,18,9,103,15,28], 3 "名称":["文和友","臭豆腐","茶颜悦色","粉店","酒吧","火锅店"] 4}) 5 6doors = doors.sort_values("数量",ascending=False) 7 8c = ( 9 Bar() 10 .add_xaxis(doors["名称"].tolist()) 11 .add_yaxis("长沙店铺",doors["数量"].tolist()) 12 .reversal_axis() 13 .set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="right")) # 是否显示数据以及label的位置(显示在右方) 14) 15 16c.render_notebook() 17

网友推荐菜
对于网友的推荐菜,采用词云图展示:
1# 1、选择推荐菜数据 2rec = df[df["推荐菜"] != "无"].sort_values("得分",ascending=False).reset_index(drop=True) 3rec_list = rec["推荐菜"].tolist() 4 5# 2、jieba分词 6 7rec_jieba_list = [] 8 9for i in range(len(rec_list)): 10 # jieba分词 11 seg_list = jieba.cut(str(rec_list[i]).strip(), cut_all=False) 12 for each in list(seg_list): 13 rec_jieba_list.append(each) 14 15#3 3、通过pandas中的values来统计个数 16 17rec_result = pd.value_counts(rec_jieba_list)[1::].to_frame().reset_index().rename(columns={"index":"词语",0:"次数"}) 18 19# 4、生成绘图数据 20rec_words = [tuple(z) for z in zip(rec_result["词语"].tolist(), rec_result["次数"].tolist())] 21 22rec_words[:3] 23 24# 5、WordCloud模块绘图 25c = ( 26 WordCloud() 27 .add("", rec_words, word_size_range=[20, 100], shape=SymbolType.DIAMOND) 28 .set_global_opts(title_opts=opts.TitleOpts(title="长沙美食推荐菜词云")) 29) 30 31c.render_notebook() 32

总结
文章通过对两份数据获取和分析,数据量并不大,但还是想到长沙旅游的朋友几点建议:
1、橘子洲你应该去看看
从长沙景点数据分析中看出来,不管是整体排名、游客提供的攻略数、评论数,橘子洲都是排名第一的,可以在橘子洲大桥看烟火
2、五一广场真的很热门
五一广场整个片区很多吃喝玩乐的地方:太平老街、火宫殿、黄兴路步行街等,爱吃爱玩的你应该去
3、博物馆和遗址
如果喜欢历史,可以去湖南省博物馆、马王堆汉墓遗、长沙简牍博物馆址逛逛
4、不怕辣就吃龙虾
喜欢吃小龙虾的就去文和友吧,口味挺齐全的。推荐:海信广场店
5、一定要尝下湖南米粉
上面的数据已经显示了,大大小小的粉店在长沙太多了,到了长沙务必尝下,推荐:原味粉店家
一切看似逝去的,都不曾离开,你所给与的爱与温暖,让我执着地守护着这里。
-------------------********************************** End **********-------------**-----********-**********************************
往期精彩文章推荐:

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。
本文转自 https://mp.weixin.qq.com/s/kdkNOTowpXhE2iqNgXDHhg,如有侵权,请联系删除。
