利用python爬取数据
import requests
import json
provinces=['广东','广西','湖南','湖北','山东','山西','陕西','江苏','浙江','安徽','江西','福建','台湾','河南','河北'
,'海南','甘肃','青海','贵州','四川','云南','内蒙古','宁夏','新疆','西藏','北京','天津','上海','重庆','香港','澳门']
for province in provinces:
for page in range(1,2):
res = requests.get('https://travelsearch.fliggy.com/async/queryItemResult.do?searchType='
'product&keyword={}&category=SCENIC&pagenum={}'.format(province,page))
res = json.loads(res.text)
datalist = res['data']['data']['itemProducts']['data']['list'][0]['auctions']
for i in datalist:
data = []
data.append(province)
itemId=i['fields']['itemId']
data.append(itemId)
title=i['fields']['title']
data.append(title)
cityName=i['fields']['cityName']
data.append(cityName)
comment=i['fields']['comment']
data.append(comment)
pc_Url=i['fields']['pc_url']
data.append(pc_Url)
soldRecent=i['fields']['soldRecent']
data.append(soldRecent)
soldRecentNum=i['fields']['soldRecentNum']
data.append(soldRecentNum)
sold365=i['fields']['sold365']
data.append(sold365)
discountPrice=i['fields']['discountPrice']
data.append(discountPrice)
Price = i['fields']['type']
data.append(type)
subTitle = i['fields']['subTitle']
data.append(subTitle)
shortInfo = i['fields']['shortInfo']
data.append(shortInfo)
Price = i['fields']['price']
data.append(Price)
itemTotalScore = i['fields']['itemTotalScore']
data.append(itemTotalScore)
h5_url = i['fields']['h5_url']
data.append(h5_url)
distance=i['fields']['distance']
data.append(distance)
longitude=i['fields']['longitude']
data.append(longitude)
latitude=i['fields']['latitude']
data.append(latitude)
if len(i['fields']['features'])>0:
text=i['fields']['features'][0]['text']
data.append(text)
else :
data.append(None)
featuresNew=i['fields']['featuresNew']
data.append(featuresNew)
if len(i['fields']['tagList'])>0:
tagList=i['fields']['tagList'][0]['text']
data.append(tagList)
else :
data.append(None)
titleTagInfos=i['fields']['titleTagInfos']
data.append(titleTagInfos)
trip_main_busness_type=i['trip_main_busness_type']
data.append(trip_main_busness_type)
data_all.append(data)
将数据导入EXCEL
data=pd.DataFrame(data_all)
data.columns=['province','itemId','title','cityName','comment','pc_url','soldRecent','soldRecentNum',
'sold365','discountPrice','type','subTitle','shortInfo','price','itemTotalScore',
'h5_url','distance','longitude','latitude','features','featuresNew','tagList',
'titleTagInfos','trip_main_busness_type']
data.to_excel("./旅游.xlsx")
数据如图:
清洗数据
之所以将数据保存入EXCEL,是方便数据供下阶段使用,不用再次在网上爬取数据,获取数据之后,必然得对数据进行清洗。
先导入必要的包和查看数据格式:
import pandas as pd
import numpy as np
data=pd.read_excel('旅游.xlsx')
print(data.info())
print(data.head())
数据格式如下:
进行清洗
# 去重
data.drop_duplicates(subset='itemId',inplace=True)
# 数据转换
def get_sold365(data):
if data is np.nan:
return np.nan
else:
data=str(data) # 记得转换为字符型
if "万" in data:
print(data)
return float(data[data.find('售')+1:data.find('万')]) * 10000
else:
return float(data[str(data).find('售')+1:data.find('笔')])
print(data['sold365'].apply(get_sold365))
研究的问题
- 哪些城市/省份的旅游选择最多?
- 哪些城市最受游客青睐?
- 最热门的景点
- 各省份的好评热门景点
- 很热门但是评分不好的景点
- 打折力度最大的景点
- 各级别景区的门票价格
哪些城市/省份的旅游选择最多?
使用漏斗图展示个城市的旅游选择情况:
count_top12=data['shortInfo'].value_counts()[0:12]
print(count_top12)
from pyecharts.charts import Funnel
from pyecharts import options as opts
funnel = Funnel().add('旅游选择',[list(z) for z in zip(count_top12.index, count_top12.values.astype(float))],
sort_='ascending',label_opts=opts.LabelOpts(position="inside")
).set_global_opts(title_opts=opts.TitleOpts(title='旅游选择最多的前12个城市',pos_bottom=True))
funnel.render("funnel.html")
结果如图:
接下来,计划使用地图展现各个省份的旅游选择情况:
注意:使用地图时,由于省份名称不得包括“省”,“市”字,需处理省份名称字段数据。
count_province = data['province'].value_counts()
province=[pro.replace('省','') for pro in count_province.index]
province=[pro.replace('市','') for pro in count_province.index]
from pyecharts.charts import Geo
geo=Geo(init_opts=opts.InitOpts(width='880px',height='600px'))
geo.add_schema(maptype='china')
geo.add('geo',[list(z) for z in zip(province,count_province.values.astype(float))])
geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(),title_opts=opts.TitleOpts(title='全国各省份旅游选择数量图'))
geo.render("geo.html")
结果如下:
由地图可知,西部的旅游选择总体上比东部的多。
哪些城市最受游客青睐
先分析一下售票情况
city_sale_top10=data.groupby('shortInfo')['soldRecentNum'].sum().sort_values(ascending=False)[0:10]
from pyecharts.charts import Bar
bar=Bar(init_opts=opts.InitOpts(width='880px',height='600px'))
bar.add_xaxis(list(city_sale_top10.index))
bar.add_yaxis('最近一个月售出门票数',list(city_sale_top10.values.astype(float)))
bar.set_global_opts(legend_opts=opts.LegendOpts(pos_top='5%'),title_opts=opts.TitleOpts(title='最近一个月售出门票Top10城市'))
bar.render('bar.html')
结果如下:
接下来是评分情况
city_score_mean=data[(data['itemTotalScore']>0)&(data['comment']>30)
].groupby('shortInfo')['itemTotalScore'].mean() #选取评论人数大于30且项目评分大于0的项目
print(city_score_mean)
from pyecharts.charts import WordCloud
wordcloud=WordCloud()
wordcloud.add('',[list(z) for z in zip(city_score_mean.index,city_score_mean.values.astype(float)*100)])
wordcloud.set_global_opts(title_opts=opts.TitleOpts(title='评分情况'))
wordcloud.render('word.html')
结果如下:
分数越高,字体就会越大。
由这部分分析可发现,虽然西部旅游选择比较多,但是游客比较热衷选择东部旅游景点,并且,对于东部旅游景点总体评分,高于西部旅游景点总体评分。
最热门的景点
hot_title=data.sort_values(by='soldRecentNum',ascending=False)[['title','soldRecentNum']][:10]
hot_bar=Bar(init_opts=opts.InitOpts(width='880px',height='600px',theme=ThemeType.ESSOS))
hot_bar.add_xaxis(list(hot_title['title']))
hot_bar.add_yaxis('',list(hot_title['soldRecentNum']))
hot_bar.set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=25))
)
hot_bar.set_global_opts(tooltip_opts=opts.TooltipOpts(is_show=True,axis_pointer_type='cross'))
hot_bar.render('hot_bar.html')
结果如下:
上海迪士尼度假区的最近一个月门票出售数量很高,约是门票出售数量第二高的灵隐飞来峰的三倍。
各省份的好评热门景点
def province_top1(data):
return data.head(1)
pro_top1=data.sort_values(by=['province', 'itemTotalScore', 'soldRecentNum'],ascending=False).groupby('province').apply(province_top1)[['title','soldRecentNum','itemTotalScore']].reset_index()
pro_top1.drop(columns='level_1',inplace=True)
pro_top1.to_excel('各省份的好评热门景点.xlsx')
结果如下:
热门但是评分不太高的景点
data_=data[(data['soldRecentNum']>100)&(data['itemTotalScore']<4.8)&(data['itemTotalScore']>0)][['shortInfo', 'title', 'soldRecentNum', 'itemTotalScore']]
data_.to_excel('热门但是评分不太高的景点.xlsx')
结果如下:
打折力度最大的景点
data['discount']=np.round((1-(data['price']-data['discountPrice'])/data['price'])*10,2)
dis_data=data.sort_values(by='discount')[['shortInfo','title','price','discountPrice','discount']]
dis_data.to_excel("打折力度最大的景点.xlsx")
结果如下:
各级别景区的门票价格
level_data=data.groupby('tagList')['price'].mean()
bar_level=Bar()
bar_level.add_xaxis(list(level_data.index))
bar_level.add_yaxis("",list(np.round(level_data.values,2).astype(float)))
bar_level.render('bar_level.html')
由结果可见,星级越高,则平均门票价钱也越高。
文章在GitHub原文的代码上做了稍微修改,原文地址点击: LaborDay