Fork me on GitHub

厦门真的不止鼓浪屿

厦门真的不止鼓浪屿

那就先来一张鼓浪屿的照片,笔者曾经带着朋友去鼓浪屿的日光岩(鼓浪屿最高峰)顶上拍摄的一张全景图。顶上的游客特别多,鼓浪屿、厦门标志性建筑世茂双子塔、厦门湾尽收眼底。的确是很美的😃

数据来源

本文中使用的数据是从一个网站上进行爬取的,具体过程详细解说。

爬取字段

总共爬取了6个字段,它们分别是:

  1. 中文名称cn_title
  2. 英文名称en_title
  3. 攻略strategy
  4. 点评comment
  5. 排名ranking
  6. 景点简介abstract

网页规律

1、进入网站:https://travel.qunar.com/p-cs299782-xiamen-jingdian-1-1,我们发现每页最多有10个景点,总共126页:

网页规律可以构造为:

1
2
for i in range(1,127):
url = "https://travel.qunar.com/p-cs299782-xiamen-jingdian-1-{}".format(i) # 网页规律

2、我们看看6个字段信息在源码中位置,右键单击,选择“检查”,在审查元素elements中找到每页的10个景点,其中每个<li></li>对代表一个景点。

3、看下每个字段的位置

通过下面的3幅图我们定位到了每个字段所在的位置。只有定位到了字段的位置,我们才能够进行解析出来。

下面我们将每个字段解析出来

导入相应库

爬取字段首先需要导入各种库,这些库主要的功能包含:

  • 发送网络请求requests
  • 正则解析数据re模块
  • json包处理Python字典类型数据
  • csv用于保存爬取到的数据
  • Pandas、numpy处理爬取的数据
  • plotly_express和pyecharts的绘图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pandas as pd
import numpy as np
import re
import csv
import json
import requests
import random

# 分词
import jieba

# 绘图
# import plotly.express as px 等同
import plotly_express as px
import plotly.graph_objects as go

from wordcloud import WordCloud # 词云图
import matplotlib.pyplot as plt
from plotly.graph_objects import Scatter,Bar

第一页数据请求

我们先看看第一页数据的请求,看下具体的源码

部分的网页数据如下:

匹配字段

下面是通过re模块的findall()使用正则表达式来匹配每个字段:

1、景点中文名称

有时候我们需要检查下每页的个数是否是10个,所以打印出来了长度,刚好是10个

2、景点英文名称

3、攻略数量

4、点评数量

5、景点排名

景点排名比较特殊,自己在爬取数据的时候发现有些景点是没有排名的,比如第16页的景点中,很多没有排名,需要特殊出来下。

在上面的代码中,如果景点的排名不存在,则用0代替:

6、景点简介

全网爬取

下面是爬取整个网站的源码,包含:

  • 网页URL构造
  • 发送请求,获取源码
  • 字段解析过程,特殊情况处理
  • 保存文件

数据处理

首先我们通过pandas来读取我们获取到的数据:

1
2
df = pd.read_csv("厦门景点.csv")
df.head() # 取出前5条数据

查看一下数据的长度和字段类型,以及是否有缺失值:

  • 可以发现3个字段是字符串类型:object
  • 另外3个字段是int64的类型

1
2
3
df.isnull().sum()  # 查看缺失值

# 结果显示:369个英文名缺失,1121个景点没有简介

中文名称cn_title

首先我们看看景点的名称(分析中文名称)。厦门是一个花园城市,整个岛上有很多的公园,我们从数据中看看厦门有多少公园:

  • str.contains():字符串包含函数
  • reset_index():pandas中的索引重排
1
2
3
4
# 1-多少个公园

park = df[df["cn_title"].str.contains("公园")].reset_index(drop=True)
park

结论:数据显示厦门岛内外总共有107个公园

我们将公园按照ranking字段进行排序,再看看具体是哪些公园比较受欢迎:

1
2
new_park = park[park["ranking"] != 0].sort_values(by=["ranking"]).reset_index(drop=True)
new_park[:20] # 取出前20个公园

