本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

以下文章来源于Python技术 ,作者派森酱

前言

2020 注定是不平凡的一年,一开年就被新冠疫情来了当头一棒,一瞬间大家都不约而同的采取家里蹲策略,在政府的得力领导下,全部人民上下一条心,到了四五月份终于将疫情稳定控制住了,时隔半年,国内疫情早已趋于稳定,人们的生活也基本恢复正常。

恰逢国庆中秋两个节日重合,在家憋这么久的人们怎么能不出去看看祖国的大好河山。据新华网消息,整个国庆长假外出游玩人次达 6.37 亿人次,那么这么多人都到哪儿去玩了呢,今天我们就用 Python 做一个全国热门景区热点图。

整体思路

我们的思路是,在中国地图上标注出热门景点,通过该热点图我们可以一眼看出哪些城市和地区最热门,也就意味着那个地区人是最多的。

那么我们就必须获取到全国的旅游数据,最简单的思路就是从第三方旅游网站看下哪些景点的门票卖的最多最好,而最常用的网站就是飞猪、携程、去哪儿等。

有了数据来源之后就要想办法将网站的数据通过爬虫的方式爬取下来,之后再对爬取到的数据做清洗、过滤、整理。最后就将格式匹配的数据直接在地图上展示出来即可。

网站获取

经过对比几个第三方旅游网站,发现去哪儿网有一个「热门景点」的内页,在首页输入框直接输入「热门景点」即可直达该页面。该网站还将这些热门景点进行了分类,比如人文景观,城市风貌,古建筑等。同时我们需要的景点名称,城市,景区级别以及景区地址等信息都可以从该页面获取得到。

打开去哪儿网,首页输入「热门景点」仔细观察页面最上方的 URL 你会发现惊喜。其中 subject 就是景点主题,而 page 看样子则是页码,点击下一页验证一下,page 变成 2 了,没猜错。

不需要太多的数据,因此我们在每一个主题下面只取前十页的数据就可以了。

分析完 URL 之后,再来看看数据从什么地方获取的,切换到浏览器开发者模式,浏览下我们发现所有的景点数据都在一个叫做 ”search-list“ 的 div 中。针对单个景点,其数据是在一个 class = ‘sight_item’ 的 div 中。接下来就是解析页面原属,将景点,省市,时间,热度等数据做分析。

数据获取

数据源头已经分析完毕,接下来就可以开始我们的爬虫编码了,首先定义好我们的准备获取全国景点的主题。为了方便后续操作,我们可以将解析好的数据保存到 csv 文件中。

subjects = ['文化古迹', '自然风光', '农家度假', '游乐场', '展馆', '古建筑', '城市观光']excel_file = open('data.csv', 'w', encoding='utf-8', newline='')
writer = csv.writer(excel_file)
writer.writerow(['名称', '城市', '类型', '级别', '热度', '地址'])

其次我们需要一个下载网页内容的函数,该函数接受一个 URL 参数,之后返回该 URL 对应的网页内容,同时为了更真实的模拟浏览器请求,需要添加 Headers。

headers = {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36','accept-encoding': 'gzip, deflate, br','accept-language': 'zh-CN,zh;q=0.9,en;q=0.8','referer': 'https://piao.qunar.com/','cookie': 'xxxyyyzzz...'
}def get_page_html(url):try:response = requests.get(url, headers=headers)if response.status_code == 200:return response.textreturn Noneexcept RequestException:return None

获取到内容之后,我们还需要一个解析函数,该函数接收一个网页文本,然后将我们所需要的「名称, 城市, 类型, 级别, 热度, 地址」信息解析出来,并写入 csv 文件。

def parse_content(content, subject):if not content:return;soup = BeautifulSoup(content, "html.parser")search_list = soup.find(id='search-list')items = search_list.find_all('div', class_="sight_item")for item in items:name = item['data-sight-name']districts = item['data-districts']address = item['data-address']level = item.find('span', class_='level')level = level.text if level else ''star = item.find('span', class_='product_star_level')star = star.text if star else ''writer.writerow([name, districts, subject, level, star, address])

至此我们已经准备好,下载函数,解析函数,现在只需要直接遍历主题,拼接 URL 调用相关函数即可。为了防止被禁封 IP,每次请求之后让程序暂停 5 秒。

