python天⽓预报可视化分析⼼得体会_Python爬取天⽓数据及
可视化分析
Python爬取天⽓数据及可视化分析
说在前⾯
天⽓预报我们每天都会关注,我们可以根据未来的天⽓增减⾐物、安排出⾏,每天的⽓温、风速风向、相对湿度、空⽓质量等成为关注的焦点。本次使⽤python中requests和BeautifulSoup库对中国天⽓⽹当天和未来14天的数据进⾏爬取,保存为csv⽂件,之后⽤matplotlib、numpy、pandas对数据进⾏可视化处理和分析,得到温湿度度变化曲线、空⽓质量图、风向雷达图等结果,为获得未来天⽓信息提供了有效⽅法。
1.数据获取
请求⽹站链接
def getHTMLtext(url):
"""请求获得⽹页内容"""
try:属性同好会动画
r = (url, timeout = 30)
r.raise_for_status()
print("成功访问")
bait记忆方法
except:
print("访问错误")
return" "
提取有⽤信息
这⾥采⽤BeautifulSoup库对刚刚获取的字符串进⾏数据提取,⾸先对⽹页进⾏检查,到需要获取数据的标签:
删除文件不进入回收站
可以发现7天的数据信息在div标签中并且id=“7d”,并且⽇期、天⽓、温度、风级等信息都在ul和li标签中,所以我们可以使⽤BeautifulSoup对获取的⽹页⽂本进⾏查div标签id=“7d”,出他包含的所有的ul和li标签,之后提取标签中相应的数据值,保存到对应列表中。这⾥要注意⼀个细节就是有时⽇期没有最⾼⽓温,对于没有数据的情况要进⾏判断和处理。另外对于⼀些数据保存的格式也要提前进⾏处理,⽐如温度后⾯的摄⽒度符号,⽇期数字的提取,和风级⽂字的提取,这需要⽤到字符查及字符串切⽚处理。
def get_content(html):
"""处理得到有⽤信息保存数据⽂件"""
handle和deal with的区别
final = [] # 初始化⼀个列表保存数据
bs = BeautifulSoup(html, "html.parser") # 创建BeautifulSoup对象body = bs.body
data = body.find('div', {'id': '7d'}) # 到div标签且id = 7d
# 下⾯爬取当天的数据
data2 = body.find_all('div',{'class':'left-div'})
text = data2[2].find('script').string
text = text[text.index('=')+1 :-2] # 移除改var data=将其变为json数据jd = json.loads(text)
dayone = jd['od']['od2'] # 到当天的数据
final_day = [] # 存放当天的数据
count = 0
for i in dayone:
temp = []
if count <=23:
temp.append(i['od21']) # 添加时间
temp.append(i['od22']) # 添加当前时刻温度
temp.append(i['od24']) # 添加当前时刻风⼒⽅向
temp.append(i['od25']) # 添加当前时刻风级
temp.append(i['od26']) # 添加当前时刻降⽔量
temp.append(i['od27']) # 添加当前时刻相对湿度
temp.append(i['od28']) # 添加当前时刻控制质量
#print(temp)
final_day.append(temp)
count = count +1
# 下⾯爬取7天的数据
ul = data.find('ul') # 到所有的ul标签
li = ul.find_all('li') # 到左右的li标签
i = 0 # 控制爬取的天数
for day in li: # 遍历到的每⼀个li
if i < 7 and i > 0:
temp = [] # 临时存放每天的数据
date = day.find('h1').string # 得到⽇期
date = date[0:date.index('⽇')] # 取出⽇期号
temp.append(date)
inf = day.find_all('p') # 出li下⾯的p标签,提取第⼀个p标签的值,即天⽓
temp.append(inf[0].string)
tem_low = inf[1].find('i').string # 到最低⽓温python请求并解析json数据
if inf[1].find('span') is None: # 天⽓预报可能没有最⾼⽓温
tem_high = None
else:
tem_high = inf[1].find('span').string # 到最⾼⽓温
java hashmap排序temp.append(tem_low[:-1])
if tem_high[-1] == '℃':
temp.append(tem_high[:-1])
else:
temp.append(tem_high)
wind = inf[2].find_all('span')# 到风向
for j in wind:
temp.append(j['title'])
wind_scale = inf[2].find('i').string # 到风级
index1 = wind_scale.index('级')
temp.append(int(wind_scale[index1-1:index1]))
final.append(temp)
i = i + 1
return final_day,final
同样对于/weather15d:15天的信息,也做同样的处理,这⾥经过查看后发现他的15天⽹页中只有8-1
4天,前⾯的1-7天在/weather 中,这⾥就分别访问两个⽹页将爬取得到的数据进⾏合并得到最终14天的数据。
前⾯是未来14天的数据爬取过程,对于当天24⼩时的天⽓信息数据,经过查发现他是⼀个json数据,可以通过json.loads()⽅法获取当天的数据,进⽽对当天的天⽓信息进⾏提取。
保存csv⽂件
前⾯将爬取的数据添加到列表中,这⾥引⼊csv库,利⽤f_csv.writerow(header)和f_csv.writerows(data)⽅法,分别写⼊表头和每⼀⾏的数据,这⾥将1天和未来14天的数据分开存储,分别保存为weather1.csv和weather14.csv,下⾯是他们保存的表格图:
2.可视化分析
当天温度变化曲线图
采⽤matplotlib中plt.plot()⽅法绘制出⼀天24⼩时的温度变化曲线,并⽤()⽅法点出最⾼温和最低温,并画出平均温度线,下图为温度变化曲线图:(代码见附录)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。