临近五一,游玩地点想好了吗,Python帮你查找旅游景点的详细数据

前言

好不容易没有了疫情,三年整整三年,都要把我憋死了,想到去年暑假的时候,准备去厦门,攻略做好了,厦门疫情来了,想着转去济南也是这样,去三亚,结果收到好几万人都被留在三亚了…

搞的我又在家里躺了一个月,后面耐不住寂寞,找个班开始上班了

在这里插入图片描述

不过,这次我要抓住五一,好好玩一玩,但是也就几天假…天气还不咋地

这次我就用Python来好好做一个旅游攻略

知识点

requests 
parsel  
csv  

第三方库:

requests 
parsel 

模块安装:

  • 按住键盘 win + r, 输入cmd回车
  • 打开命令行窗口, 在里面输入 pip install 模块名

开发环境:

  • python 3.8

+python安装包 安装教程视频
+pycharm 社区版 专业版 及 激活码文末名片获取

代码实现步骤 :

  1. 向目标网站发送网络请求
  2. 获取数据 网页源代码
  3. 筛选我们需要的数据 所有的详情页链接
  4. 向 每一个详情页 链接发送网络请求
  5. 获取数据 网页源代码
  6. 提取数据
    [出发日期 天数 人均费用 人物 玩法 地点 浏览量…]
  7. 保存数据
  8. 多页爬取
  9. 做一个可视化分析 旅游景点推荐

导入模块

import random
import time
import requests    
import parsel      
import csv         

爬取旅游wang数据

1. 向目标网站发送网络请求

csv_qne = open('去哪儿.csv', mode='a', encoding='utf-8', newline='')
完整源码+v:xiaoyuanllsll
csv_writer = csv.writer(csv_qne)
csv_writer.writerow(['地点', '短评', '出发时间', '天数','人均费用','人物','玩法','浏览量','详情页'])
for page in range(1, 201):url = f'https://travel.qunar.com/travelbook/list.htm?page={page}&order=hot_heat'

2. 获取数据 网页源代码

html_data = response.text

3. 筛选我们需要的数据 所有的详情页链接

selector = parsel.Selector(html_data)
url_list = selector.css('body > div.qn_mainbox > div > div.left_bar > ul > li > h2 > a::attr(href)').getall()
for detail_url in url_list:detail_id = detail_url.replace('/youji/', '')detail_url = '这里放网址' + detail_id

4. 向 每一个详情页 链接发送网络请求

response_1 = requests.get(detail_url)

5. 获取数据 网页源代码

data_html_1 = response_1.text

6. 提取数据

        selector_1 = parsel.Selector(data_html_1)title = selector_1.css('.b_crumb_cont *:nth-child(3)::text').get()comment = selector_1.css('.title.white::text').get()count = selector_1.css('.view_count::text').get()date = selector_1.css('#js_mainleft > div.b_foreword > ul > li.f_item.when > p > span.data::text').get()days = selector_1.css('#js_mainleft > div.b_foreword > ul > li.f_item.howlong > p > span.data::text').get()money = selector_1.css('#js_mainleft > div.b_foreword > ul > li.f_item.howmuch > p > span.data::text').get()character = selector_1.css('#js_mainleft > div.b_foreword > ul > li.f_item.who > p > span.data::text').get()play_list = selector_1.css('#js_mainleft > div.b_foreword > ul > li.f_item.how > p > span.data span::text').getall()play = ' '.join(play_list)print(title, comment, date, days, money, character, play, count, detail_url)csv_writer.writerow([title, comment, date, days, money, character, play, count, detail_url])time.sleep(random.randint(3, 5))
csv_qne.close()

数据分析代码

