vlambda博客
学习文章列表

今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!




大家好,我是才哥。

马上就要五一了,这两天五一的火车票也正式开抢了,不知道各位小伙伴有没有被秒光的车票吓到呢!?

然鹅,作为想去海南三亚旅行的才哥,简直是被这过万的单程机票给惊呆了啊!!

今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!
北京-三亚(五一票价)

看着只剩下过万价格的公务舱,想着今年这个去三亚的玩家也忒多了吧,那么三亚为啥如此具有吸引力呢?

怀着对三亚的好奇,我们今天用python爬取某程网三亚景区数据,就看看这个有着东方夏威夷的旅游城市都有什么好玩的吧!

1. 关于三亚

沙滩、海鲜、潜水是三亚度假的三大永恒主题。地处中国海南岛最南端的三亚,四季如夏,鲜花盛开,素有“东方夏威夷”之称,在三亚约两百公里的海岸线上,密布了亚龙湾、大东海、三亚湾等众多海湾,椰树成林;海上的有东、西两岛为碧波万顷的海面增加层次,互掩其中。蜈支洲岛享有“中国第一潜水基地”美誉,有中国保护最完好的生态珊瑚礁。

今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!
三亚

2. 景点数据爬取

本次我们从某程网爬取三亚的景点数据,使用requests+bs4+re+pandas进行数据请求、数据解析和预处理。

2.1. 爬取字段

  • 景区名称
  • 排名
  • 地址
  • 星级
  • 价格
  • 评分
  • 评价数
  • 推荐评价内容
今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!
爬取字段

2.2. 网页分析

for i in range(1,22):
    url = f'https://you.ctrip.com/sightlist/sanya61/s0-p{i}.html'
今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!
网页地址

2.3. 数据请求

我们直接使用requests.get(url)进行数据请求,发现返回码是404:

In [1]: requests.get(url)
Out[1]: <Response [404]>

经过简单的尝试,发现只要带上模拟浏览器请求头即可:

In [2]: import requests
     ...: 
     ...: headers = {
     ...:     "Accept-Encoding""Gzip",  # 使用gzip压缩传输数据让访问更快
     ...:     "User-Agent""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36",
     ...: }
     ...: 
     ...: url = f'https://you.ctrip.com/sightlist/sanya61/s0-p1.html'
     ...: resp = requests.get(url,headers=headers)

In [3]: resp.status_code
Out[3]: 200

