8天长假快来了,Python分析【去哪儿旅游攻略】数据,制作可视化图表

news/2025/2/4 5:55:00/

目录

  • 前言
      • 环境使用
      • 模块使用
      • 数据来源分析
  • 代码实现
      • 导入模块
      • 请求数据
      • 解析
      • 保存
  • 数据可视化
      • 导入模块、数据
      • 年份分布情况
      • 月份分布情况
      • 出行时间情况
      • 费用分布情况
      • 人员分布情况

前言

2023年的中秋节和国庆节即将来临,好消息是,它们将连休8天!这个长假为许多人提供了绝佳的休闲机会,让许多人都迫不及待地想要释放他们被压抑已久的旅游热情,所以很多朋友已经开始着手规划他们的旅游行程。

今天我们来分析下去哪儿的旅游攻略数据,看看吃、住、游玩在价位合适的情况下,怎样才能玩的开心

环境使用

Python 3.8
Pycharm

模块使用

requests
parsel
csv

数据来源分析

  1. 明确需求

这次选的月份为10 ~ 12月,游玩费用为1000 ~ 2999这个价位


2. 抓包分析

按F12,打开开发者工具,点击搜索,输入你想要的数据

找到数据链接

https://travel.qunar.com/travelbook/list.htm?page=1&order=hot_heat&&month=10_11_12&avgPrice=2

代码实现

导入模块

import requests
import parsel
import csv

请求数据

模拟浏览器: <可以直接复制>
response.text 获取响应文本数据
response.json() 获取响应json数据
response.content 获取响应二进制数据
我们使用requests.get()方法向指定的URL发送GET请求,并获取到响应的内容

url = f'https://travel.qunar.com/travelbook/list.htm?page=1&order=hot_heat&&month=10_11_12&&avgPrice=2'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
response = requests.get(url, headers=headers)

解析

先取响应文本数据

selector = parsel.Selector(response.text)

css选择器::根据标签属性提取数据内容,看元素面板, 为了帮助找到数据标签,

lis = selector.css('.list_item')
for li in lis:title = li.css('.tit a::text').get()user_name = li.css('.user_name a::text').get()date = li.css('.date::text').get()days = li.css('.days::text').get()photo_nums = li.css('.photo_nums::text').get()fee = li.css('.fee::text').get()people = li.css('.people::text').get()trip = li.css('.trip::text').get()places = ''.join(li.css('.places ::text').getall()).split('行程')place_1 = places[0].replace('途经:', '')place_2 = places[-1].replace(':', '')href = li.css('.tit a::attr(href)').get().split('/')[-1]link = f'https://travel.qunar.com/travelbook/note/{href}'dit = {'标题': title,'昵称': user_name,'日期': date,'耗时': days,'照片': photo_nums,'费用': fee,'人员': people,'标签': trip,'途径': place_1,'行程': place_2,'详情页': link,}print(title, user_name, date, days, photo_nums, fee, people, trip, place_1, place_2, link, sep=' | ')

保存

f = open('data.csv', mode='w', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['标题','昵称','日期','耗时','照片','费用','人员','标签','途径','行程','详情页',
])
csv_writer.writeheader()

数据可视化

导入模块、数据

import pandas as pddf = pd.read_csv('data.csv')
df.head()

年份分布情况

