Fork me on GitHub

Python爬虫旅游-青岛站

Python爬虫游全国:青岛站

本文是全国城市旅游的第8站:从厦门、长沙、西安、大连、苏州、成都、兰州,到达了青岛。全文通过爬虫的方式从网上获取到两份数据:关于青岛的美食景点的数据,并且进行数据处理、可视化和统计分析。

青岛

来自维基百科关于青岛的简介,大家可以了解这个海滨城市:

青岛市,简称,旧称胶澳,别称琴岛岛城,是中华人民共和国山东省下辖的地级市,也是中国的副省级市计划单列市和区域中心城市,中国沿海重要中心城市和滨海度假旅游城市、国际性港口城市、国家历史文化名城山东半岛城市群青岛都市圈中心城市,青岛经济发达,在北方城市中,经济总量仅次于2个直辖市

数据采集

关于景点数据的爬取:

关于美食数据的爬取:

具体的爬虫方法和过程在之前的文章中有介绍,可以参考。

青岛景点

导入库

导入相关的库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import pandas as pd
import re

# 显示所有列
# pd.set_option('display.max_columns', None)

# 显示所有行
# pd.set_option('display.max_rows', None)

# 设置value的显示长度为100,默认为50
# pd.set_option('max_colwidth',100)

# 绘图相关
import jieba
import matplotlib.pyplot as plt
from pyecharts.globals import CurrentConfig, OnlineHostType # 事先导入,防止不出图
from pyecharts import options as opts # 配置项
from pyecharts.charts import Bar, Pie, Line, HeatMap, Funnel, WordCloud, Grid, Page # 各个图形的类
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType,SymbolType

数据基本信息

数据探索

In [3]:

1
df1.shape

Out[3]:

1
(1664, 8)

In [4]:

1
df1.isnull().sum()

Out[4]:

1
2
3
4
5
6
7
8
9
cn_title       0
en_title 661
strategy 0
comment 0
location 0
ranking 0
lvyou 0
abstract 1516
dtype: int64

在景点的英文名en_title和简介abstract中存在缺失值

In [5]:

1
df1.dtypes

Out[5]:

1
2
3
4
5
6
7
8
9
cn_title    object
en_title object
strategy int64
comment int64
location object
ranking int64
lvyou object
abstract object
dtype: object

景点位置分布

1
2
3
4
5
6
7
8
9
c = (
Pie(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
.add("", [list(z) for z in zip(df2["location"].tolist(), df2["number"].tolist())])
.set_global_opts(title_opts=opts.TitleOpts(title="青岛景点分布"),
legend_opts=opts.LegendOpts(pos_left="80%", orient="vertical"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)

c.render_notebook()

攻略数排名

1
2
3
4
5
6
7
8
9
10
c = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
.add_xaxis(df4["cn_title"].tolist()[::-1])
.add_yaxis("攻略数", df4["strategy"].tolist()[::-1])
.reversal_axis() # 翻转坐标轴
.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="right")) # 是否显示数据以及label的位置(显示在右方)
.set_global_opts(title_opts=opts.TitleOpts(title="青岛景点攻略数前10"))
)

c.render_notebook()

评论数comment前10

驴友占比

1
2
3
4
5
6
7
8
9
10
11
12
c = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.WALDEN))
.add_xaxis(df6["cn_title"].tolist())
.add_yaxis("", df6["lvyou_number"].tolist())
# .reversal_axis() # 翻转坐标轴
.set_series_opts(label_opts=opts.LabelOpts(is_show=True)) # 是否显示数据以及label的位置(显示在右方)
.set_global_opts(title_opts=opts.TitleOpts(title="青岛景点驴友占比"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-30)), # 设置旋转角度
)
)

c.render_notebook()

景点简介词云图

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
37
38
39
title_abstract = df1["cn_title"].tolist() + df1["abstract"].tolist()
title_abstract[:5]

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

# 创建停用词list

def stopwordslist(filepath):
stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
return stopwords

# 传入路径,加载去停用词
stopwords = stopwordslist('./nlp_stopwords.txt')

stopword_list = []
for word in rec_jieba_list: # jieba_name中的word不在停用词表中,且不是\t制表符
if word not in stopwords:
if word != "\t" and word != " " and word != "nan": # 几个特殊符号的排除
stopword_list.append(word)

# 2、使用停用词
result = pd.value_counts(stopword_list).reset_index()
result.columns = ["词语","次数"]

rec_words = [tuple(z) for z in zip(result["词语"].tolist(), result["次数"].tolist())]

c = (
WordCloud()
.add("", rec_words, word_size_range=[20, 80], shape=SymbolType.DIAMOND)
.set_global_opts(title_opts=opts.TitleOpts(title="青岛景点词云"))
)

