前言

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

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

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

这次我就用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()

最后

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

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

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

  1. 五一出行你准备好了吗?Python帮你预测全国热门景点!

    Show me data,用数据说话 今天我们聊一聊五一出行预测 点击下方视频,先睹为快: 今年"五一"劳动节假期时间较长,与此同时,国内疫情防控形势持续向好.自4月30日0时起, ...

  2. Python抓取全国旅游景点以及小吃数据,想做旅游攻略?Python助你事半功倍。

    前言 疫情自从来了之后已经很久没有出去旅游过了,蹭着这段疫情好转,那肯定是要出去走一走的,这一篇其实是全国旅游中的一站,因为每个城市能玩的地方太多了,一篇文章下来肯定是写不了的,所以今天就抓取一下-- ...

  3. 初三计算机模拟考试在房考吗,中考临近,初三学生想知道中考难还是模拟考试难,你知道哪个难吗...

    原标题:中考临近,初三学生想知道中考难还是模拟考试难,你知道哪个难吗 距离中考还有半年的时间,一些初三的学生想知道中考前的模拟考试更难一些,还是中考试卷的难度更难一些.作为一名初中数学老师,今天就为广 ...

  4. Python旅游好帮手:提前15天准备五一旅游景点详细数据

    人生苦短,我用python 虽然还是有15天才放五一的假, 但是我的心早已经在旅游的路上了~ 本文源码:点击此处跳转文末名片获取 趁现在,先来用python做一个旅游攻略 知识点: requests ...

  5. python查看微信撤回消息_想查看微信好友撤回的消息?Python帮你搞定

    要说微信最让人恶心的发明,消息撤回绝对能上榜. 比如你现在正和女朋友用微信聊着天,或者跟自己喜欢的女孩子聊着天,一个不留神,你没注意到对方发的消息就被她及时撤回了,这时你很好奇,好奇她到底发了什么?于 ...

  6. 上海python培训比较好的机构-想要入行Python,上海Python培训机构哪个好?

    随着大数据和人工智能技术的落地应用,Python的应用范围得到进一步拓展,IT行业陆续释放出大量的Python开发岗位.有人想要入行Python,却又担心学习Python就业不好,那么一个高薪高职的P ...

  7. 运维学python用不上_作为运维你还在想要不要学Python,看完这篇文章再说!

    原标题:作为运维你还在想要不要学Python,看完这篇文章再说! 本文由马哥教育Python自动化实战班5期学员推荐,转载自简书,作者为Li.Yingjie,内容略经小编改编和加工,观点跟作者无关,最 ...

  8. 用二分法编写猜数字游戏(含:猜电脑随机数,和用户自己想的数字)python

    目录 #什么是二分法 #用二分法猜电脑随机数 #用二分法猜用户所想的数 1.什么是二分法? 对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点 ...

  9. python在屏幕上画画_想学画画?python满足你!

    python中的绘图工具有不少,比如Matplotlib等等,但这些只能用来画表格,今天我们来介绍一款可以用来画画的库--turtle. 一.绘图原理 我们通过控制初始位置为(0,0)的海龟进行移动, ...

最新文章

  1. 节省两倍开发时间,Java静态方法还可以这么玩
  2. Oracle-Listener log解读
  3. vue-cli详细教程
  4. HBase-1.2.4LruBlockCache实现分析(一)
  5. 互联网医院 2020年突出成就_【关注】中国社科院发布2020中国医院互联网影响力排行榜...
  6. win7更改用户登录或注销方式的操作教程
  7. 全新思路!阿里达摩院将Transformer引入在线行为检测!ICCV2021
  8. 数据库MySQL基础---DDL/DML/DQL
  9. 2018-10-16
  10. 联想e540风扇清灰_实力强劲无惧挑战,联想异能者就是这么强悍
  11. 7-7 全量复制开销
  12. 【JavaScript 插件】实现图片倒影效果 - reflex.js
  13. 驾校一点通电脑版2015 v1.5 最新版
  14. SXT分布式缓存技术公开课的观后感
  15. 谁说前端不能搞红黑树,用这55张图拿JS一起手撕红黑树
  16. C2. Pokémon Army (hard version)(贪心分治)
  17. 钛磨产品行业调研报告 - 市场现状分析与发展前景预测
  18. WLST 命令和变量
  19. ifconfig 下面的一些字段(errors, dropped, overruns)
  20. tsconfig 配置文件各字段详解

热门文章

  1. java通讯录备份_基于Java语言的C/S模式通讯录备份和查询软件
  2. 高性能的Ajax应用-Julien Lecomte
  3. 5g局域网传输速度_5G 内网传输速度为什么比2.4G还要慢?
  4. 一篇自勉的短文日记同时送给80后年近中旬的你
  5. 物联网感知技术、传输技术、支撑技术和应用技术的介绍
  6. 论文系统Step1:从日志记录中提取特定信息
  7. 【R言R语】系列之算法工程师入职半年的总结与感悟
  8. 第四周 求圆柱体的表面积
  9. audio驱动之cpu_dai
  10. 小红书运营技巧分享:新用户如何种草小红书