嗨害大家好鸭~我是小熊猫❤

就快放假啦~

大概还有十几个小时的样子吧

不知道大家的假期有什么样的安排呢?

不过大家一定要保住自己的健康码啊!!!

趁现在,先来用python做一个旅游攻略

知识点:

requests  发送网络请求
parsel    解析数据
csv       保存数据

第三方库:

requests >>> pip install requests
parsel >>> pip install parsel

模块安装:

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

开发环境:

版 本: python 3.8

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

python学习方向:

爬虫开发: 批量采集网络当中数据内容(图片 文本 视频 音频)
数据分析: 对大量数据 进行处理分析, 做可视化, 预测
网站开发: 搭建网站服务 例如 淘宝 京东 豆瓣 知乎...
人工智能

案例思路分析:

1. 明确今天的目的, 我们需要什么数据出发日期 天数 人均费用 人物 玩法 地点 浏览量...
2. 分析网页 确定我们的数据来源静态页面

代码实现步骤:

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

导入模块

import random
import time
import requests     # 发送网络请求
import parsel       # 筛选数据模块
import csv          # 保存数据

爬取旅游网数据

1. 向目标网站发送网络请求
csv_qne = open('去哪儿.csv', mode='a', encoding='utf-8', newline='')
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'# 写爬虫 没有太大区别# post里面需要加一些请求参数# 在网站开发当中 get请求不是很安全的请求 有长度限制的# post 更加安全 提交表单数据内容 没有长度限制的response = requests.get(url)# <Response [200]>: 访问成功了, 接下来我们就只需要拿数据就行了
2. 获取数据 网页源代码
    html_data = response.text
3. 筛选我们需要的数据 所有的详情页链接
    selector = parsel.Selector(html_data)# css选择器提取网页内容# 需要有网页开发基础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 = 'https://travel.qunar.com/travelbook/note/' + detail_id
4. 向 每一个详情页 链接发送网络请求
        response_1 = requests.get(detail_url)
5. 获取数据 网页源代码
        data_html_1 = response_1.text
6. 提取数据
        #   出发日期 天数 人均费用 人物 玩法 地点 浏览量...selector_1 = parsel.Selector(data_html_1)# ::text 提取标签里面文本内容 *所有# 标题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.info()
#%%data = data[~data['地点'].isin(['攻略'])]
data = data[~data['天数'].isin(['99+'])]
data
#%%data.drop_duplicates(inplace=True)
#%%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
#%%data = data.reset_index(drop=True)
data
#%%data = data.reset_index(drop=True)
data
#%%def Month(e):m = str(e).split('/')[2]if m=='01':return '一月'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
#%%import re
#%%def Look(e):if '万' in e:num1 = re.findall('(.*?)万',e)return float(num1[0])*10000else:return float(e)
#%%data['浏览次数'] = data['浏览量'].apply(Look)
data.drop(['浏览量'],axis = 1,inplace = True)
data['浏览次数'] = data['浏览次数'].astype(int)
data.head()
#%%data1 = data
data1['地点'].value_counts().head(10)
#%%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]
#%% md## 一、旅游胜地Top10及对应费用
#%%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).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()
#%%data1['天数'].value_counts()
#%%data1['旅行时长'] = data1['天数'].apply(lambda x:str(x) + '天')
data1
#%%data1['人物'].value_counts()
#%%m = data1['浏览次数'].sort_values(ascending=False).index[:].tolist()
#%%data1 = data1.loc[m]
data1 = data1.reset_index(drop = True)
data1
#%%data1['旅行月份'].value_counts()
#%%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()
#%% md## 出游方式分析
#%%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()

(完整代码文末名片获取)

综上述分析可得到一些结论:

  1. 个人认为性价比较高的旅游城市:三亚、成都。

  2. 旅游天数大多控制在2-5天内,不宜过多。

  3. 三五好友一起旅游是最令人们喜欢的出游方式。

  4. “摄影”与“美食”已成为旅游的代名词。


今天的文章就是这样啦~

我是小熊猫,咱下篇文章再见啦(✿◡‿◡)