def get_data():for subject in subjects:for page in range(10):page = page + 1url = F'https://piao.qunar.com/ticket/list.htm?keyword=热门景点®ion=&from=mps_search_suggest&subject={subject}&page={page}&sku='print(url)content = get_page_html(url)parse_content(content, subject, url)time.sleep(5)if __name__ == '__main__':get_data()

最后执行 main 入口函数来运行程序,来看看我们搜集到的数据。

结果展示

获取到全国的旅游数据之后,就可以开始分析了。为了让操作方便,引入 pandas,先仔细看下我们的数据格式。首先热度一列里面含有中文,需要分割,其次因为热度数值是小数不方便操作,因此我们决定将热度扩大 1000 倍,因为是整体扩大了 1000 倍,因此并不会影响分析结果。

之后我们需要解析出该景点所在的城市。同样是分割字符串。同时因为还有一些地点是地图无法识别的,所以要去除。

data = []
with open('data.csv', 'r') as f:reader = csv.reader(f)header = next(reader)for row in reader:data.append(row)df_data = []
for row in data:city = row[1].split('·')[1]if city in ['保亭', '德宏', '湘西', '陵水', '黔东南', '黔南']:continuestar = row[4].split('热度')[1].strip()star = int(float(star) * 1000)df_data.append([row[0], city, row[3], star])df = pd.DataFrame(df_data, columns=['name', 'city', 'level', 'star'])

数据准备妥当,绘制热点图。