c.render_notebook()

前100个高频词语:

青岛美食

数据基本信息

基本信息

In [3]:

1
2
3
# 1-数据缺失值

df.isnull().sum()

Out[3]:

1
2
3
4
5
6
7
中文名    0
得分 0
均价 0
地址 0
推荐菜 0
评价 0
dtype: int64

In [4]:

1
2
3
# 2、字段类型

df.dtypes

Out[4]:

1
2
3
4
5
6
7
中文名    object
得分 object
均价 int64
地址 object
推荐菜 object
评价 object
dtype: object

得分排名

分析哪些店的得分靠前

得分处理

In [5]:

1
2
3
# 得分中有未评分的数据:--

df["得分"].value_counts()

1
df["得分"] = df["得分"].astype(float)

店铺得分

1
2
3
4
5
6
7
8
9
10
11
12
c = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC))
.add_xaxis(df1["得分"].tolist())
.add_yaxis("", df1["次数"].tolist())
# .reversal_axis() # 翻转坐标轴
.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
.set_global_opts(title_opts=opts.TitleOpts(title="青岛美食店得分统计"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-30)), # 设置旋转角度
)
)

c.render_notebook()

高分店铺top10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
c = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK,
width="1000px",
height="600px"
))
.add_xaxis(df2["中文名"].tolist())
.add_yaxis("", df2["均价"].tolist())
# .reversal_axis() # 翻转坐标轴
.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
.set_global_opts(title_opts=opts.TitleOpts(title="青岛美食店5分前10名"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-16)), # 设置旋转角度
)
)

c.render_notebook()

均价处理

依据不同价格的分类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def price(x):
if x < 20:
return "很便宜"
if x < 50:
return "价格亲民"
if x < 100:
return "可以接受"
if x < 200:
return "人均消费较高"
else:
return "高档餐厅"

df4 = df.query("均价 > 0")
df4["分类"] = df4["均价"].apply(price)

1
2
3
4
5
6
7
8
9
c = (
Pie(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
.add("", [list(z) for z in zip(df5["分类"].tolist(), df5["数量"].tolist())])
.set_global_opts(title_opts=opts.TitleOpts(title="青岛美食店铺均价数量占比分布",subtitle="备注:排除均价为0"),
legend_opts=opts.LegendOpts(pos_left="80%", orient="vertical"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)

c.render_notebook()

高档消费餐厅

1
2
3
4
5
6
7
8
9
10
11
12
c = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
.add_xaxis(df6["中文名"].tolist())
.add_yaxis("", df6["均价"].tolist())
# .reversal_axis() # 翻转坐标轴
.set_series_opts(label_opts=opts.LabelOpts(is_show=True)) # 是否显示数据以及label的位置(显示在右方)
.set_global_opts(title_opts=opts.TitleOpts(title="青岛高均价美食店"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)), # 设置旋转角度
)
)

c.render_notebook()

推荐菜

绘制推荐菜的词云图:

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
37
result = df["推荐菜"].tolist()
# 分词过程
rec_jieba_list = []
for i in range(len(result)):
# jieba分词
seg_list = jieba.cut(str(result[i]).strip(), cut_all=False)
for each in list(seg_list):
rec_jieba_list.append(each)

# 创建停用词list

def stopwordslist(filepath):
stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
return stopwords

# 传入路径,加载去停用词
stopwords = stopwordslist('./nlp_stopwords.txt')

stopword_list = []
for word in rec_jieba_list: # jieba_name中的word不在停用词表中,且不是\t制表符
if word not in stopwords:
if word != "\t" and word != " " and word != "nan": # 几个特殊符号的排除
stopword_list.append(word)

# 使用停用词
result = pd.value_counts(stopword_list).reset_index()
result.columns = ["词语","次数"]

rec_words = [tuple(z) for z in zip(result["词语"].tolist(), result["次数"].tolist())]

c = (
WordCloud()
.add("", rec_words, word_size_range=[20, 80], shape=SymbolType.DIAMOND)
.set_global_opts(title_opts=opts.TitleOpts(title="青岛美食词云图"))
)

c.render_notebook()

数据获取

完整的数据分析代码和数据,联系小编可获取,备注【公司/学校 + 姓名】可以获取~

本文标题:Python爬虫旅游-青岛站

发布时间:2022年10月04日 - 21:10

原始链接:http://www.renpeter.cn/2022/10/04/Python%E7%88%AC%E8%99%AB%E6%97%85%E6%B8%B8-%E9%9D%92%E5%B2%9B%E7%AB%99.html

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

Coffee or Tea