來源:公司資(zī)訊 | 2021.08.17
前語
今日咱們共享一(yī)個小(xiǎo)案例,獲取氣候數據,進行可視化剖析,帶你直觀了解氣候狀況!
一(yī)、中(zhōng)心功能設計
整體(tǐ)來說,咱們需求先對我(wǒ)國氣候網中(zhōng)的氣候數據進行爬取,保存爲csv文件,并将這些數據進行可視化剖析展示。
拆解需求,大(dà)緻能夠整理出咱們需求分(fēn)爲以下(xià)幾步結束:
通過爬蟲獲取我(wǒ)國氣候網7.20-7.21的降雨數據,包含城市,風力方向,風級,降水量,相對濕度,空氣質量。
對獲取的氣候數據進行預處理,剖析河南(nán)的風力等級和風向,制造風向風級雷達圖。
依據獲取的溫度和濕度制造溫濕度相關性剖析圖,進行溫度、濕度對比剖析。
依據獲取的各城市的降雨量,可視化近24小(xiǎo)時的每小(xiǎo)時時段降水狀況。
制造各城市24小(xiǎo)時的累計降雨量。
依據對數據剖析,回來的json格式數據,不難發現:
101180101便是代表城市編号
7天的氣候預告數據信息在div标簽中(zhōng)并且id=“7d”
日期、氣候、溫度、風級等信息都在ul和li标簽
網頁結構咱們上面現已剖析好了,那麽咱們就能夠來着手爬取所需求的數據了。獲取到一(yī)切的數據資(zī)源之後,能夠把這些數據保存下(xià)來。
請求網站:
氣候網的網址:http://www.weather.com.cn/weather/101180101.shtml。假如想爬取不同的區域隻需修改畢竟的101180101區域編号,前面的weather代表是7天的網頁。
def getHTMLtext(url):
"""請求獲得網頁内容"""
try:
r = requests.get(url, timeout = 30)
r.raise_for_status()
r.encoding = r.apparent_encoding
print("Success")
return r.text
except:
print("Fail")
return" "
1
2
3
4
5
6
7
8
9
10
11
處理數據:
選用BeautifulSoup庫對剛剛獲取的字符串進行數據提取。獲取咱們需求的風力方向,風級,降水量,相對濕度,空氣質量等。
def get_content(html,cityname):
"""處理得到有用信息保存數據文件"""
final = [] # 初始化一(yī)個列表保存數據
bs = BeautifulSoup(html, "html.parser") # 創建BeautifulSoup方針
body = bs.body
data = body.find('div', {'id': '7d'}) # 找到div标簽且id = 7d
# 下(xià)面爬取當天的數據
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(cityname+'市') # 增加城市
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)
data_all.append(temp)
count = count +1
# 下(xià)面爬取24h的數據
ul = data.find('ul') # 找到一(yī)切的ul标簽
li = ul.find_all('li') # 找到左右的li标簽
i = 0 # 操控爬取的天數
for day in li: # 遍曆找到的每一(yī)個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下(xià)面的p标簽,提取第一(yī)個p标簽的值,即氣候
temp.append(inf[0].string)
tem_low = inf[1].find('i').string # 找到最低氣溫
if inf[1].find('span') is None: # 氣候預告或許沒有最高氣溫
tem_high = None
else:
tem_high = inf[1].find('span').string # 找到最高氣溫
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