前言
大家早好、午好、晚好吖 ❤ ~欢迎光临本文章
前几天的长沙,白天大太阳,晚上下暴雨
一点也琢磨不透天气老人家它的想法
顺便哔哔一点生活小插曲:
前几天的时候,我出门,家里的几扇窗户开着在透气
等我十一点回到家,我的客厅和厨房进了一地的水
太让人伤心了,好啦,话不多说!让我们进入正题吧
用python对天气数据进行采集,并作可视化图表
知识点:
-
动态数据抓包
-
requests发送请求
-
结构化+非结构化数据解析
开发环境:
-
python 3.8 运行代码
-
pycharm 2022.3.2 辅助敲代码 专业版
-
requests 发送请求 pip install requests
-
parsel 解析数据 pip install parsel
第三方模块安装:
win + R 输入cmd 输入安装命令 pip install 模块名
(如果你觉得安装速度比较慢, 你可以切换国内镜像源)
完整源码、教程 点击此处跳转文末名片获取 ,我都放在这里了。
代码展示
采集数据
采集代码流程实现
-
通过代码的方式访问 数据来源地址
-
访问之后 将 数据内容 拿到
-
将数据内容中 我们需要的内容取出来 不需要的内容 就剔除掉
-
保存到表格当中
代码展示
import requests # 发送请求的第三方库 用来访问网站的
import parsel # 第三方库 提取数据的
import csv # 内置模块 无需安装
创建一个表格文件 csv
mode='a'
: 追加写入
encoding='utf-8'
: 编码方式
newline=''
: 数据空行
f = open('tianqi.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.writer(f)
多页采集
for year in range(2013, 2023):
for month in range(1, 13):
请求链接
url = f'https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=54511&areaInfo%5BareaType%5D=2&date%5Byear%5D={
year}&date%5Bmonth%5D={
month}'
- 通过代码的方式访问 数据来源地址
response = requests.get(url)
- 访问之后 将 数据内容 拿到
json_data = response.json()
- 将数据内容中 我们需要的内容取出来 不需要的内容 就剔除掉
html_data = json_data['data']
# html_data: 网页代码
# 网页代码的取值 如何取值?
# tr: 标签名
select = parsel.Selector(html_data)
# 拿到所有的tr
trs = select.css('tr') # 方式方法很多, 只要你能匹配到数据 都是好方法
# 将每个tr单独提取出来
for tr in trs[1:]:
源码、解答、教程等加V:qian97378免费领取
# 针对每个 tr 将其中的td 所有的内容取出来
# getall(): 取内容
# ::text: 提取标签里面的文本内容
tds = tr.css('td::text').getall()
- 保存到表格当中
csv_writer.writerow(tds)
可视化代码展示
导入包
import pandas as pd
import datetime
from pyecharts import options as opts
from pyecharts.charts import *
from pyecharts.commons.utils import JsCode
读入数据
data = pd.read_csv('天气.csv')
data
数据预览
data.sample(5)
分割日期/星期
data[['日期','星期']] = data['日期'].str.split(' ',expand=True,n=1)
data
去除多余字符
data[['最高温度','最低温度']] = data[['最高温度','最低温度']].apply(lambda x: x.str.replace('°','').replace('', '0'))
data.head()
计算下雪天气
data.loc[data['天气'].str.contains('雪'),'下雪吗']='是'
data.fillna('否',inplace=True)
分割日期时间
data['日期'] = pd.to_datetime(data['日期'])
data[['最高温度','最低温度']] = data[['最高温度','最低温度']].astype('int')
data['年份'] = data['日期'].dt.year
data['月份'] = data['日期'].dt.month
data['日'] = data['日期'].dt.day
# 预览
data.sample(5)
各城市初雪的时间
s_data = data[data['下雪吗']=='是']
s_data[(s_data['月份']>=9)].groupby('年份').first().reset_index()
各城市下雪天气分布
s_data.groupby(['城市','年份'])['日期'].count().to_frame('下雪天数').reset_index()
做透视表
data_bj = data[(data['年份'] == 2021) & (data['城市'] == '北京')]
data_bj = data_bj.groupby(['月份',