爬虫天气python可视化,python爬取天气数据并制图
本文主要和大家分享一个用Python实现的小功能:获取天气数据,进行可视化分析,带你直观了解天气情况!感兴趣的朋友可以了解一下。
00-1010实施要求:爬虫代码:
目录
从网上获取某年的历史天气信息(任何网址,我爬的网址都会在评论区告诉你,dddd),包括每日最高气温,最低气温,天气状况,风向等。并完成以下功能:
(1)获取的数据信息存储在名为“城市名称”的csv文件中。csv”,其中每行的数据格式为“日期、最高温度、最低温度、天气和风向”;
(2)在数据中增加“平均气温”一栏,其中:平均气温=(最高气温和最低气温)/2,在同一图表中绘制两个城市一年内平均气温的变化趋势折线图;
(3)统计两个城市各种天气的天数,并绘制柱状图进行对比。假设适合旅游的城市指数在阴天为0.3,晴天为0.4,阴天为0.3,试比较两个城市哪个更适合旅游;
(4)统计这两个城市各月的平均气温,绘制折线图,通过折线图分析城市的哪个月最适合旅游;
(5)统计这两个城市一年中平均气温在18~25度,风力小于5级的天数,并假设越是这样的天气,城市越宜居,判断哪个城市更宜居;
实现需求:
随机导入
导入时间
从spider.data_storage导入数据存储
从spider.html_downloader导入html下载程序
从spider.html_parser导入HtmlParser
SpiderMain:类
def __init__(self):
self . html _ downloader=html downloader()
self.html_parser=HtmlParser()
self.data_storage=DataStorage()
定义开始(自身):
爬虫启动方法
使用下载器下载获取的url
解析html
数据存取
:返回:
对于范围(1,13)内的I, #以循环方式依次爬行。
Time.sleep (random.randint (0,10)) #随机休眠0到40s,防止ip被阻止
url=XXXX
如果i10:
Url=url 20210 str(i)。html #拼接URL
else:
url=url 2021 str(i)。 html
html=self . html _ downloader . download(URL)
resultWeather=self . html _ parser . parser(html)
如果i==1:
T=[日期,最高温度,最低温度,天气,风向]
resultWeather.insert(0,t)
self.data_storage.storage(结果天气)
if __name__==__main__:
main=SpiderMain()
main.start()
将请求作为请求导入
类HtmlDownloader:
定义下载(自我,网址):
根据给定的url下载网页
:param url:
:返回:下载的文本
headers={ 用户代理 :
Mozilla/5.0(Windows NT 10.0;Win64x64rv:101.0)壁虎/20100101火狐/101.0}
结果=请求
ts.get(url,headers=headers)
return result.content.decode(utf-8)
此处大家需要注意,将User-Agent换成自己浏览器访问该网址的,具体如何查看呢,其实很简单,只需大家进入网站后,右键网页,然后点击检查将出现这样的界面:
然后只需再点击网络,再随便点击一个请求,如下图:
就可以进入如下图,然后再复制,图中User-Agent的内容就好了!
继续:
from bs4 import BeautifulSoupclass HtmlParser:
def parser(self,html):
"""
解析给定的html
:param html:
:return: area set
"""
weather = []
bs = BeautifulSoup(html, "html.parser")
body = bs.body # 获取html中的body部分
div = body.find(div, {class:, tian_three}) # 获取class为tian_three的<div></div>
ul = div.find(ul) # 获取div中的<ul></ul>
li = ul.find_all(li) # 获取ul中的所有<li></li>
for l in li:
tempWeather = []
div1 = l.find_all("div") # 获取当前li中的所有div
for i in div1:
tempStr = i.string.replace("℃", "") # 将℃进行替换
tempStr = tempStr.replace(" ", "") # 替换空格
tempWeather.append(tempStr)
weather.append(tempWeather)
return weather
import pandas as pdclass DataStorage:
def storage(self,weather):
"""
数据存储
:param weather list
:return:
"""
data = pd.DataFrame(columns=weather[0], data=weather[1:]) # 格式化数据
data.to_csv("C:\\Users\\86183\\Desktop\\成都.csv", index=False, sep=",",mode="a") # 保存到csv文件当中
注意,文件保存路径该成你们自己的哦!
ok,爬取代码就到这,接下来是图形化效果大致如下:
代码如下:
import pandas as pdimport matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"] # 设置字体
plt.rcParams["axes.unicode_minus"] = False # 该语句解决图像中的“-”负号的乱码问题
def broken_line_chart(x, y1, y2): # 折线图绘制函数
plt.figure(dpi=500, figsize=(10, 5))
plt.title("泸州-成都每日平均气温折线图")
plt.plot(x, y1, color=cyan, label=泸州)
plt.plot(x, y2, color=yellow, label=成都)
# 获取图的坐标信息
coordinates = plt.gca()
# 设置x轴每个刻度的间隔天数
xLocator = mpl.ticker.MultipleLocator(30)
coordinates.xaxis.set_major_locator(xLocator)
# 将日期旋转30°
plt.xticks(rotation=30)
plt.xticks(fontsize=8)
plt.ylabel("温度(℃)")
plt.xlabel("日期")
plt.legend()
plt.savefig("平均气温走势折线图.png") # 平均气温折线图
plt.show()
plt.close()
data_luZhou = pd.read_csv(C:\\Users\\86183\\Desktop\\泸州.csv)
data_chengdu = pd.read_csv(C:\\Users\\86183\\Desktop\\成都.csv)
# 将列的名称转为列表类型方便添加
columS = data_luZhou.columns.tolist()
columY = data_chengdu.columns.tolist()
# 将数据转换为列表
data_luZhou=np.array(data_luZhou).tolist()
data_chengdu=np.array(data_chengdu).tolist()
# 在最开始的位置上添加列的名字
data_luZhou.insert(0, columS)
data_chengdu.insert(0, columY)
# 添加平均气温列
data_luZhou[0].append("平均气温")
data_chengdu[0].append("平均气温")
weather_dict_luZhou = {}
weather_dict_chengdu = {}
for i in range(1, len(data_luZhou)):
# 去除日期中的星期
data_luZhou[i][0] = data_luZhou[i][0][0:10]
data_chengdu[i][0] = data_chengdu[i][0][0:10]
# 获取平均气温
average_luZhou = int((int(data_luZhou[i][1]) + int(data_luZhou[i][2])) / 2)
average_chengdu = int((int(data_chengdu[i][1]) + int(data_chengdu[i][2])) / 2)
# 将平均气温添加进入列表中
data_luZhou[i].append(average_luZhou)
data_chengdu[i].append(average_chengdu)
# 将新的数据存入新的csv中
new_data_luZhou = pd.DataFrame(columns=data_luZhou[0], data=data_luZhou[1:])
new_data_chengdu = pd.DataFrame(columns=data_chengdu[0], data=data_chengdu[1:])
new_data_luZhou.to_csv("D:/PythonProject/spider/泸州.csv", index=False, sep=",")
new_data_chengdu.to_csv("D:/PythonProject/spider/成都.csv", index=False, sep=",")
# 折线图的绘制
y1 = np.array(new_data_luZhou.get("平均气温")).tolist()
y2 = np.array(new_data_chengdu.get("平均气温")).tolist()
x = np.array(new_data_luZhou.get("日期")).tolist()
broken_line_chart(x, y1, y2)
# 进行每个月的平均气温求解
new_data_luZhou["日期"] = pd.to_datetime(new_data_luZhou["日期"])
new_data_chengdu["日期"] = pd.to_datetime(new_data_chengdu["日期"])
new_data_luZhou.set_index("日期", inplace=True)
new_data_chengdu.set_index("日期", inplace=True)
# 按月进行平均气温的求取
month_l = new_data_luZhou.resample(m).mean()
month_l = np.array(month_l).tolist()
month_c = new_data_chengdu.resample(m).mean()
month_c = np.array(month_c).tolist()
length = len(month_c)
month_average_l = []
month_average_c = []
for i in range(length):
month_average_l.append(month_l[i][2])
month_average_c.append(month_c[i][2])
month_list = [str(i) + "月" for i in range(1, 13)]
plt.figure(dpi=500, figsize=(10, 5))
plt.title("泸州-成都每月平均折线气温图")
plt.plot(month_list, month_average_l, color="cyan",label="泸州", marker=o)
plt.plot(month_list, month_average_c, color="blue",label=成都, marker=v)
for a, b in zip(month_list, month_average_l):
plt.text(a, b + 0.5, %.2f % b, horizontalalignment=center, verticalalignment=bottom, fontsize=6)
for a, b in zip(month_list, month_average_c):
plt.text(a, b - 0.5, %.2f % b, horizontalalignment=center, verticalalignment=bottom, fontsize=6)
plt.legend()
plt.xlabel("月份")
plt.ylabel("温度(℃)")
plt.savefig("月平均气温折线图.png") # 月平均气温折线图
plt.show()
#
# 只获取两列的数据
data_l = pd.read_csv("泸州.csv", usecols=[风向, 平均气温])
data_c = pd.read_csv("成都.csv", usecols=[风向, 平均气温])
data_l = np.array(data_l).tolist()
data_c = np.array(data_c).tolist()
day_c = 0
day_l = 0
for i in range(len(data_l)):
if len(data_l[i][0]) == 5:
if int(data_l[i][0][3]) < 5 and 18 <= int(data_l[i][1]) <= 25:
day_l += 1
else:
if int(data_l[i][0][2]) < 5 and 18 <= int(data_l[i][1]) <= 25:
day_l += 1
if len(data_c[i][0]) == 5:
if int(data_c[i][0][3]) < 5 and 10 <= int(data_c[i][1]) <= 25:
day_c += 1
else:
if int(data_c[i][0][2]) < 5 and 18 <= int(data_c[i][1]) <= 25:
day_c += 1
plt.figure(dpi=500, figsize=(8, 4))
plt.title("泸州-成都平均气温在18-25且风力<5级的天数")
list_name = [泸州, 成都]
list_days = [day_l, day_c]
plt.bar(list_name, list_days, width=0.5)
plt.text(0, day_l, %.0f % day_l, horizontalalignment=center, verticalalignment=bottom, fontsize=7)
plt.text(1, day_c, %.0f % day_c, horizontalalignment=center, verticalalignment=bottom, fontsize=7)
plt.xlabel("城市")
plt.ylabel("天数(d)")
plt.savefig("适宜居住柱形图.png")
plt.show()
data_l=pd.read_csv("泸州.csv")
data_c=pd.read_csv("成都.csv")
# 将数据转换为列表
data_l=np.array(data_l).tolist()
data_c=np.array(data_c).tolist()
# 获取每种天气的天数,采用字典类型进行存储
for i in range(1,365):
weather_l = data_l[i][3]
weather_c = data_c[i][3]
if weather_l in weather_dict_luZhou:
weather_dict_luZhou[weather_l] = weather_dict_luZhou.get(weather_l) + 1
else:
weather_dict_luZhou[weather_l]=1
if weather_c in weather_dict_chengdu:
weather_dict_chengdu[weather_c]=weather_dict_chengdu.get(weather_c)+1
else:
weather_dict_chengdu[weather_c]=1
weather_list_luZhou = list(weather_dict_luZhou)
weather_list_chengdu = list(weather_dict_chengdu)
value_l = []
value_c = []
# 获取所有的天气种类
weather_list = sorted(set(weather_list_luZhou + weather_list_chengdu))
# 获取每种天气的天数,并将其对应的放入列表中,没有的则用0进行替代,方便条形图的绘制。
for i in weather_list:
if i in weather_dict_luZhou:
value_l.append(weather_dict_luZhou[i])
else:
value_l.append(0)
if i in weather_dict_chengdu:
value_c.append(weather_dict_chengdu[i])
else:
value_c.append(0)
# 绘制条形图进行对比
plt.figure(dpi=500, figsize=(10, 5))
plt.title("泸州-成都各种天气情况对比")
x1 = list(range(len(weather_list)))
x = [i + 0.4 for i in x1]
plt.bar(x1, value_l, width=0.4, color=red, label=泸州)
plt.bar(x, value_c, width=0.4, color=orange, label=成都)
for a, b in zip(x1, value_l):
plt.text(a, b + 0.4, %.0f % b, ha=center, va=bottom, fontsize=7)
for a, b in zip(x, value_c):
plt.text(a, b + 0.4, %.0f % b, ha=center, va=bottom, fontsize=7)
plt.xticks(x1, weather_list)
plt.ylabel("天数")
plt.xlabel("天气")
plt.xticks(rotation=270)
plt.legend()
plt.savefig("泸州成都天气情况对比.png")
plt.show()
plt.close()
好的这次就到这儿吧,我们下次见哦!!!
到此这篇关于Python实战实现爬取天气数据并完成可视化分析详解的文章就介绍到这了,更多相关Python爬取天气数据内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。