In [4]: resp.text[:200# 预览部分数据
Out[4]: '\n<!DOCTYPE html>\n<html>\n    <head>\n        <meta name="viewport" content="width=1024">\n        <meta http-equiv="Cache-Control" content="no-siteapp " />\n        \n<title>三亚景点,三亚自助游景点,景区景点推荐【携程攻略】</titl'

2.4. 数据解析

本例我们采用bs4为主要解析工具,辅助re正则表达式处理。

引入需要的库:

import requests
from bs4 import BeautifulSoup
import re
import pandas as pd

查找景点数据所在节点:

先看需要的数据字段所在网页的节点位置,然后一一进行解析。我们发现每页全部景点所在都在一个节点下面,且每个景点都很整齐都在节点div(属性满足class="list_mod2")中。

html_doc = resp.text
soup = BeautifulSoup(html_doc, 'html.parser')
divs = soup.find_all('div',class_="list_mod2")
今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!
每页全部景点所在节点

单独解析每个景点的数据:

由于待爬取字段并非每个景点都存在,所以需要对可能不存在的字段在解析时候进行缺省异常的处理。

部分字段信息演示:

今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!
景区名称
今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!
评价数
景区名称 = div.dl.dt.a.text # 直接使用标签名获取节点名称或属性
try:
    排名 = re.findall('\d+',div.dl.dt.s.text)[0# 获取排名数字
except :
    排名 = ''
地址 = re.sub('\s','',div.find('dd',class_="ellipsis").text) # 去掉非字符内容
try:
    星级 = re.search(r'([a-zA-Z]+)',div.find_all('dd')[1].text).group()
except:
    星级 = ''
try:
    价格 = re.findall(r'(\d+)',div.find('span',class_="price").text)[0]# 获取价格数字
except:
    价格 = ''
try:
    评分 = div.ul.li.a.strong.text
except :
    评分 = ''
try:
    评价数 =  re.search(r'(\d+)',div.find('a',rel="nofollow").text).group() # 获取评价数数字
except :
    评价数 = 0

2.5. 数据转DataFrame类型

为了便于后续进行数据处理,这里将采集的数据全部转为DataFrame类型。

df = pd.DataFrame(columns=['景区名称''排名''地址''星级''价格''评分''评价数'])
item = {
    '景区名称':景区名称,
    '排名':排名,
    '地址':地址,
    '星级':星级,
    '价格':价格,
    '评分':评分,
    '评价数':评价数,
    }

df = df.append(item,ignore_index=True)
今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!
数据预览

注:完整爬虫代码在后台回复 0418 获取

3. 三亚景点盘点

在某程网我们一共爬取到315个景点,其中11个有星级的景区,在这11个星级景区中3个5A和8个4A。

3.1. 5A景区盘点

我们先看看5A景区都有哪些吧。

>>蜈支洲岛

蜈支洲岛的风景很好,岛上一派热带风光。这里海水能见度高,水下世界绚丽多彩,是我国热门的潜水胜地。同时,还是进行摩托艇、香蕉船、水上降落伞等水上活动的好地方。岛上的景点极具浪漫风情,有情人桥、观浪亭、观海长廊、“HAPPY LOVE”标志等。

除了美丽的风光,蜈支洲岛还有极具特色的别墅、木屋以及酒吧、海鲜餐厅等配套设施。蜈支洲岛珊瑚酒店及蜈支洲岛度假中心可提供住宿,但房间都比较抢手,需要提前预定。

如果住在岛上的话一定记得去观日岩看日出,那里是观日出的绝佳之地。

今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!

蜈支洲岛

>>南山文化旅游区

南山文化旅游区是我国有名的宗教与福寿文化景区,在这里既能欣赏山海自然美景,还可拜访众多佛教名胜、参观举世闻名的“南山海上观音”,获得佛教文化带来的心灵荡涤,体味回归自然本真的乐趣。

不二法门-南山寺-三十三观音堂-南山海上观音

今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!
南山海上观音

>>大小洞天

三亚大小洞天位于三亚市西部的南山山麓,这里融汇了秀丽的海景、山景和石景,可以看到“小洞天”、“海山奇观”、“仙人足”等摩崖石刻,还分布着许多株“不老松”,是国内独一无二的“寿比南山不老松”景观区。

来这里可选择乘坐电瓶车轻松游览景区。途中“老子望海”、“鉴真沐海”等天然奇石形象逼真,南山不老松、南海龙王别院等景点更是承载了浓厚的传统民俗文化底蕴。

今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!
南海福门

3.2. 最受欢迎的景点

我们以评价数多少评判景区受欢迎程度,发现蜈支洲岛也太火爆了点,高达3.18万评价数,当之无愧5A级景区最受欢迎的景点。此外,亚龙湾热带天堂森林公园天涯海角也超级受欢迎!

今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!
最受欢迎的景点

>>亚龙湾热带天堂森林公园:

亚龙湾热带天堂森林公园景区位于亚龙湾国家旅游度假区内,电影《非诚勿扰II》、电视剧《亲爱的,热爱的》在海南三亚的主要取景地,游客来三亚的必游地之一。园区定位于国际一流的滨海生态观光兼生态度假型森林公园,被专家美誉为第三代森林旅游产品的典范之作。园区内树木葱茏,能看那藤萝密布、溪水潺潺,可遇到那百年古藤、参天巨榕,能听闻虫唱鸟鸣,极尽野趣。景区内随处都可见《非诚勿扰II》、《亲爱的,热爱的》中的场景,舒淇、葛优、杨紫、李现走过素有情人桥之称的“过江龙索桥”,悬崖边的“峭壁天池”、见证浪漫爱情的《非诚勿扰II》里的试婚房、网红玻璃栈桥等,都是情侣们不可错过的打卡地。漫步天街,享受北纬18°天街慢生活,行走在全海景玻璃栈桥上将亚龙湾的美景尽收眼底,面朝大海,背靠青山,四季花开。

今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!
亚龙湾

>>天涯海角:

天涯海角位于三亚湾西端,是一片宁静美丽的海滩。海滩上耸立着许多形态各异的岩石,其中有名的是刻有“天涯”和“海角”两块巨石,它们一直被视为爱情的象征,也是三亚标志性的景观之一。

清雍正年间,当地官员程哲于命人在此镌刻了“天涯”二字,后又有文人在另一块巨石上题刻“海角”二字,从此就有了天涯海角这个景点。从古至今,关于“天涯海角”有太多的诗词和故事,这里使人们心中的“天涯情结”找到了物化的载体,寓意再遥远的地方我都会陪伴着你,到天涯、到海角。

景区除了“天涯石”和“海角石”,其他有名的石刻还有“南天一柱”和“日月石”,“南天一柱”象征财富,日月石象征着爱情。此外,景区的名人雕塑园、情侣树等特色景点也值得一看。

今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!
天涯海角-南天一柱

3.3. 综合评价最高的景点(评分+评价数)

我们以评价数归5化,和评分进行相加得到满分为10分的综合评价值。

df['综合评价'] = 5 * (df.评价数 / df.评价数.max())  + df.评分 
df.sort_values('综合评价',ascending=False).head(10)
今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!
综合评价最高

好吧,感觉还是这几个!!!这里,我们看看两个非星级景区都是什么样吧!

>>三亚千古情:

三亚千古情景区掩映在茂密的森林和鲜花丛中,有大型歌舞《三亚千古情》 、图腾大道、入口广场、爱情街、绣楼广场、崖州古街、千古情亲子乐园、清明上河图电影馆、戏水区、千古情广场、鬼域惊魂等数十个主题区。

今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!
三亚千古情

>>三亚亚特兰蒂斯失落的空间水族馆:

失落的空间水族馆,在这里,30个大小各异的互动展示池汇聚着数万尾海洋精灵,带你发掘壮丽的海中奇景。除了与它们近距离接触,你还可以在大使环礁湖乘坐底部透明的“水晶船”喂食它们;或潜入水中与鲨鱼、鳐鱼伙伴们深情共舞。同时也非常欢迎各位来到白鲸池与白鲸安迪与蒂娜嬉戏,一同度过这段难忘时光。

据说,这家酒店是海南最好酒店:亚特兰蒂斯酒店。一般来说,入住会附赠其娱乐项目!

三亚·亚特兰蒂斯坐落在风光旖旎的海棠湾,以消失的亚特兰蒂斯大陆之谜为蓝本匠心打造的海洋文化主题旅游度假目的地,融汇失落的空间水族馆、惊险刺激的水上冒险乐园、精品购物大道、C秀剧场及度假酒店于一身,充满神话色彩和无限精彩,成为亲子探秘之旅和休闲度假的明星打卡胜地。

今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!
三亚亚特兰蒂斯酒店

4. 游客游记数据抓取与词云

我这边选择的是行程天数3-5天、出发时间3-5月的全部游记共131页 1308篇。

4.1. 游记数据爬虫

爬虫也比较简单,先从遍历全部页码获取游记列表,再解析到每篇游记详情页url,最后在详情页解析游戏内容即可。

今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!
游记列表

代码如下:

  1. 解析每篇游记详情页url
 urls = []
 for i in range(1,132):
     url = f'https://you.ctrip.com/travels/sanya61/t2-p{i}-d2-m1.html'
     resp = requests.get(url,headers=headers)
     html_doc = resp.text
     soup = BeautifulSoup(html_doc, 'html.parser')
     a_s = soup.find_all('a',class_="journal-item cf")
     for a in a_s:
         urls.append('https://you.ctrip.com' + a['href'])
     
     print(f'{i}页数据已采集..')
  1. 获取游记文本数据详情
 contents = []
 for url in urls: 
     if 'sanya61' in url:
         resp = requests.get(url,headers=headers)
         html_doc = resp.text
         soup = BeautifulSoup(html_doc, 'html.parser')
         content = re.sub('\s+','\n',soup.find('div',class_="ctd_content").text)
         contents.append(content)
         print(f'{len(contents)}个有效游记已记录..')
今年五一北京到三亚的机票1万多??用Python扒一扒三亚都有啥子好玩嘛!!
游记预览

4.2. 游记关键字词云

在我们采集的1300余篇三亚的旅行游记中,词频最高的除了三亚之外,三亚的酒店似乎也备受大家关注,此外就是各大主要的景区聚集地(蜈支洲岛三亚湾亚龙湾大东海等等),接着就是经典的景点(天涯海角第一市场西岛等等)。

关于体验上,大家提到最多的必须是三亚的 沙滩海鲜等等),整体反馈都是不错喜欢!!

三亚游记词云

注:关于词云制作可以参考《》

以上就是本次全部内容,所以大家五一都打算去哪玩呀?

温馨提示:本文代码及数据回复 0418 即可领取!

--推荐阅读--

① 

② 

③ 

可以叫我才哥
学习分享Python小技巧,让工作更轻松
72篇原创内容
Official Account