Python实战:抓取13城旅游数据,揭秘五一热门景区与价格分布
本文利用Python爬虫技术,从去哪儿网抓取北京、上海等13个热门城市的景区门票数据。通过统计销量与价格分布,分析五一假期最受欢迎的景区及票价区间,为后续出行规划提供参考。
五一旅游趋势与数据抓取背景
今年五一假期为四天,许多游客不再局限于周边游,而是利用充裕的时间选择稍远的景区,甚至出境游。各大景点人满为患,拥挤程度之高,连排队上厕所都需耗费大量时间,这种场景让人不禁联想到电影《复仇者联盟》中灭霸的行为动机。
本文通过抓取去哪儿网部分城市的门票销售数据,对热门景点进行简要分析,旨在为下一次假期出行提供数据参考。
数据抓取实现细节
数据抓取策略

首先请求 https://piao.qunar.com/ticket/list.htm?keyword=北京 以获取北京地区的热门景区信息,随后使用 BeautifulSoup 解析网页并提取所需字段。
本次抓取了前4页的景点信息,每页包含15个景点。由于去哪儿网未设置严格的反爬机制,直接发起请求即可获取数据。
随机选取了13个热门城市作为目标:北京、上海、成都、三亚、广州、重庆、深圳、西安、杭州、厦门、武汉、大连、苏州。
将抓取到的数据存入 MongoDB 数据库中进行存储和管理。
爬虫部分的完整代码实现如下:
import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
class QuNaEr():
def __init__(self, keyword, page=1):
self.keyword = keyword
self.page = page
def qne_spider(self):
url = 'https://piao.qunar.com/ticket/list.htm?keyword=%s®ion=&from=mpl_search_suggest&page=%s' % (self.keyword, self.page)
response = requests.get(url)
response.encoding = 'utf-8'
text = response.text
bs_obj = BeautifulSoup(text, 'html.parser')
arr = bs_obj.find('div', {'class': 'result_list'}).contents
for i in arr:
info = i.attrs
# 景区名称
name = info.get('data-sight-name')
# 地址
address = info.get('data-address')
# 近期售票数
count = info.get('data-sale-count')
# 经纬度
point = info.get('data-point')
# 起始价格
price = i.find('span', {'class': 'sight_item_price'})
price = price.find_all('em')
price = price[0].text
conn = MongoClient('localhost', port=27017)
db = conn.QuNaEr # 库
table = db.qunaer_51 # 表
table.insert_one({
'name' : name,
'address' : address,
'count' : int(count),
'point' : point,
'price' : float(price),
'city' : self.keyword
})
if __name__ == '__main__':
citys = ['北京', '上海', '成都', '三亚', '广州', '重庆', '深圳', '西安', '杭州', '厦门', '武汉', '大连', '苏州']
for i in citys:
for page in range(1, 5):
qne = QuNaEr(i, page=page)
qne.qne_spider()
运行效果如图所示:

获取数据后,即可基于数据进行深入分析,提取有价值的信息。
景区热度与价格分布分析
数据分析环节
1、最受欢迎的15个景区

从统计结果可以看出,在所选的13个城市中,上海迪士尼乐园是最热门的景区。
相关实现代码如下:
from pymongo import MongoClient
# 设置字体,不然无法显示中文
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
conn = MongoClient('localhost', port=27017)
db = conn.QuNaEr # 库
table = db.qunaer_51 # 表
result = table.find().sort([('count', -1)]).limit(15)
# x,y轴数据
x_arr = [] # 景区名称
y_arr = [] # 销量
for i in result:
x_arr.append(i['name'])
y_arr.append(i['count'])
"""
去哪儿月销量排行榜
"""
plt.bar(x_arr, y_arr, color='rgb') # 指定color,不然所有的柱体都会是一个颜色
plt.gcf().autofmt_xdate() # 旋转x轴,避免重叠
plt.xlabel(u'景点名称') # x轴描述信息
plt.ylabel(u'月销量') # y轴描述信息
plt.title(u'拉钩景点月销量统计表') # 指定图表描述信息
plt.ylim(0, 4000) # 指定Y轴的高度
plt.savefig('去哪儿月销售量排行榜') # 保存为图片
plt.show()
2、景区热力图展示
为简化展示,此处仅展示北京地区的景区热力图。该功能依赖于百度地图开放平台,需先注册开发者账号并在首页底部申请密钥。应用类型选择“浏览器端”,只需组装数据并替换相应的 HTML 代码,同时需将访问应用的 AK 替换为实际值。具体效果如下:

3、景区价格分析
价格是出游决策的首要因素。起初尝试统计各城市的平均价格,但发现异常值会严重扭曲结果,例如北京刘老根大舞台票价高达580元,这会拉高整体平均值。这就像将姚明和潘长江的身高平均后达到190cm,缺乏代表性。因此,改为展示景区的价格分布情况。
根据价格区间设定了六个范围:

由上图可知,大部分景区门票价格集中在200元以下。游客在旅游中的主要花费通常用于交通、住宿和餐饮,门票占比相对较小。
具体实现代码如下:
arr = [[0, 50], [50,100], [100, 200], [200,300], [300,500], [500,1000]]
name_arr = []
total_arr = []
for i in arr:
result = table.count({'price': {'$gte': i[0], '$lt': i[1]}})
name = '%s元 ~ %s元 ' % (i[0], i[1])
name_arr.append(name)
total_arr.append(result)
color = 'red', 'orange', 'green', 'blue', 'gray', 'goldenrod' # 各类别颜色
explode = (0.2, 0, 0, 0, 0, 0) # 各类别的偏移半径
# 绘制饼状图
pie = plt.pie(total_arr, colors=color, explode=explode, labels=name_arr, shadow=True, autopct='%1.1f%%')
plt.axis('equal')
plt.title(u'热点旅游景区门票价格比例', fontsize=12)
plt.legend(loc=0, bbox_to_anchor=(0.82, 1)) # 图例
# 设置legend的字体大小
leg = plt.gca().get_legend()
ltext = leg.get_texts()
plt.setp(ltext, fontsize=6)
# 显示图
plt.show()
以上介绍了使用Python爬取13个旅游城市数据的详细过程,希望能为读者提供帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢大家对本站的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