import pandas as pd
from pyecharts.commons.utils import JsCode
from pyecharts.charts import *
from pyecharts import options as opts
data = pd.read_csv('去哪儿_数分.csv')
data
data = data[~data['地点'].isin(['攻略'])]
data = data[~data['天数'].isin(['99+'])]
data
data['人均费用'].fillna(0, inplace=True)
data['人物'].fillna('独自一人', inplace=True)
data['玩法'].fillna('没有', inplace=True)
data['天数'] = data['天数'].astype(int)
data = data[data['人均费用'].values>200]
data = data[data['天数']<=15]
data
def Month(e):m = str(e).split('/')[2]if m=='01':完整源码+v:xiaoyuanllsllreturn '一月'if m=='02':return '二月'if m=='03':return '三月'if m=='04':return '四月'if m=='05':return '五月'if m=='06':return '六月'if m=='07':return '七月'if m=='08':return '八月'if m=='09':return '九月'if m=='10':return '十月'if m=='11':return '十一月'if m=='12':return '十二月'
data['旅行月份'] = data['出发时间'].apply(Month)
data['出发时间']=pd.to_datetime(data['出发时间'])
data
loc = data1['地点'].value_counts().head(10).index.tolist()
print(loc)
loc_data = data1[data1['地点'].isin(loc)]
price_mean = round(loc_data['人均费用'].groupby(loc_data['地点']).mean(),1)
print(price_mean)
price_mean2 = [1630.1,1862.9,1697.9,1743.4,1482.4,1586.4,1897.0,1267.5,1973.8,1723.7]
m2 = data1['地点'].value_counts().head(10).index.tolist()
n2 = data1['地点'].value_counts().head(10).values.tolist()
bar=(Bar(init_opts=opts.InitOpts(height='500px',width='1000px',theme='dark')).add_xaxis(m2).add_yaxis('目的地Top10',n2,label_opts=opts.LabelOpts(is_show=True,position='top'),itemstyle_opts=opts.ItemStyleOpts(color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,[{offset: 0,color: 'rgb(255,99,71)'}, {offset: 1,color: 'rgb(32,178,170)'}])"""))).set_global_opts(title_opts=opts.TitleOpts(title='目的地Top10'),xaxis_opts=opts.AxisOpts(name='景点名称',type_='category',                                           axislabel_opts=opts.LabelOpts(rotate=90),),yaxis_opts=opts.AxisOpts(name='数量',min_=0,max_=120.0,splitline_opts=opts.SplitLineOpts(is_show=True,linestyle_opts=opts.LineStyleOpts(type_='dash'))),tooltip_opts=opts.TooltipOpts(trigger='axis',axis_pointer_type='cross')).set_series_opts(markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_='average',name='均值'),opts.MarkLineItem(type_='max',name='最大值'),opts.MarkLineItem(type_='min',name='最小值'),]))
)
bar.render_notebook()
bar=(Bar(init_opts=opts.InitOpts(height='500px',width='1000px',theme='dark')).add_xaxis(loc)完整源码+v:xiaoyuanllsll.add_yaxis('人均费用',price_mean2,label_opts=opts.LabelOpts(is_show=True,position='top'),itemstyle_opts=opts.ItemStyleOpts(color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,[{offset: 0,color: 'rgb(255,99,71)'}, {offset: 1,color: 'rgb(32,178,170)'}])"""))).set_global_opts(title_opts=opts.TitleOpts(title='各景点人均费用'),xaxis_opts=opts.AxisOpts(name='景点名称',type_='category',                                           axislabel_opts=opts.LabelOpts(rotate=90),),yaxis_opts=opts.AxisOpts(name='数量',min_=0,max_=2000.0,splitline_opts=opts.SplitLineOpts(is_show=True,linestyle_opts=opts.LineStyleOpts(type_='dash'))),tooltip_opts=opts.TooltipOpts(trigger='axis',axis_pointer_type='cross')).set_series_opts(markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_='average',name='均值'),opts.MarkLineItem(type_='max',name='最大值'),opts.MarkLineItem(type_='min',name='最小值'),]))
)
bar.render_notebook()
word_list = []
for i in data1['玩法']:s = re.split('\xa0',i)word_list.append(s)  
dict = {}
for j in range(len(word_list)):for i in word_list[j]:if i not in dict:dict[i] = 1else:dict[i]+=1
#print(dict)
list = []
for item in dict.items():list.append(item)
for i in range(1,len(list)):for j in range(0,len(list)-1):if list[j][1]<list[j+1][1]:list[j],list[j+1] = list[j+1],list[j]
print(list)
data1['旅行月份'].value_counts()
m1 = data1['人物'].value_counts().index.tolist()
n1 = data1['人物'].value_counts().values.tolist()
pie = (Pie(init_opts=opts.InitOpts(theme='dark', width='1000px', height='800px')).add("", [z for z in zip(m1,n1)],radius=["40%", "65%"]).set_global_opts(title_opts=opts.TitleOpts(title="去哪儿\n\n出游结伴方式", pos_left='center', pos_top='center',title_textstyle_opts=opts.TextStyleOpts(color='#FF6A6A', font_size=30, font_weight='bold'),),visualmap_opts=opts.VisualMapOpts(is_show=False, min_=38,max_=641,is_piecewise=False,dimension=0,range_color=['#9400D3', '#008afb', '#ffec4a', '#FFA500','#ce5777']),legend_opts=opts.LegendOpts(is_show=False, pos_top='5%'),).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}", font_size=12),tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{b}: {c}"),itemstyle_opts={"normal": {"barBorderRadius": [30, 30, 30, 30],'shadowBlur': 10,'shadowColor': 'rgba(0,191,255,0.5)','shadowOffsetY': 1,'opacity': 0.8}}))
pie.render_notebook()
#%%m3 = data1['出发时间'].value_counts().sort_index()[:]
m4 = m3['2021'].index
n4 = m3['2021'].values
#%%m3['2021'].sort_values().tail(10)``````c
#%% md## 出游时间分析
#%%line = (Line().add_xaxis(m4.tolist()).add_yaxis('',n4.tolist())
)
line.render_notebook()
#%%line = (Line().add_xaxis(m4.tolist()).add_yaxis('',n4.tolist())
)
line.render_notebook()

