详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?


Posted in Python onMay 07, 2019

今年五一放了四天假,很多人不再只是选择周边游,因为时间充裕,选择了稍微远一点的景区,甚至出国游。各个景点成了人山人海,拥挤的人群,甚至去卫生间都要排队半天,那一刻我突然有点理解灭霸的行为了。

今天通过分析去哪儿网部分城市门票售卖情况,简单的分析一下哪些景点比较受欢迎,等下次假期可以做个参考。

抓取数据

详解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()

效果图如下:

详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?

有了数据,我们就可以分析出自己想要的东西了。

分析数据

1、最受欢迎的15个景区

 详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?

由图可以看出,在选择的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替换掉。效果图如下:

详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?

3、景区价格

价格是出游第一个要考虑的,一开始想统计一下各城市的平均价格,但是后来发现效果不是很好,比如北京的刘老根大舞台价格在580元,这样拉高了平均价格。就好比姚明和潘长江的平均身高在190cm,并没有什么说服力。所以索性展示一下景区的价格分布。

根据价格设置了六个区间:

详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?

通过上图得知,大部分的景区门票价格都在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个旅游城市详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python创建xml文件示例
Mar 22 Python
Python实现XML文件解析的示例代码
Feb 05 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
Apr 22 Python
python实现超市扫码仪计费
May 30 Python
NLTK 3.2.4 环境搭建教程
Sep 19 Python
python 将大文件切分为多个小文件的实例
Jan 14 Python
Python Django中间件,中间件函数,全局异常处理操作示例
Nov 08 Python
通过python检测字符串的字母
Feb 18 Python
Python日期格式和字符串格式相互转换的方法
Feb 18 Python
基于Keras中Conv1D和Conv2D的区别说明
Jun 19 Python
python实现粒子群算法
Oct 15 Python
Python使用华为API为图像设置多个锚点标签
Apr 12 Python
Scrapy-Redis结合POST请求获取数据的方法示例
May 07 #Python
Python数据类型之Set集合实例详解
May 07 #Python
Python数据类型之Dict字典实例详解
May 07 #Python
Python分支语句与循环语句应用实例分析
May 07 #Python
Python正则表达式实现简易计算器功能示例
May 07 #Python
深入浅析Python 中 is 语法带来的误解
May 07 #Python
利用python如何在前程无忧高效投递简历
May 07 #Python
You might like
德生H-501的评价与改造
2021/03/02 无线电
php 连接mysql连接被重置的解决方法
2011/02/15 PHP
php求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
PHP动态生成javascript文件的2个例子
2014/04/11 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
2017/02/17 PHP
JavaScript 事件冒泡简介及应用
2010/01/11 Javascript
被jQuery折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
2010/01/22 Javascript
在多个页面使用同一个HTML片段《续》
2011/03/04 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
JS+CSS实现的经典tab选项卡效果代码
2015/09/16 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
2016/05/13 Javascript
JQuery和PHP结合实现动态进度条上传显示
2016/11/23 Javascript
Bootstrap缩略图的创建方法
2017/03/22 Javascript
angularjs的select使用及默认选中设置
2017/04/08 Javascript
微信小程序实战之自定义抽屉菜单(7)
2017/04/18 Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
2017/06/22 Javascript
Nuxt.js实现一个SSR的前端博客的示例代码
2019/09/06 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
VUE.js实现动态设置输入框disabled属性
2019/10/28 Javascript
Vue-resource安装过程及使用方法解析
2020/07/21 Javascript
JS实现选项卡插件的两种写法(jQuery和class)
2020/12/30 jQuery
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
python中列表元素连接方法join用法实例
2015/04/07 Python
python中将一个全部为int的list 转化为str的list方法
2018/04/09 Python
Python Django框架实现应用添加logging日志操作示例
2019/05/17 Python
python pyinstaller 加载ui路径方法
2019/06/10 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
2019/09/10 Python
PIL包中Image模块的convert()函数的具体使用
2020/02/26 Python
pandas 按日期范围筛选数据的实现
2021/02/20 Python
心得体会开头
2014/01/01 职场文书
植树节活动总结
2014/04/30 职场文书
保护水资源的标语
2014/06/17 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
自我工作评价范文
2015/03/06 职场文书
给校长的建议书范文
2015/09/14 职场文书
俄罗斯十大城市人口排名,第三首都仅排第六,第二是北方首都
2022/03/20 杂记