寒假已经到了,玩是要玩的,作为一个地地道道的重庆电网小哥,今天想用python爬虫+数据分析 的方式告诉你重庆哪些地方好玩。

先上一张最后景区地点分布结果图

数据来源:去哪儿旅行

网址:去哪儿旅行-重庆

用request请求到json数据

第一部分:爬虫

数据搜索:小试牛刀

import requests
keyword = "重庆"
page=1#打印第一页headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
url = f'http://piao.qunar.com/ticket/list.json?keyword={keyword}&region=&from=mpl_search_suggest&page={page}'
res = requests.request("GET", url, headers=headers)try:res_json = res.json()data = res_json['data']print(data)
except:pass

结果

json返回的数据格式是字典型,我们需要从中找到我感兴趣的关键词
搜索结果
发现我们感兴趣的是sightList

于是可以修改代码为

import requests
keyword = "重庆"
page=1headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
url = f'http://piao.qunar.com/ticket/list.json?keyword={keyword}&region=&from=mpl_search_suggest&page={page}'
res = requests.request("GET", url, headers=headers)res_json = res.json()
sightLists = res_json['data']['sightList']#sightList是感兴趣的
for  sight in sightLists:print(sight)

再次提取信息,修改代码为

import requests
import pandas as pd
keyword = "重庆"
page=1#查看第一页headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
url = f'http://piao.qunar.com/ticket/list.json?keyword={keyword}&region=&from=mpl_search_suggest&page={page}'
res = requests.request("GET", url, headers=headers)res_json = res.json()
sightLists = res_json['data']['sightList']#sightList是感兴趣的
for  sight in sightLists:name=(sight['sightName'] if 'sightName' in sight.keys() else None)#名称districts=(sight['districts'] if 'districts' in sight.keys() else None)#地址star=(sight['star'] if 'star' in sight.keys() else None) #星级qunarPrice=(sight['qunarPrice'] if 'qunarPrice' in sight.keys() else None)#最低价格saleCount=(sight['saleCount'] if 'saleCount' in sight.keys() else None)#购买人数score=(sight['score'] if 'score' in sight.keys() else None )#评分point=(sight['point'] if 'point' in sight.keys() else None )#坐标位置intro=(sight['intro'] if 'intro' in sight.keys() else None)#介绍print('名称:{0},地址:{1},星级:{2},价格:{3},saleCount:{4},评分:{5},坐标:{6},介绍:{7}'.format(name,districts,star,qunarPrice,saleCount,score,point,intro))

我们需要将数据写入表格。

import requests
import pandas as pd
import numpy as np
keyword = "重庆"
page=1#查看第一页headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
url = f'http://piao.qunar.com/ticket/list.json?keyword={keyword}&region=&from=mpl_search_suggest&page={page}'
res = requests.request("GET", url, headers=headers)res_json = res.json()
sightLists = res_json['data']['sightList']#sightList是感兴趣的
for  sight in sightLists:name=(sight['sightName'] if 'sightName' in sight.keys() else None)#名称districts=(sight['districts'] if 'districts' in sight.keys() else None)#地址star=(sight['star'] if 'star' in sight.keys() else None) #星级qunarPrice=(sight['qunarPrice'] if 'qunarPrice' in sight.keys() else None)#最低价格saleCount=(sight['saleCount'] if 'saleCount' in sight.keys() else None)#购买人数score=(sight['score'] if 'score' in sight.keys() else None )#评分point=(sight['point'] if 'point' in sight.keys() else None )#坐标位置intro=(sight['intro'] if 'intro' in sight.keys() else None)#介绍#print('名称:{0},地址:{1},星级:{2},价格:{3},saleCount:{4},评分:{5},坐标:{6},介绍:{7}'.format(name,districts,star,qunarPrice,saleCount,score,point,intro))shuju=np.array((name,districts,star,qunarPrice,saleCount,score,point,intro))shuju=shuju.reshape(-1,8)shuju=pd.DataFrame(shuju,columns=['名称','地址','星级','最低价格','购买人数','评分','坐标位置','介绍'])#print(shuju)shuju.to_csv('重庆景点数据.csv', mode='a+', index=False,header=False)  # mode='a+'追加写入

