** python爬取2345天氣網氣象數據**
由於科研需要,我需要獲取有關PM2.5數據的氣象要素,因此準備爬取2345天氣網的數據,參考了網上方法,很多都介紹的不都詳細,有的都失效了,因此這裏簡單介紹一下我的方法,供大家參考(方法不唯一)!
首先我研究的對象是北京,因此我搜索 北京的天氣數據,如圖所示:
然後我打開審查元素,點擊Network,發現54511_202003.js這裏存在我們所需要的json數據,如下圖因此我們只需要能夠獲取到這裏的json數據即可。
點擊Headers,如下圖
發現Request URL就是我們需要的json數據的鏈接,可以點擊該鏈接看看,如下:
事實證明我們的猜想是對的,因此,我們只要在這個json數據裏提取我們所需要的數據即可。
附上我的全部代碼:
import requests
import pandas as pd
import re
months = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]
years = [2017, 2018, 2019,2020]
city = [54511] # 北京代碼54511,也可以設置其他城市
index_ = ['MaxTemp','MinTemp', 'WindDir', 'Wind', 'Weather'] # 選取的氣象要素
data = pd.DataFrame(columns=index_) # 建立一個空dataframe
for y in years:
for m in months:
for c in city:
# 找到json格式數據的url
url = "http://tianqi.2345.com/t/wea_history/js/"+str(y)+str(m)+'/'+str(c)+"_"+str(y)+str(m)+".js"
print(url)
response = requests.get(url=url)
if response.status_code == 200: # 防止url請求無響應
response2 = response.text.replace("'", '"') # 這一步可以忽略
# 利用正則表達式獲取5個氣象要素(方法不唯一)
date = re.findall("[0-9]{4}-[0-9]{2}-[0-9]{2}", response2)[:-2] # 去除最後兩個無關的數據
mintemp = re.findall('yWendu:"(.*?)℃', response2)
maxtemp = re.findall('bWendu:"(.*?)℃', response2)
winddir = re.findall('fengxiang:"([\u4E00-\u9FA5]+)', response2)
wind = re.findall('fengli:"(\d)[\u4E00-\u9FA5]+', response2)
weather = re.findall('tianqi:"([[\u4E00-\u9FA5]+)~?', response2)
data_spider = pd.DataFrame([maxtemp,mintemp, winddir, wind, weather]).T
data_spider.columns = index_ # 修改列名
data_spider.index = date # 修改索引
data = pd.concat((data,data_spider), axis=0) # 數據拼接
print('%s年%s月的數據抓取成功' % (y, m))
else:
print('%s年%s月的數據不存在' % (y, m))
break
data.to_excel('weatherdata.xlsx',)
print('爬取數據展示:\n', data)
代碼附有詳細註釋,應該可以看的懂,如有問題請留言,其中可以通過調節年份,城市等獲取你們想要的數據,該程序跑出結果如下圖:
由於現在是2020年3月份,因此後面月份的數據不存在,每個url鏈接都是所需要的json數據。
我將數據保存到了Excel裏,如下
當然也可以將它放到數據庫裏都可以,具體點這裏就不介紹了!覺得該博客有用的還希望點個贊支持一下!