今天跟大家分享一下基于Python的上海天氣數(shù)據(jù)獲取(含空氣質(zhì)量數(shù)據(jù))。

本次分享的數(shù)據(jù)來源是“2345天氣預(yù)報網(wǎng)”(http://tianqi.2345.com/wea_history/58362.htm),尤其在2016年以后數(shù)據(jù)中新增了有關(guān)空氣質(zhì)量的指標,具體可見下圖:

首先看看數(shù)據(jù)是否直接嵌在html網(wǎng)頁中,最有效的方法是在原網(wǎng)頁中選擇不同的年份和月份,看看鏈接是否發(fā)生變動。經(jīng)測試,網(wǎng)頁鏈接無變化,那就說明天氣數(shù)據(jù)一定異步存儲在別的文件中,接下來就要找到這個存儲數(shù)據(jù)的文件了。

按照爬蟲的一般套路,首先在原網(wǎng)頁中按入F12快捷鍵,選擇Network,然后再從原網(wǎng)頁中選擇不同的年份或月份,你就會從XHR或JS中找到那個文件。很顯然,這里的天氣數(shù)據(jù)是存儲在JS文件中的:

接下來就是確定這個文件的鏈接地址,如下圖所示,這個鏈接還是非常簡潔的,你可以選擇不同的年份或月份,發(fā)現(xiàn)這些鏈接的規(guī)律,然后一次性生成這些具有規(guī)律的鏈接。

# 生成所有目標鏈接,用于后期的爬蟲

urls = []

foryear inrange( 2011, 2018):

formonth inrange( 1, 13):

ifyear <= 2016: urls.append( 'http://tianqi.2345.com/t/wea_history/js/58362_%s%s.js'%(year,month))

else:

ifmonth< 10: urls.append( 'http://tianqi.2345.com/t/wea_history/js/%s0%s/58362_%s0%s.js'%(year,month,year,month))

else: urls.append( 'http://tianqi.2345.com/t/wea_history/js/%s%s/58362_%s%s.js'%(year,month,year,month))urls

不妨以urls中的第一個鏈接為例,看看能夠從中抓到什么內(nèi)容:

# 導(dǎo)入模塊

importrequests

# 對目標鏈接發(fā)送請求

url = urls[ 0]response = requests.get(url).textresponse

很棒,所有跟天氣相關(guān)的數(shù)據(jù),都可以獲取到,接下來通過正則表達式將每個關(guān)心的字段都存儲到列表中:

# 導(dǎo)入模塊

importre

# 正則匹配

ymd = re.findall( "ymd:'(.*?)',",response)high = re.findall( "bWendu:'(.*?)℃',",response)low = re.findall( "yWendu:'(.*?)℃',",response)tianqi = re.findall( "tianqi:'(.*?)',",response)fengxiang = re.findall( "fengxiang:'(.*?)',",response)fengli = re.findall( ",fengli:'(.*?)'",response)aqi = re.findall( "aqi:'(.*?)',",response)aqiInfo = re.findall( "aqiInfo:'(.*?)',",response)aqiLevel = re.findall( ",aqiLevel:'(.*?)'",response)

最終,可以使用for循環(huán)完成所有鏈接數(shù)據(jù)的獲取,得到如下形式的一張表格:

1.《上海歷史天氣和空氣質(zhì)量數(shù)據(jù)獲取》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。

2.《上海歷史天氣和空氣質(zhì)量數(shù)據(jù)獲取》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。

3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/keji/18881.html