详解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入门篇之条件、循环
Oct 17 Python
Python可跨平台实现获取按键的方法
Mar 05 Python
python 连接各类主流数据库的实例代码
Jan 30 Python
Django中的CBV和FBV示例介绍
Feb 25 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
Mar 23 Python
Python3 读、写Excel文件的操作方法
Oct 20 Python
Python解决pip install时出现的Could not fetch URL问题
Aug 01 Python
Python cookie的保存与读取、SSL讲解
Feb 17 Python
如何基于python实现年会抽奖工具
Oct 20 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
Nov 18 Python
Python实现机器学习算法的分类
Jun 03 Python
如何用Python搭建gRPC服务
Jun 30 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
ubuntu 编译安装php 5.3.3+memcache的方法
2010/08/05 PHP
PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
2011/08/15 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
2015/12/22 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
解决Laravel 使用insert插入数据,字段created_at为0000的问题
2019/10/11 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
2019/10/17 PHP
Laravel5.5 视图 - 创建视图和数据传递示例
2019/10/21 PHP
Javascript this 关键字 详解
2014/10/22 Javascript
javascript实现节点(div)名称编辑
2014/12/17 Javascript
JS实现很酷的水波文字特效实例
2015/02/26 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
AngularJS中关于ng-class指令的几种实现方式详解
2016/09/17 Javascript
js通过keyCode值判断单击键盘上某个键,然后触发指定的事件方法
2017/02/19 Javascript
ReactNative短信验证码倒计时控件的实现代码
2017/07/20 Javascript
分享一个vue项目“脚手架”项目的实现步骤
2019/05/26 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
[58:35]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
解读! Python在人工智能中的作用
2017/11/14 Python
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
2018/05/08 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
python3 下载网络图片代码实例
2019/08/27 Python
Python连接SQLite数据库并进行增册改查操作方法详解
2020/02/18 Python
Python xpath表达式如何实现数据处理
2020/06/13 Python
css3的transition效果和transfor效果示例介绍
2013/10/30 HTML / CSS
HTML5 WebGL 实现民航客机飞行监控系统
2019/07/25 HTML / CSS
网络体系结构及协议的定义
2014/03/13 面试题
危爆物品安全大检查大整治工作方案
2014/05/03 职场文书
平面设计专业求职信
2014/08/09 职场文书
股指期货心得体会
2014/09/10 职场文书
2014年销售工作总结
2014/12/01 职场文书
公司放假通知怎么写
2015/04/15 职场文书
员工担保书范本
2015/09/22 职场文书
OpenCV-Python模板匹配人眼的实例
2021/06/08 Python
Java中Dijkstra(迪杰斯特拉)算法
2022/05/20 Java/Android