多页爬取
前面以一页数据为例,整理出啦大概代码,现在需要爬取多页

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu 余登武
# @Date  : 2021/1/30
import requests
import pandas as pd
import numpy as np
import random
from time import sleep
def get_data(keyword, page):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}url = f'http://piao.qunar.com/ticket/list.json?keyword={keyword}&region=&from=mpl_search_suggest&page={page}'res = requests.request("GET", url, headers=headers)sleep(random.uniform(1, 2))try:res_json = res.json()sightLists = res_json['data']['sightList']  # sightList是感兴趣的for sight in sightLists:name = (sight['sightName'] if 'sightName' in sight.keys() else None)  # 名称districts = (sight['districts'] if 'districts' in sight.keys() else None)  # 地址star = (sight['star'] if 'star' in sight.keys() else None)  # 星级qunarPrice = (sight['qunarPrice'] if 'qunarPrice' in sight.keys() else None)  # 最低价格saleCount = (sight['saleCount'] if 'saleCount' in sight.keys() else None)  # 购买人数score = (sight['score'] if 'score' in sight.keys() else None)  # 评分point = (sight['point'] if 'point' in sight.keys() else None)  # 坐标位置intro = (sight['intro'] if 'intro' in sight.keys() else None)  # 介绍# print('名称:{0},地址:{1},星级:{2},价格:{3},saleCount:{4},评分:{5},坐标:{6},介绍:{7}'.format(name,districts,star,qunarPrice,saleCount,score,point,intro))shuju = np.array((name, districts, star, qunarPrice, saleCount, score, point, intro))shuju = shuju.reshape(-1, 8)shuju = pd.DataFrame(shuju, columns=['名称', '地址', '星级', '最低价格', '购买人数', '评分', '坐标位置', '介绍'])# print(shuju)shuju.to_csv('重庆景点数据.csv', mode='a+', index=False, header=False)  # mode='a+'追加写入except:passif __name__ == '__main__':keyword = "重庆"for page in range(1, 75):  # 控制页数print(f"正在提取第{page}页")sleep(random.uniform(1, 2))get_data(keyword, page)

1000多条数据,原来重庆这么多好玩的

第二部分:数据分析

前面我们爬取了数据,现在来分析下。

1.读取数据

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置加载的字体名
plt.rcParams['axes.unicode_minus'] = False#df=pd.read_csv('重庆景点数据.csv',header=None,names=list(['名称', '地址', '星级', '最低价格', '购买人数', '评分', '坐标位置', '介绍']))
df = df.drop_duplicates()#删除重复数据。得到470行数据
print(df.head())

去除重复数据后,得到重庆有470处景点

2.景点价格分析
最高Top20

df_qunarPrice = df.pivot_table(index='名称',values='最低价格')
df_qunarPrice.sort_values('最低价格',inplace=True,ascending=False)#降序
#print(df_qunarPrice[:20])#最高价格top20
df_qunarPrice[:20].plot(kind='barh')
plt.title('价格最高Top20')
plt.show()

最低Top20

df_qunarPrice = df.pivot_table(index='名称',values='最低价格')
df_qunarPrice.sort_values('最低价格',inplace=True,ascending=True)
#print(df_qunarPrice[:20])#最高价格top20
df_qunarPrice[:20].plot(kind='barh')
plt.title('最低Top20')
plt.show()

3.景点评分分析
评分最高Top20

#评分TOP20景点
df_score = df.pivot_table(index='名称',values='评分')
df_score.sort_values('评分',inplace=True,ascending=False)
df_score[:20].plot(kind='barh',color='red')#barh横条形图
plt.title('评分最高Top20')
plt.show()

评分最低Top20

