今年五一,是12年之后第一次达到5天长度的五一假期。尤其这一次我们是经历了一次疫情的冲击,在4月8号武汉解放之后,突然前面有一个五一的中长假在等待着我们,那一系列的数据会发生怎样的变化?在防控常态化的背景下,旅游业的复苏会呈现出怎样的一种局面?为更科学地进行评估,我们对北京、上海、成都、武汉等旅游热门景点评论数据进行来数据爬取。
用数据说话是数据分析的意义所在,同时也不要沉溺于数据,之前文章(Python揭秘为什么你看到的文字评论和图片都是最好的)已经讲过,你看到的数据可能也未必是真实的。
本篇推文将对热门景点的评论数据进行分析,文章将分三步走:
- 数据获取
- 数据处理
- 数据可视化分析
以下是具体步骤和代码实现:
数据获取
今天我们爬取对象为携程旅游网,通过对网址进行分析,发现一个特别有意思的地方,无论那个城市的景点,或者用户的那一页进行评论,URL都是一样的。我们对Request Payload进行分析,发现每一页的参数是有变化的,可以断定是通过改变这些参数来改变接口返回的结果。
分析明白了网页的规律,我们就来爬取数据吧,需要完整版数据的同学可以在公众号后台回复:五一数据。
核心代码
url ='https://sec-m.ctrip.com/restapi/soa2/12530/json/viewCommentList?_fxpcqlniredt=09031027111681987287'
UserAgent = getHeaders()
headers = {
'Content-type': 'application/json;charset=UTF-8',
'Origin': 'https://piao.ctrip.com',
'Referer': 'https://piao.ctrip.com/dest/t1412255.html',
'accept': '*/*',
"User-Agent":UserAgent}
df = pd.DataFrame(None)
try:
html = requests.post(url,headers=headers,data =json.dumps(data)).text
global test
test =json.loads(html)['data']
data=json.loads(html)['data']['comments']
data_len = len(data)
for i in range(data_len):
data_i =data[i]
df_temp = json_normalize(data_i)
df = df.append(df_temp)
except:
pass
数据结果
数据处理
对于获取的数据,需要进一步处理,以满足分析分析的需求,我们主要做的数据处理步骤如下:
- 删除重复项
- 删除不需要的列
- 处理不规范的数据格式
代码如下
import pandas as pd
base_data = pd.read_csv('hcdwy_Result_01.csv')
base_data =base_data.drop_duplicates()
base_data['date'] = base_data['date'].apply(lambda x : x.split(' ', 1 )[0])
base_data.drop(columns=["title",'videos','replyeditor'],inplace=True)
data_agg = base_data.groupby(['date']).agg({'id':'count'}).reset_index()
df_sv = data_agg.sort_values(['date'],axis = 0,ascending = True)
数据可视化分析
大量的数据只有通过可视化才能让人一目了然,可视化工具我们使用的为pyecharts,接下来我们将对热门城市景点的数据进行数据可视化分析。
北京八达岭长城
八达岭景区是全国文明风景旅游区示范点,以其宏伟的景观、完善的设施和深厚的文化历史内涵而著称于世,是举世闻名的旅游胜地。对北京八达岭长城进行可视化数据分析,我们可以看出因疫情影响,2月、3月份票数达到了低谷,随着国内疫情防控形势持续向好,4月份持续升高,但今年五一单量也不及疫情前五成。
核心代码
import pandas as pd
base_data = pd.read_csv('cc.csv')
base_data['date'] = base_data['date'].apply(lambda x : x.split(' ', 1 )[0])
base_data.drop(columns=["title",'videos','replyeditor'],inplace=True)
data_agg = base_data.groupby(['date']).agg({'id':'count'}).reset_index()
df_pr = data_agg.sort_values(['date'],axis = 0,ascending = True)
x_data = list(df_pr['date'])
y_data = list(df_pr['id'])
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.faker import Faker
c = (
Line()
.add_xaxis(x_data)
.add_yaxis("北京八达岭长城票数据统计", y_data, is_smooth=True)
# .add_yaxis("商家B", Faker.values(), is_smooth=True)
.set_series_opts(
areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
label_opts=opts.LabelOpts(is_show=False),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="Line-面积图"),
xaxis_opts=opts.AxisOpts(
axistick_opts=opts.AxisTickOpts(is_align_with_label=True),
is_scale=False,
boundary_gap=False,
),
)
.render("line_areastyle_boundary_gap.html")
)
上海海昌海洋公园
上海海昌海洋公园项目位于东海之滨滴水湖畔,地处长三角旅游核心目的地,海港、空港、铁路、公路、内河“五龙汇聚”。上海海昌海洋公园围绕海洋文化特色,分为人鱼海湾、极地小镇、冰雪王国、海底奇域、海洋部落五大主题区和富有特色的海洋主题度假酒店。从趋势图上来看,和北京八达岭长城是相似的,2月、3月份票数达到了低谷,五一订单量仅为3成左右。
核心代码
import pyecharts.options as opts
from pyecharts.charts import Line, Grid
from pyecharts.commons.utils import JsCode
import pandas as pd
base_data = pd.read_csv('Result_01.csv')
base_data['date'] = base_data['date'].apply(lambda x : x.split(' ', 1 )[0])
base_data.drop(columns=["title",'videos','replyeditor'],inplace=True)
data_agg = base_data.groupby(['date']).agg({'id':'count'}).reset_index()
df_pr = data_agg.sort_values(['date'],axis = 0,ascending = True)
x_data = list(df_pr['date'])
y_data = list(df_pr['id'])
x_data = x_data
y_data = y_data
background_color_js = (
"new echarts.graphic.LinearGradient(0, 0, 0, 1, "
"[{offset: 0, color: '#c86589'}, {offset: 1, color: '#06a7ff'}], false)"
)
area_color_js = (
"new echarts.graphic.LinearGradient(0, 0, 0, 1, "
"[{offset: 0, color: '#eb64fb'}, {offset: 1, color: '#3fbbff0d'}], false)"
)
c = (
Line(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js)))
.add_xaxis(xaxis_data=x_data)
.add_yaxis(
series_name="注册总量",
y_axis=y_data,
is_smooth=True,
is_symbol_show=True,
symbol="circle",
symbol_size=6,
linestyle_opts=opts.LineStyleOpts(color="#fff"),
label_opts=opts.LabelOpts(is_show=True, position="top", color="white"),
itemstyle_opts=opts.ItemStyleOpts(
color="red", border_color="#fff", border_width=3
),
tooltip_opts=opts.TooltipOpts(is_show=False),
areastyle_opts=opts.AreaStyleOpts(color=JsCode(area_color_js), opacity=1),
)
.set_global_opts(
title_opts=opts.TitleOpts(
title="上海海昌海洋公园门票",
pos_bottom="5%",
pos_left="center",
title_textstyle_opts=opts.TextStyleOpts(color="#fff", font_size=16),
),
xaxis_opts=opts.AxisOpts(
type_="category",
boundary_gap=False,
axislabel_opts=opts.LabelOpts(margin=30, color="#ffffff63"),
axisline_opts=opts.AxisLineOpts(is_show=False),
axistick_opts=opts.AxisTickOpts(
is_show=True,
length=25,
linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),
),
splitline_opts=opts.SplitLineOpts(
is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")
),
),
yaxis_opts=opts.AxisOpts(
type_="value",
position="right",
axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63"),
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(width=2, color="#fff")
),
axistick_opts=opts.AxisTickOpts(
is_show=True,
length=15,
linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),
),
splitline_opts=opts.SplitLineOpts(
is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")
),
),
legend_opts=opts.LegendOpts(is_show=False),
)
)
(
Grid()
.add(
c,
grid_opts=opts.GridOpts(
pos_top="20%",
pos_left="10%",
pos_right="10%",
pos_bottom="15%",
is_contain_label=True,
),
)
.render("beautiful_line_chart.html")
)
武汉黄鹤楼
黄鹤楼位于湖北省武汉市长江南岸的武昌蛇山之巅,濒临万里长江,是国家5A级旅游景区,“江南三大名楼”之一,自古享有“天下江山第一楼“和“天下绝景”之称。黄鹤楼是武汉市标志性建筑,与晴川阁、古琴台并称“武汉三大名胜”。从上图可以看出,武汉因疫情影响,黄鹤楼风景区并没有复苏的快速恢复的迹象,老百姓对外出游玩还是持有谨慎态度,并没有出现井喷的增长情况。
核心代码
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.faker import Faker
import pandas as pd
base_data = pd.read_csv('hhlResult_01.csv')
base_data['date'] = base_data['date'].apply(lambda x : x.split(' ', 1 )[0])
base_data.drop(columns=["title",'videos','replyeditor'],inplace=True)
data_agg = base_data.groupby(['date']).agg({'id':'count'}).reset_index()
df_pr = data_agg.sort_values(['date'],axis = 0,ascending = True)
x_data = list(df_pr['date'])
y_data = list(df_pr['id'])
c = (
Line()
.add_xaxis(x_data)
.add_yaxis(
"黄鹤楼门票",
y_data,
markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]),
)
.set_global_opts(title_opts=opts.TitleOpts(title="Line-MarkLine"))
.render("line_markline.html")
)
成都大熊猫繁育研究基地
成都大熊猫繁育研究基地是我国乃至全球知名的集大熊猫科研繁育、保护教育、教育旅游、熊猫文化建设为一体的大熊猫等珍稀濒危野生动物保护研究机构,从趋势分析图我们可以看到,恢复速度比较快,目前已恢复达到六成左右。
核心代码
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.faker import Faker
import pandas as pd
base_data = pd.read_csv('cdResult_01.csv')
base_data['date'] = base_data['date'].apply(lambda x : x.split(' ', 1 )[0])
base_data.drop(columns=["title",'videos','replyeditor'],inplace=True)
data_agg = base_data.groupby(['date']).agg({'id':'count'}).reset_index()
df_pr = data_agg.sort_values(['date'],axis = 0,ascending = True)
x_data = list(df_pr['date'])
y_data = list(df_pr['id'])
x_data = x_data
y_data =y_data
(
Line()
.set_global_opts(
tooltip_opts=opts.TooltipOpts(is_show=False),
xaxis_opts=opts.AxisOpts(type_="category"),
yaxis_opts=opts.AxisOpts(
type_="value",
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),
)
.add_xaxis(xaxis_data=x_data)
.add_yaxis(
series_name="成都大熊猫繁育研究基地",
y_axis=y_data,
symbol="emptyCircle",
is_symbol_show=True,
label_opts=opts.LabelOpts(is_show=False),
)
.render("basic_line_chart.html")
)
源码获取私信小编01获取