从数据中看出来,排名前三的是:铁路文化公园、中山公园、五缘湾湿地公园

1、铁路文化公园:笔者去过一次,在金榜公园文凭路附近,是鹰厦(江西鹰潭到厦门)铁路的延伸线,还有陈旧的铁轨

2、中山公园:很多地方应该都有中山公园,纪念孙中山先生,在这里一般会举行很多的活动

3、五缘湾湿地公园:一提到五缘湾,就让人想到厦门的土豪们。五缘湾可以说是厦门的土豪区

还有白鹭洲公园,忠仑公园,岛外的天竺山森林公园等都是值得一去的地方。接下来我们看看厦门有哪些著名的街道

1
2
3
# 2-著名街道
street = df[df["cn_title"].str.contains("街")].reset_index(drop=True)
street.head(10)

数据中共有37条,我们取出前10条数据

中山路步行街真的是太火了:各种当地闽南小吃、奶茶、台湾特产,厦门标志性建筑-骑楼。每到节假日都是堵车,人山人海。

顶澳仔猫街也有很多人去。在厦门大学南门不远处,笔者去过几次。里面有个卖猫的小店,超级火🔥最后我们看看和大学相关的景点:

可以看到基本上厦门和学校相关的17个景点被3所高校承包了:

  • 厦门大学:中国最美的大学
  • 集美大学
  • 华侨大学

厦门大学以前游客是可以随意进出的。最近几年开始限制人数,而且还需要预约才能进校,所以想去厦门大学的小伙伴要提前预约喔

但是如果你有亲戚或者朋友在里面读书,听说可以带进去的喔😃偷偷告诉你。放一张厦门上弦场的照片,笔者曾经拍摄的。

景点排名ranking

我们直接通过景点的排名ranking来看看哪些景区受欢迎:

1
2
3
4
5
6
7
8
9
# 排除ranking=0的数据;排名升序排列;
# 取出前10个景点
ranking = df[df["ranking"] != 0].sort_values(by=["ranking"],ascending=True)[:20].reset_index(drop=True)

px.bar(ranking, # 传入的数据框
x="cn_title", # 横轴字段
y="ranking", # 纵轴字段
color="ranking" # 颜色显示字段
)

排名第一的果然是鼓浪屿😭。贝壳🐚梦幻世界、厦门海底世界、厦门大德记浴场、日光岩等都是鼓浪屿上的景点。所以鼓浪屿真的是非常火

其次就是厦门大学和旁边的南普陀寺,也是游客喜欢光顾的景点。前几年,厦门修建一个新的标志性建筑:世贸双子塔,也有很多游客去那边。

攻略数strategy

很多游客到了景点之后喜欢写一些旅游攻略供他人参考,我们看看热门景点的攻略数:

1
2
3
4
5
px.scatter(df,  # 绘图数据
x="cn_title", # 横纵轴
y="strategy",
color="strategy" # 颜色标记
)

结论:数据显示厦门大学是游客最喜欢写攻略的景点,其次是南普陀寺中山路步行街

点评数comment

我们再来看看游客们对景点的点评数;降序排列之后取出前20个景点,并显示前10条数据:

1
2
comment = df[df["comment"] != 0].sort_values(by=["comment"],ascending=False)[:20].reset_index(drop=True)
comment.head(10)

1
2
3
4
5
px.scatter(comment,  # 数据框
x="cn_title", # 横纵轴
y="comment",
color="comment" # 颜色
)

根据评论数comment和排名ranking,我们画出多图组合:

1
2
3
4
5
6
7
8
9
fig = px.scatter(comment,   # 数据框
x="ranking", # 横轴
y="comment", # 纵轴
color="ranking", # 颜色
marginal_y="violin", # y轴图形
marginal_x="box", # x轴图形
trendline="ols", # 趋势线
template="simple_white") # 模板
fig.show()

排名第一的果然还是鼓浪屿😭厦门大学、南普陀寺、中山路步行街等紧随其后。

简介abstract

最后我们分析下网站上对景点的简介。在这里我们使用的WordCloud来绘制词云图。首先将简介中的空值进行填充。