df_score = df.pivot_table(index='名称',values='评分')
df_score.sort_values('评分',inplace=True,ascending=True )
df_score[:20].plot(kind='barh',color='red')#barh横条形图
plt.title('评分最低Top20')
plt.show()

没有评分(可能是网站还未收录该地方评分吧…)

4.月销售额分析
最高Top20

df_saleCount = df.pivot_table(index='名称',values='购买人数')
df_saleCount.sort_values('购买人数',inplace=True,ascending=False)
df_saleCount[:20].plot(kind='barh',color='green')#barh横条形图
plt.title('月销售额最高Top20')
plt.show()

最低Top20(可能未收录该地方数据把,可能该地方免费吧)

5.景点等级分布

from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.globals import ThemeTypedf_star = df["星级"].value_counts()
df_star = df_star.sort_values(ascending=False)
print(df_star)

查找有等级的景点名称,即3星级及其以上

print(df[df["星级"]!='无'].sort_values("星级",ascending=False)['名称'])

展示部分图,太多啦

6.景点地址地图绘图
先保存文本地文件

df["lon"] = df["坐标位置"].str.split(",",expand=True)[0]#经度
df["lat"] = df["坐标位置"].str.split(",",expand=True)[1]#纬度
df.to_csv("data重庆.csv")

绘制地图

import pandas as pdstations = pd.read_csv('data重庆.csv',delimiter=',')from pyecharts.charts import Geo
from pyecharts import options
from pyecharts.globals import GeoTypeg = Geo().add_schema(maptype="重庆")# 给所有点附上标签 'StationID'
for i in stations.index:s = stations.iloc[i]g.add_coordinate(s['名称'],s['lon'],s['lat'])#地区名称,经度,纬度# 给每个点的值赋为 1
data_pair = [(stations.iloc[i]['名称'],1) for i in stations.index]# 画图
g.add('',data_pair, type_=GeoType.EFFECT_SCATTER, symbol_size=2)
g.set_series_opts(label_opts=options.LabelOpts(is_show=False))
g.set_global_opts(title_opts=options.TitleOpts(title="重庆景点分布图by-yudengwu"))# 保存结果到 html
result = g.render('stations.html')

主城区那边好玩的多

作者:电气-余登武。写作属实不易,如果你觉得很好,动个手点个赞再走。

爬虫实战:爬虫加数据分析,重庆电气小哥一文带你分析重庆所有旅游景点相关推荐

  1. 【Python爬虫实战】codeforces刷题记录小助手

    先看效果图. 输入codeforces的用户名,可以查询用户的rating信息.以及参加比赛的信息(大星参数的不计算在内).还有总的AC数. 一.需求分析 找到显示用户参加contest信息的url. ...

  2. python3[爬虫实战] 爬虫之requests爬取新浪微博京东客服

    爬取的内容为京东客服的微博及评论 思路:主要是通过手机端访问新浪微博的api接口,然后进行数据的筛选, 类似于这样的:https://m.weibo.cn/u/5650743478?uid=56507 ...

  3. 重庆的小面50强[转自经典重庆]

    1.一热胜三鲜:大溪沟转盘往人和街方向走大约100米马路的左边  2.大渡口牛肉面:钢花电影院附近,大渡口公安局旁右边一小巷进去后再右转  3.彩电中心旁的彩电面庄  4.望龙门的老虎灶鼎锅小面  5 ...

  4. python爬虫实战小项目

    本文所讲的爬虫实战属于基础.入门级别,使用的是python2.7实现的. 爬虫原理和思想 本项目实现的基本目标:在捧腹网中,把搞笑的图片都爬下来,注意不需要爬取头像的图片,同时,将图片命好名放在当前的 ...

  5. python爬虫实战-网易BUFF CSGO饰品

    python爬虫实战-网易BUFF CSGO饰品 寒假迷上了csgo,一方面对这个纯粹的枪战游戏着迷,另一方面对精美的饰品着迷.众所周知,csgo是个理财游戏饰品游戏,能够掌握到喜欢饰品的价格就可以得 ...

  6. 第14.16节 爬虫实战2:赠人玫瑰,手留余香! request+BeautifulSoup实现csdn博文自动点赞

    写在前面:本文仅供参考学习,请勿用作它途,禁止转载! 在<第14.14节 爬虫实战准备:csdn博文点赞过程http请求和响应信息分析>老猿分析了csdn博文点赞处理的http请求和响应报 ...

  7. 【python】数据分析实战:分析全国旅游景点数据,暑假还不知道去哪玩的看过来

    前言 暑假是学生老师们拥有的最长假期,这么长的假期,光待在家里太浪费了,何不选择一个好去处,欣赏欣赏夏季的美景?当然,并不是所有地方都适合这个时节去的,那么,暑假适合去国内那些地方旅游呢?现在我们学习 ...

  8. 神秘贼掉包二维码,支付宝赔偿200多,烧烤小哥为何还骂支付宝没良心?

    白天气温超过了40度,烧烤小哥站在400度的烧烤炉旁.客人们吹着空调扇着风扇大声聊天.烧烤小哥用扇子扇着炭火,眼睛偷偷瞄着马路上有没有城管的车过来.心里想,已经凌晨12点了,城管应该都已经睡了. &q ...

  9. python 英语词汇量_北大保安小哥英语词汇量一万五,会用Python编程,网友:北大保安都不会招我...

    原标题:北大保安小哥英语词汇量一万五,会用Python编程,网友:北大保安都不会招我 11月11日下午3时,北大官方微博发文"遇见最强扫地僧!北大保安小哥英语词汇量一万五,会Python,准 ...