最后

本篇文章分享到这里就结束了 ,我也要准备准备五一出去玩的攻略了!感觉看了下来去三亚比较好,冲啊

对文章有疑问的,或者需要报错解答,案例源码的,可以直接点击文末名片哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41108.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sob攻略超详细攻略_西安旅游|必去景点华山超详细攻略一网打尽

西安旅游&#xff5c;必去景点华山超详细攻略一网打尽 周六去爬了华山&#xff0c;太壮观了&#xff0c;奇险陡峭&#xff0c;站在山顶观云海颇有一番风味。 交通&#xff1a;高铁西安北−华山北 54.5 华山北-游客中心出租约15 ⚠️一下车有很多司机招揽说20块&#xff0c;不要…

西安五日游规划

文章目录 前言一、行前准备二、必带清单三、打卡美食四、景点地理坐标五、旅游时间轴六、景点小巴士第一天第二天第三天第四天第五天其他 七、住宿八、小贴士总结 前言 西安五日游。计划从北京出发&#xff0c;游玩五天&#xff0c;第五天回京。 一、行前准备 计划行程 票务预…

西安游玩攻略

✌上午 、&#x1f31e;中午 、⛅下午、&#x1f319;晚上 第一天 ✌ 兵马俑 路线&#xff1a;地铁9号线去到秦陵西&#xff0c;下车倒公交门票&#xff1a;120开放时间&#xff1a;08:30 - 18:30Tip&#xff1a;建议找导游&#xff0c;或者电子讲解器&#xff0c;一定要提前在…

西安周边旅游

未央湖: 可乘坐336&#xff0c;或者在火车站乘坐719&#xff0c;门票20元&#xff0c;学生15元&#xff0c;年票免门票&#xff0c;划船不限时,可坎价出租烤具&#xff0c;及其他配料。整套租金30元&#xff0c;押金50元&#xff0c;租一套烤具送10元肉&#xff0c;不让自带酒水…

如何下载抖音小程序开发工具

抖音小程序开发工具 标准名称是&#xff1a;字节小程序开发工具 适用于头条系所有App&#xff0c;如今日头条、抖音、西瓜视频等。 下载地址 https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/developer-instrument/download/developer-instrument-update-and-d…

抖音海外版tiktok下的fanno怎么下载

一觉醒来&#xff0c;铺天盖地都是fanno的资讯&#xff0c;由此可见tiktok在海外的地位。那么fanno是什么呢&#xff1f;官网多少&#xff1f;APP从哪里下载&#xff1f;怎么入驻fanno&#xff1f;都成了吃瓜群众想要了解的焦点。 首先我们来说一下fanno是什么&#xff1f;为什…

微信小程序如何获得用户位置权限

由于新版本小程序开发做了更动 需要在app.json档案中添加PermissionObject 结构 说明小程序获取权限时展示的接口用途 如&#xff1a; {"pages": ["pages/index/index"],"permission": {"scope.userLocation": {"desc": &…

小白上路~微信小程序登录授权无法获取用户信息

1. button 标签和 open-type“getUserInfo” 获取用户信息失败 天哪噜&#xff0c;必须好好记录一番由于没有看官方文档更新 api 而导致的 “BUG” &#xff01;&#xff01;&#xff01; 一觉醒来&#xff0c;发现准备收尾的小程序无法获取到用户信息了&#xff1f;&#xf…

小程序登录授权获取用户信息

一 登录 时序图如下&#xff1a; wx.login() 获取js_code 示例代码&#xff1a; App({ onLaunch: function() { wx.login({ success: function(res) { if (res.code) { //TODO } else { console.log(获取用户登录态失败&#xff01; res.errMsg) } } }); } }) code 换取 sess…

微信小程序 wx.openSetting打开不显示,封装用户授权

测试功能的时候&#xff0c;想要设置用户相册的功能&#xff0c;打开突然什么也没有&#xff0c;要么就是显示“个人信息与权限使用记录”&#xff0c;就连打印出来的 console.log("授权",res.authSetting) 授权信息也是空的。 一、 wx.authorize() 去社区翻回答都在…

微信小程序中用户拒绝授权的处理方式

微信小程序中的权限介绍 大家如果接触过移动开发应该都知道&#xff0c;涉及到一些用户敏感信息的操作&#xff08;比如定位、访问本地文件等&#xff09;都是需要用户授权的&#xff0c;在Android开发中&#xff0c;我们需要提前将这些权限配置到项目中&#xff0c;Android 6…

微信小程序-同时获取麦克风、相机权限、获取多个权限

代码仓库&#xff1a;https://gitee.com/DerekAndroid/miniProgramAgen/tree/master/pages/authSetting 效果&#xff1a; wxml: <button bindtap"checkScopeCamera">申请获取相机权限</button> <button bindtap"checkScopeCamera">申…

微信小程序之获取用户位置权限(拒绝后提醒)

微信小程序获取用户当前位置有三个方式&#xff1a; 1. wx.getLocation&#xff08;多与wx.openLocation一起用&#xff09;   获取当前的精度、纬度、速度。不需要授权。当type设置为gcj02 返回可用于wx.openLocation的坐标2. wx.chooseLocation   需要授权&#xff0c;打…

微信小程序之位置信息权限获取和设置界面权限显示

小程序提交审核和发布后&#xff0c;多种机型使用起来发现了一个问题&#xff0c;在小程序设置中没有显示具体的权限信息。如下图所示 当考虑到用户使用小程序时&#xff0c;若缺少对应权限&#xff0c;按照官方案例讲的方式是进行自动导航跳转“设置”页面&#xff0c;让用户手…

微信小程序+权限操作

微信小程序权限操作 在小程序端查询数据(只能查询到用户在小程序中创建的数据&#xff0c;导入的数据是查不到的&#xff1b;要想查到导入的数据需要把数据表中的权限改为所有*用户可读 *) wx.getSetting(Object object) 获取用户的当前设置。返回值中只会出现小程序已经向用户…

【微信小程序】用户授权及getUserProfile接口使用

小程序登录、用户信息相关接口调整说明 为&#xfeff;优化用户的使用体验&#xff0c;平台将进行以下调整&#xff1a; 1&#xff0c;2021年2月23日起&#xff0c;若小程序已在微信开放平台进行绑定&#xff0c;则通过wx.login接口获取的登录凭证可直接换取unionID 2&#xff…

微信小程序授权 获取用户信息

小程序在18年4月25日做了一次更新,不再支持直接弹出授权信息框 具体代码请看这里: >> 获取用户信息(用户信息、获取unionId、openId)请移步到这里 用户打开小程序时&#xff0c;直接弹框获取用户信息授权&#xff0c;可能会立马懵圈&#xff1a; 你是谁&#xff1…

微信小程序之获取用户位置权限

微信小程序获取用户当前位置有三个方式&#xff1a; 1. wx.getLocation 注意&#xff1a; 先要在app.json里配置permission&#xff1a; 不然就会出现以下提示&#xff08;本地测试环境&#xff09;&#xff1a; 配置如下&#xff1a; "permission": {"scope…

发布微信小程序获取收集用户信息权限

前言 在发布微信小程序的时候我们经常会遇到审核不通过的情况&#xff0c;其中一种特别让我头疼就是说小程序收集、使用和储存用户信息。不给予通过。 但是他们的接口又不能提供这个功能&#xff0c;并且老是改动&#xff0c;真的特别的麻烦加无语。有时候审核偷一下懒&#xf…