from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker
num = df['年份'].value_counts().to_list()
info = df['年份'].value_counts().index.to_list()
c = (Pie().add("",[list(z)for z in zip(info,num,)],center=["40%", "50%"],).set_global_opts(title_opts=opts.TitleOpts(title="年份分布情况"),legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
#     .render("pie_scroll_legend.html")
)
c.render_notebook()

月份分布情况

from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker
num = df['月份'].value_counts().to_list()
info = df['月份'].value_counts().index.to_list()
c = (Pie().add("",[list(z)for z in zip(info,num,)],center=["40%", "50%"],).set_global_opts(title_opts=opts.TitleOpts(title="月份分布情况"),legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
#     .render("pie_scroll_legend.html")
)
c.render_notebook()

出行时间情况

from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker
num = df['耗时'].value_counts().to_list()
info = df['耗时'].value_counts().index.to_list()
c = (Pie().add("",[list(z)for z in zip(info,num,)],center=["40%", "50%"],).set_global_opts(title_opts=opts.TitleOpts(title="出行时间情况"),legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
#     .render("pie_scroll_legend.html")
)
c.render_notebook()

费用分布情况

from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker
num = df['费用'].value_counts().to_list()
info = df['费用'].value_counts().index.to_list()
c = (Pie().add("",[list(z)for z in zip(info,num,)],center=["40%", "50%"],).set_global_opts(title_opts=opts.TitleOpts(title="费用分布情况"),legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
#     .render("pie_scroll_legend.html")
)
c.render_notebook()

人员分布情况

from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker
num = df['人员'].value_counts().to_list()
info = df['人员'].value_counts().index.to_list()
c = (Pie().add("",[list(z)for z in zip(info,num,)],center=["40%", "50%"],).set_global_opts(title_opts=opts.TitleOpts(title="人员分布情况"),legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
#     .render("pie_scroll_legend.html")
)
c.render_notebook()


适合练手的25个Python案例源码分享,总有一个你想要的

👇问题解答 · 源码获取 · 技术交流 · 抱团学习请联系👇


http://www.ppmy.cn/news/1074056.html

相关文章

node升级带来的问题及解决方案(digital envelope routines::unsupported)

由于项目需要将 node版本从16升级到了18&#xff0c;但是原有的老项目还是使用的16的环境&#xff0c;导致在运行老版本的时候出现错误 错误信息如下 Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:71:19)at Object.…

遇到 Binder这些面试题,你会怎么答?

作为开发人员&#xff0c;每个人都有每个人擅长领域&#xff0c;自然也有自己不擅长的领域&#xff0c;很难成为完美的一个全栈开发。在面试中最怕遇见的一件事是面试官专挑你不擅长的领域进行提问&#xff0c;目的就是看你遇到问题的应变能力。 接下给大家分享一个面试中容易被…

chorme调试移动端web页面

chorme本地调试页面方法&#xff1a; 手机开启开发者模式 iphone找不到开发者模式方法&#xff1a; 下载爱思助手&#xff0c;点击工具箱&#xff0c;找到虚拟定位&#xff0c;点击创建定位&#xff0c;确定 打开iphone的隐私与安全即可找到开发者模式&#xff0c;点击确定即可…

易混淆的符号

C自学精简教程 目录(必读) &符号在C中有多个含义。 下面我们列出常见的3种&#xff0c;你都能分得清吗&#xff1f; #include <iostream> using namespace std;//传递引用类型的参数 pass by reference void fun(int& a)//(1) 这里的 & 表示参数a是引用类…

远程管理通道安全SSH协议主机验证过程

可以使用SSH协议进行远程管理通道安全保护&#xff0c;其中涉及的主要安全功能包括主机验证、数据加密性和数据完整性保护。 这里要注意的是【主机验证】和【身份验证】的区别&#xff0c;主机验证是客户端确认所访问的服务端是目标访问对象&#xff0c;比如从从客户端A(192.16…

Kafka监控工具,LinkedIn详解

Kafka监控工具包括以下几种&#xff1a; Kafka Manager&#xff1a;这是一个开源的Kafka集群管理工具&#xff0c;可以监控Kafka集群的健康和性能&#xff0c;并提供可视化的用户界面。 Kafka Monitor&#xff1a;这是LinkedIn开发的一个监控工具&#xff0c;可以监控Kafka集群…

C++中的运算符总结(5):按位逻辑运算符

C中的运算符总结&#xff08;5&#xff09;&#xff1a;按位逻辑运算符 9、按位运算符 NOT&#xff08; &#xff5e;&#xff09;、 AND&#xff08; &&#xff09;、 OR&#xff08; |&#xff09;和 XOR&#xff08; ^&#xff09; 逻辑运算符和按位运算符之前的差别在…

实训笔记8.30

实训笔记8.30 8.30笔记一、项目开发流程一共分为七个阶段1.1 数据产生阶段1.2 数据采集存储阶段1.3 数据清洗预处理阶段1.4 数据统计分析阶段1.5 数据迁移导出阶段1.6 数据可视化阶段 二、项目数据清洗预处理的实现2.1 清洗预处理规则2.2 代码实现 三、项目的数据统计分析阶段3…