1
2
3
4
abstract = df.fillna(value="")  # 缺失值填充

abstract_list = abstract["abstract"].tolist() # 显示前10个简介
abstract_list[:10]

接下来我们使用jieba分词之后,再将每个分词追加到一个大的列表中:

1
2
3
4
5
6
7
8
9
jieba_list = []

for i in range(len(abstract_list)):
# jieba分词
seg_list = jieba.cut(str(abstract_list[i]).strip(), cut_all=False)
for each in list(seg_list):
jieba_list.append(each)

jieba_list[:10]

第一次:使用Wordcloud直接绘图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from wordcloud import WordCloud
import matplotlib.pyplot as plt

text = " ".join(i for i in jieba_list) # 待处理的字符串

# 先下载SimHei.ttf字体,放置到自己的某个目录下
font = r'/Users/peter/Desktop/spider/SimHei.ttf'

wc = WordCloud(collocations=False,
font_path=font, # 路径
max_words=2000,width=4000,
height=4000, margin=2).generate(text.lower())

plt.imshow(wc)
plt.axis("off")
plt.show()

wc.to_file('xiamen.png') # 把词云保存下来

从词云图中看出来,简介中:厦门和鼓浪屿是非常突出的。当然也有很多的无效词语,比如:位于、这里等,接下来我们使用去停用次表进行处理,停用词表是网上收集的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
### 使用去停用词再画一次:停用词表是自己收集的

# 创建停用词list
def StopWords(filepath):
stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
return stopwords

# 传入停用词表的路径
stopwords = StopWords('/Users/peter/Desktop/Publish/nlp_stopwords.txt')

stopword_list = []
for word in jieba_list:
if word not in stopwords:
if word != "\t" and word != " ":
stopword_list.append(word)

stopword_list[:10]

使用停用词表之后发现逗号等标点去掉了,很多没有价值的词语也被取消。接下来我们使用下面这张美女的图形作为背景图来绘制词云图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from os import path
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator

d = path.dirname('.') # 在ide中使用这段代码
# d = path.dirname(__file__)

# 传入新的词语列表
text = " ".join(i for i in stopword_list)

# https://www.deviantart.com/jirkavinse/art/Real-Life-Alice-282261010
alice_coloring = np.array(Image.open(path.join(d, "wordcloud.jpg")))

# 设置停用词
stopwords = set(STOPWORDS)
stopwords.add("said")

# 字体路径
font = r'/Users/peter/Desktop/spider/SimHei.ttf'

wc = WordCloud(background_color="white", font_path=font,
max_words=2000, mask=alice_coloring,
height=6000,width=6000,
stopwords=stopwords, max_font_size=40, random_state=42)

wc.generate(text)

image_colors = ImageColorGenerator(alice_coloring)

plt.imshow(wc.recolor(color_func=image_colors), interpolation="bilinear")
plt.axis("off")
plt.show()
wc.to_file('厦门.png') # 把词云保存下来

最终绘制出来的图形如下显示:

总结

本文通过从网上爬取的一份数据,对厦门的相关景点进行了分析,看看大家到厦门都喜欢去哪里:

  • 鼓浪屿真的太火了,基本上游客是必去的
  • 厦门大学片区的景点:厦门大学思明校区(芙蓉湖、芙蓉隧道、颂恩楼等)、旁边的南普陀寺、寺庙上面的五老峰
  • 如果你喜欢大海,喜欢骑行,去这里:厦大白城沙滩、演武大桥、环岛路、胡里山炮台、椰风寨
  • 如果你是个美食爱好者,你应该去:中山路步行街、曾厝垵、台湾小吃街
  • 如果你是个文艺小青年,沙坡尾艺术西区你不能错过

最后一句:厦门欢迎你!😃

本文标题:厦门真的不止鼓浪屿

发布时间:2021年01月18日 - 23:01

原始链接:http://www.renpeter.cn/2021/01/18/%E5%8E%A6%E9%97%A8%E7%9C%9F%E7%9A%84%E4%B8%8D%E6%AD%A2%E9%BC%93%E6%B5%AA%E5%B1%BF.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea