爬取天气数据并进行可视化

1.数据爬取

爬取天气后报官网中的武汉市2022年5月,6月,7月的天气数据:

"""爬虫:
    1.确定目标
    2.请求网页(第三方requests)
    3.解析网页 数据提取
    4.保存数据 
"""
import requests
from bs4 import BeautifulSoup
import pandas as pd
def get_data(url):
    # 1.确定目标 写在函数外
    # 2.请求网页(第三方requests)
    resp = requests.get(url)
    # print(resp) # 输出<Response [200]>表示访问正常
    # print(resp.text) # 文本形式返回网页源代码
    # print(resp.content) #二进制形式返回网页内容
    # print(resp.content.decode('gbk')) #对以二进制形式返回的网页内容进行解码,与上述text一致
    html = resp.content.decode('gbk')

    # 3.解析网页 数据提取
    # 常见的解析工具:BeautifulSoup、xpath、正则表达式
    # BeautifulSoup(html,'lxml') #lxml是第三方的解析工具,需自己下载
    soup = BeautifulSoup(html,'html.parser') #'html.parser'是自带的解析工具,速度相对较慢
    # print(soup)
    # soup.find('tr') #只搜索到第一个tr标签
    tr_list = soup.find_all('tr')# 搜索想要的数据:所有的tr标签
    dates,conditions,temp = [],[],[] # 只想要这三种数据
    for data in tr_list[1:]: # tr_list[1:]是舍弃第一个tr标签,不需要
        # sub_data = data.text #获取到数据
        sub_data = data.text.split()# 删除数据中的空白区域
        # print(sub_data)
        dates.append(sub_data[0])
        conditions.append(''.join(sub_data[1:3])) #''表示分隔符;数据取到1,取不到3
        temp.append(''.join(sub_data[3:6]))

# 4.数据整合与保存
    s_data = pd.DataFrame() # 创建一个DataFrame表格
    s_data['日期']=dates  # 列名为’日期‘
    s_data['天气状况']=conditions
    s_data['气温']=temp
    return s_data

data_5_month = get_data("http://www.tianqihoubao.com/lishi/wuhan/month/202205.html") # 五月天气情况
data_6_month = get_data("http://www.tianqihoubao.com/lishi/wuhan/month/202206.html")
data_7_month = get_data("http://www.tianqihoubao.com/lishi/wuhan/month/202207.html")

data = pd.concat([data_5_month,data_6_month,data_7_month]).reset_index(drop=True) # concat是将三个月的表格拼接到一起,保存为一个文件,默认为上下拼接
# reset_index用来重设索引顺序;drop=True是把原来的索引列去掉,重置index;drop=False是保留原来的索引,添加重置的index
data.to_csv('wuhan.csv',encoding='gbk') # 保存数据

爬取到的数据如图所示:

在这里插入图片描述

2.可视化

'''数据可视化:
1.读取数据
2.数据清洗(数据是否完整、缺失)
3.数据处理(字符串处理、时间序列处理等)
4.输出图像
'''
import pandas as pd
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#解决中文乱码问题,sans-serif表示字体中的无衬线体,SimHe是黑体
plt.rcParams['axes.unicode_minus']=False #解决负号显示问题
data=pd.read_csv('G:\python\wuhan.csv',encoding = 'gbk')
print((data.isnull()).sum())
print(data.head(5)) #显示前五行数据
data['最高气温']=data['气温'].str.split('/',expand=True)[0]
data['最低气温']=data['气温'].str.split('/',expand=True)[1]
#字符串处理
data['最高气温']=data['最高气温'].map(lambda x:int(x.replace('℃',''))) #将℃用空格替代,即删除℃
data['最低气温']=data['最低气温'].map(lambda x:int(x.replace('℃','')))

dates=data['日期']
highs=data['最高气温']
lows=data['最低气温']

#根据数据绘制图形
fig=plt.figure(dpi=128, figsize=(10,6))
plt.plot(dates, highs, color='red', alpha=0.7)# alpba指定颜色的透明度,0为完全透明,1为完全不透明
plt.plot(dates, lows, color='blue', alpha=0.4)

#给图表区域着色
plt.fill_between(dates, highs, lows, facecolor="coral", alpha=0.5)

#设置图形的格式
plt.title('2022年武汉市第二季度天气状况', fontsize=20)
plt.xlabel('日期', fontsize=12)
fig.autofmt_xdate() #绘制斜的日期标签,以免重叠
plt.ylabel('气温',fontsize=12)
plt.tick_params(axis='both',which='major',labelsize=10)#参数刻度线样式设置
plt.xticks(dates[::10])#修改刻度

plt.show()#显示每日最高气温折线图

输出:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值