python简直旅游好帮手:【爬虫+数据分析】这不玩个遍?相关推荐

  1. Python采集去哪儿旅游攻略(爬虫+数据分析),快过年了,这不得全家一起出去玩一次

    本次目的: Python采集去哪儿旅游攻略(爬虫+数据分析) 内容介绍: 2021有哪些好玩的地方?今天用python分析适合年轻人的旅游攻略 (数据分析) 知识点: requests 发送网络请求 ...

  2. Python实战案例:旅游方面博文的数据分析

    Python实战案例:旅游方面博文的数据分析 一.旅游方面博文数据展示 数据分析的出现便利了每个人,企业,竞争者.在以前的时候,如果想要了解市场的动向,就设计了调查问卷或者现场采访的方式,以至于被很多 ...

  3. Python爬虫+数据分析+数据可视化(分析《雪中悍刀行》弹幕)

    Python爬虫+数据分析+数据可视化(分析<雪中悍刀行>弹幕) 哔哔一下 爬虫部分 代码部分 效果展示 数据可视化 代码展示 效果展示 视频讲解 福利环节 哔哔一下 雪中悍刀行兄弟们都看 ...

  4. Python爬虫数据分析毕业论文,Python爬虫数据可视化

    如何用Python爬虫抓取网页内容? 爬虫流程其实把网络爬虫抽象开来看,它无外乎包含如下几个步骤模拟请求网页.模拟浏览器,打开目标网站.获取数据.打开网站之后,就可以自动化的获取我们所需要的网站数据. ...

  5. 对爬虫数据分析的同学不要错过啦 数据分析数据可视化: Matplotlib

    Matplotlib 是 Python 中最基本的可视化工具,官网里 (( https://matplotlib.org/) 有无数好资料,但这不是重点,本文肯定和市面上的所有讲解都不一样. 和 Nu ...

  6. 基于Python的旅游景点的数据采集与分析的研究

    在旅游景点不断扩张,本基于Python的旅游景点的数据采集与分析系统按照软件开发方法进行研究,对系统先进行需求分析,确定系统必须做什么,进而进行系统设计,设计出满足需求的新系统,最后才是系统功能实现以 ...

  7. bilibili爬虫+数据分析

    Python爬虫+数据分析+数据可视化实战 Python爬虫+数据分析+数据可视化实战 1. 背景介绍 2. 需求目标 3. 基于urllib的bangumi和bilibili一键爬虫脚本的编写 3. ...

  8. 人机对战?学会Python简直开挂!

    我最近看中了一款CPU,结果被价格劝退. 本来想提前练练手速,等到六一八那天再冲. 结果被来我家玩的表弟知道了,他嘿嘿一笑. "这年头还靠手速?我来帮你抢." 只见他打开电脑,刷刷 ...

  9. [Python从零到壹] 十一.数据分析之Numpy、Pandas、Matplotlib和Sklearn入门知识万字详解(1)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

最新文章

  1. 搭建oracleRAC详解(裸设备)
  2. 咨询的真相8:咨询业的“前世今生”
  3. VS Code的Error: Running the contributed command: ‘_workbench.downloadResource‘ failed解决
  4. 超硬核的 OCR 开发利器推荐:从场景案例到实操演示,快速掌握OCR模型训练
  5. java游戏有个按技能是旋风_快打旋风加难技能增强版
  6. Platform回获取一些系统的路径和参数
  7. 【基础】杨辉三角python题解
  8. php微信公众号退款,微信公众号支付--4--微信退款
  9. 虚拟服务器修改教程,飘渺雪域商业一键虚拟端+修改元宝教程【无标题亲测
  10. 客厅经济回潮,强势崛起的OTT大屏如何赢得广告主选择?
  11. html iframe自动高度,iframe高度自适应撑开
  12. 1098:质因数分解(信奥)
  13. 内外兼修:Oracle ACED熊军谈Oracle学习
  14. 2022年最新的Gmail用户统计数据
  15. 小程序组件-仿微信通讯录
  16. html中td,dd属性,HTML的dl、dt、dd标记制作表格对决Table制作表过
  17. mysql 短路_MySQL是否对if()函数短路?
  18. 怎样用word2007比较两篇文章的差异
  19. 云数据中心备份容灾设计方案
  20. 左边 i 位取反 题解

热门文章

  1. 6.2神经网络算法实现--python机器学习
  2. oracle矩阵函数,R语言矩阵matrix函数
  3. MySQL 常见的数据库查询性能优化手段
  4. 【Prompt工程】爱因斯坦说:问题的表述往往比解决问题更为重要——这也许就是“提示工程”的本质……
  5. 松本行弘的程序世界-不求精,但求全
  6. win2003发布网站的问题
  7. PPT在放映时常需要注意的几个技巧
  8. 以太网的帧间隙、前导码、帧开始定界符
  9. Redis应用(五)---集合类型
  10. guava排序器Ordering