data = df.groupby(by=['city'])['star'].sum()
citys = list(data.index)
city_stars = list(data)data = [list(z) for z in zip(citys, city_stars)]
geo = (Geo().add_schema(maptype="china").add("热点图",    #图题data,type_=ChartType.HEATMAP,   #地图类型).set_series_opts(label_opts=opts.LabelOpts(is_show=False))  #设置是否显示标签.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_ = 5000),    #设置legend显示的最大值title_opts=opts.TitleOpts(title=""),   #左上角标题)
)geo.render_notebook()

从上图可以看出,东南沿海,北京周边以及云南四川是比较热门的地区。

再来看看 TOP 15 的热点旅游城市:

再来看看 TOP 10 的热点旅游景区:

总结

今天我们对去哪儿的国庆热门景点进行了抓取和分析,一整套流程下来还是涉及到不少东西。包括网站分析,数据抓取和清洗以及图标展示。尤其是网页元素分析,需要多点耐心。

分析结果也比较符合预期,风景建筑类地点比较多人想去,毕竟大城市的人天天待格子间,趁着长假多去户外呼吸呼吸新鲜空气,其次北京、上海、杭州、成都等大都市依然很受欢迎。

因为疫情,国庆节可以说是 2020 的第一个旅游黄金周了,就在国外还在为疫情苦苦发愁的时刻,我们的客运航运已经恢复的差不多了,同时为了刺激消费,各个地方政府接连发放各种优惠券,外出游玩的小伙伴们也算是奉旨出游,为我国经济增长贡献了自己的力量。

那么这个国庆节,你去哪浪了呢?

国庆长假游玩人次达6.37亿人次,这么多人都到哪儿去玩了呢?相关推荐

  1. 2021年北京旅游行业发展现状分析:接待旅游总人数达2.6亿人次,同比增长41.3%。[图]

    北京是全球拥有世界遗产最多的城市,是全球首个拥有世界地质公园的首都城市,截止2019年10月北京共有A级景区220个,其中3A级景区110个,占50.00%:4A级景区71个,占32.27%:2A级景 ...

  2. 春运浙江运送旅客量将达1.38亿人次 同比下降3.4%

    2019年浙江全省春运工作新闻发布会 张煜欢 摄 中新网杭州1月17日电(记者 张煜欢)记者17日从2019年浙江全省春运工作新闻发布会获悉,2019年春运从1月21日开始至3月1日结束,共计40天, ...

  3. 2021年中国医疗卫生机构数量达103.1万个,诊疗人次达85.3亿次[图]

    医疗卫生机构是依法成立的从事疾病诊断.治疗活动的卫生机构.医院.卫生院是我国医疗卫生机构的主要形式,此外,还有疗养院.门诊部.诊所.卫生所(室)以及急救站等,共同构成了我国的医疗卫生机构.医疗质量和医 ...

  4. 2021春节档票房超78亿元收官 总观影人次达1.6亿

    2月18日消息,根据灯塔专业版实时数据,截至2月17日22时,2021年春节档总票房累计超78亿,总观影人次1.6亿,累计场次285.8万,创中国影史春节档累计票房.人次新纪录. <唐人街探案3 ...

  5. 国庆6.37亿出游花费4665.6亿处于什么水平?哪个省市客流最大?收入最高?

    随着国内疫情的有效防控,当国庆遇上中秋,今年的双节假期,国人被压抑了大半年的出行欲望爆发了. 这个接待国内游客6.37亿人次,实现旅游收入4665.6亿元的大项目,你参加了吗? 据说过节的人群泾渭分明 ...

  6. 连续2年入不敷出,青云流血冲刺科创板:拟募资11.88亿,最近三年净亏4.37亿

    乾明 发自 凹非寺  量子位 报道 | 公众号 QbitAI 谋求国内上市多年,云服务商青云QingCloud,终于拉开IPO序幕. 4月7日晚,青云递交招股书,寻求科创板上市,已经获得受理. 招股书 ...

  7. 交通运输部:预计五一假期全国客运量2.65亿人次

    5月1日消息,据交通运输部介绍,预计五一假期全国铁路.公路.水路.民航发送的客运量将达2.65亿人次,日均5304万人次,基本恢复到2019年同期水平. 从时间分布来看,交通部预计假期首日将出现客流高 ...

  8. 互联网日报 | 4月27日 星期二 | 美团回应被立案调查;滴滴开通老年人打车400热线;百度App月活跃用户数达5.58亿

    ‍ ‍今日看点 ✦ 美团回应被立案调查:将积极配合监管调查,各项业务正常运行 ✦ 天猫成立上海中心,将在20多城市设立本地化运营团队 ✦ 滴滴开通老年人打车400热线,可电话呼叫出租车 ✦ 百度App ...

  9. 阿里云代理商:阿里云跨分部抵销前营收267.6亿元,跨分部抵销后营收207.57亿元,抵销后营收环比增长达17.37%。

    阿里云代理商聚搜云专业服务于阿里云ECS服务器采购.阿里云Ddos采购.阿里云waf采购.对象存储OSS.阿里云企业邮箱采购.阿里云国际站代理商.阿里云国际站充值.云安全中心(态势感知).阿里云高可用 ...

最新文章

  1. Collections 类
  2. ListView嵌套RecyclerView遇到的一些坑以及解决办法
  3. 蚂蚁金服CTO程立:AI尚不具备金融级的能力,开放是突破边界唯一出路
  4. 自动化机器学习(AutoML)之自动贝叶斯调参
  5. matlab生成均匀部分散点图,应用halton序列生成均匀散点图
  6. 【SQL那些事】事务
  7. 掌握ROMA Compose,报表清单不秃头
  8. Particle Filter Tutorial 粒子滤波:从推导到应用(三)
  9. 虚拟机本来有MySQL,后安装宝塔的MySQL导致MySQL不能启动报错
  10. linux下.so、.ko、.a的区别
  11. 锐捷破号破解流程笔记
  12. 我是高管,空降的第60天,被辞职了,惨惨惨
  13. linux中如何开启vnc服务端口,Linux下vnc配置及启动
  14. Airbnb放弃国内业务,转投外国怀抱?翅膀硬了吗?
  15. 希腊字母读音及科学方面应用
  16. 花开的地方在希尔的故乡,听着远古的战歌仿佛生在花开的地方
  17. LD、CD、VCD、SVCD、DVD、DVCD、HDCD
  18. 张亚勤功成身退,人生继续硬核
  19. 冷链生鲜配送路径规划【附源代码】
  20. 源代码安全检测工具PC_Lint与ITS4实例 zz

热门文章

  1. poj3278-分支限界法
  2. 基于RISC-V CH32V103的鼠标键盘摇杆手柄Joystick学习开发板--实例Eg3_KeyBoard
  3. uniapp实现微信手机号码登录注册注销(bug踩坑)
  4. Microsoft Access database engine 2010 (Chinese (Simplif... 您不能安装64位版本的Microsoft Access 2010 数据库引擎
  5. 【辞职理由】三十八条最好的辞职理由
  6. Dell PowerEdge R940解析:四路顶配服务器维护平民化
  7. 双硬盘系统有时不能正常启动,一段时间后又恢复正常?可能是固态掉盘了!
  8. MySQL 之 删除语句失败
  9. mac系统sourceTree链接阿里云code
  10. 《PMBOK 7》-概述