最新文章

  1. Java学习总结:39(反射机制)
  2. jquery Fancybox插件的应用
  3. 2021年春季学期-信号与系统-第四次作业参考答案-第一小题
  4. python中的[-1]、[:-1]、[::-1]、[n::-1]
  5. php blowfish 解密,PHP blowfish 加密解密函数
  6. __builtin_expect提高运行效率
  7. thincmf 分页无法搜索_分页的bug ThinkCMF内容管理框架,做最简约的ThinkPHP开源软件...
  8. java迭代器不能修改集合值_关于使用迭代器对集合进行遍历时,不能对集合进行修改的论证...
  9. 大华海康NVR录像JAVA下载及WEB播放
  10. 统计学 | 八大经典思想「AI核心算法」
  11. 《概率论与数理统计》学习笔记
  12. yolov4用1050ti_Windows下基于VS2019|Opencv4.2.0|CUDA10.0|YOLOv4
  13. 汽车销量查询小助手(小程序)销量趋势图功能及代码知识分享
  14. 【239天】网易云课堂计算机专业基础课程系列——计算机专业导论(4)
  15. 宏基因组分箱CheckM评估结果的提取
  16. 专科计算机课程作业2理解题,计算机第二模块练习题
  17. 请让我像亲人一样爱你
  18. java 利用工具包Geotools实现不同坐标系之间坐标转换
  19. uni-app 父组件无法获取到子组件传来的值,为undefined;父子组件传值undefined
  20. 随机森林算法及贝叶斯优化调参Python实践

热门文章

  1. linux 虚拟机大量udp请求失败_理解 Linux 网络栈:Linux 网络协议栈简单总结分析...
  2. 十大经典排序算法之快速排序及其优化
  3. CentOS 7——yum错误[Error: rpmdb open failed]解决方案
  4. JAVA——鼠标事件(MouseEvent)MouseListener监听器DEMO
  5. 2019牛客暑期多校训练营(第八场)
  6. cpuz北桥频率和内存频率_DDR4的内存频率是如何计算的?
  7. 数据结构Java03【(时间、空间复杂度),排序(冒泡、快速、插入、希尔、选择、归并、基数、队列基数)】
  8. input标签获取图片文件尺寸
  9. JSON——IT技术人员都必须要了解的一种数据交换格式
  10. 从Java视角理解CPU缓存(CPU Cache)