爬取3万景点,分析十一哪里人从众从人?

Aidan075
• 阅读 1254

作为一名普通上班族,每个星期都在无休止的上班(没准还加班)之中度过。几个月前一直心心念念的可就是这十一的“小长假”(还调班两天)。

朱小五这次爬取分析携程国内150个热点城市的景点数据,简单的分析一下哪些景点比较受欢迎。用来预计分析一下这个十一哪里最可能人从众从人?

让我们来分析一下。

获取数据

首先,我们来明确一下我们想要爬取的数据是哪些,这里为了方便起见,我们先以目前国内最热门的城市——杭州为例:

爬取3万景点,分析十一哪里人从众从人?

图中的景点名称,地址,评分,景区质量等级、点评数量就是我们本次要获取的数据。其中点评数量正是本次作为判断该景点是否人数会多的重要依据。

翻页即可发现页码变化的规律

爬取3万景点,分析十一哪里人从众从人?

这次采用requests+美丽的汤(BeautifulSoup)来爬取。

`def get_list(urls,city):` `data = []  
 for i in range(1,3):  
 #爬取n页  
 url = 'https://you.ctrip.com/sight/'+str(urls)+'/s0-p'+str(i)+'.html#sightname'  
 results = {}  
 doc = requests.get(url, headers=headers)  
 while (doc is None or doc == {'code': -460, 'msg': 'Cheating'}):  
 print('重新获取!')  
 time.sleep(random.random())  
 doc = restaurant(url)  

 soup = BeautifulSoup(doc.text, features='lxml')  

 list_wide_mod2 = soup.find_all('div', class_='list_wide_mod2')[0]  
 for each1, each2 in zip(list_wide_mod2.find_all('dl'), list_wide_mod2.find_all('ul', class_='r_comment')):  
 name = each1.dt.a.text  
 addr = each1.find_all('dd')[0].text.strip()  
 level = each1.find_all('dd')[1].text.strip().split('|')[0].strip()  
 if '携程' in level:  
 level = ''  
 try:  
 price = each1.find_all('span', class_='price')[0].text.strip().replace('¥', '')  
 except:  
 price = '0'  
 score = each2.find_all('a', class_='score')[0].text.strip().replace('\xa0分', '')  
 comments = each2.find_all('a', class_='recomment')[0].text.strip()[1: -3].replace('条', '')  
 results = [city, name, addr, level, price, score, comments]  
 data.append(results)  

 final_result = pd.DataFrame(data)  
 final_result.columns=['city', 'name', 'addr', 'level', 'price', 'score', 'comments']  
 final_result.to_csv("%s景点数据.csv"%city,encoding="utf_8",index = False)  
 return final_result`

依次爬取150个热门城市

汇总后就获得了3万余条景点数据。

爬取3万景点,分析十一哪里人从众从人?

数据分析

清洗填充一下。

def data_cleaning(data):  
    cols = data.columns  
    for col in cols:  
        if data[col].dtype ==  'object':  
            data[col].fillna('缺失数据', inplace = True)  
        else:  
            data[col].fillna(0, inplace = True)  
    return(data)

按照评论数量排序,筛选前20的景点。

#排序TOP20  
data['comments'] = data['comments'].astype('int')  
df = data.sort_values(by="comments",ascending=False)  
df.head(20)

爬取3万景点,分析十一哪里人从众从人?

以上这些景点城市是之前的热门,也是仍旧是这次十一最可能人挤人的地方,请注意。

详情数据分析报告请点击:

《国庆出去旅个游要过的关,比消消乐还多

数据可视化

首先我们将上面的Top20做个词云,更加直观地展示。

爬取3万景点,分析十一哪里人从众从人?

消费价格也是衡量景区的一个方面,所以打算区分一下景区的消费价格。

python中对列表以区间进行统计,可以使用下面这个方法:

from itertools import groupby  

lst = [1, 1, 1, 2, 3, 4, 4, 5, 5, 6, 7, 7, 7, 7, 8, 9, 9, 9, 10, 99, 99, 99, 100, 101]  
dic = {}  

for k, g in groupby(lst, key=lambda x: (x-1)//10):  
    dic['{}-{}'.format(k*10+1, (k+1)*10)] = len(list(g))  

print(dic)

爬取3万景点,分析十一哪里人从众从人?

根据得到的结果,我们可以绘制热门旅游景区消费价格区间分布饼图。

from matplotlib import pyplot as plt   

#调节图形大小,宽,高  
plt.figure(figsize=(5,8))  

#定义饼状图的标签,标签是列表  
labels = ['0-50元 ', '50-100元 ', '100-150元 ', '150-200元 ', '200及以上 ']  
#每个标签占多大  
sizes = [33660, 1542, 539, 289, 276]  
colors = ['red', 'orange', 'green', 'blue', 'gray', 'goldenrod']  

explode = (0, 0, 0, 0, 0.1)  

patches,l_text,p_text = plt.pie(sizes,explode=explode,labels=labels,colors=colors,  
                                labeldistance = 1.1,autopct = '%3.1f%%',shadow = False,  
                                startangle = 90,pctdistance = 0.6)  

plt.title(u'热门旅游景区消费价格区间分布', fontsize=20)  

for t in l_text:  
    t.set_size=(30)  
for t in p_text:  
    t.set_size=(50)  
# 设置x,y轴刻度一致,这样饼图才能是圆的  
plt.axis('equal')  
plt.legend()  
plt.show()

爬取3万景点,分析十一哪里人从众从人?

其实国内大部分的景点门票费用并不贵,我们旅途中花销最大的是车票+酒店。

国庆出去玩一趟,实在太难了,每一个国庆去热门景区洗礼过的朋友,都是抱着关关难过关关过的悲壮心态,努力留下几张美好的照片,多吃几口当地的美食,以安慰自己,这一趟,值得。

无论你选择家里蹲七天享受难得的闲暇,还是出去走走见识更大的世界,都祝你国庆七天,跟随本心,快快乐乐~


转载请尽量带上二维码或者结尾注明来源,谢谢了。

爬取3万景点,分析十一哪里人从众从人?


爬取3万景点,分析十一哪里人从众从人?

本文转转自微信公众号凹凸数据原创https://mp.weixin.qq.com/s/IVSyG-3Mc2AVq3i8vXQYAA,可扫描二维码进行关注: 爬取3万景点,分析十一哪里人从众从人? 如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Karen110 Karen110
3年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Aidan075 Aidan075
3年前
爬取3万景点,分析十一哪里人从众从人?
作为一名普通上班族,每个星期都在无休止的上班(没准还加班)之中度过。几个月前一直心心念念的可就是这十一的“小长假”(还调班两天)。朱小五这次爬取分析携程国内150个热点城市的景点数据,简单的分析一下哪些景点比较受欢迎。用来预计分析一下这个十一哪里最可能人从众从人?让我们来分析一下。获取数据首先,我们来明确一下我们想要爬取的数据是哪些,这里
Wesley13 Wesley13
3年前
4cast
4castpackageloadcsv.KumarAwanish发布:2020122117:43:04.501348作者:KumarAwanish作者邮箱:awanish00@gmail.com首页:
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这