使用Kettle下載氣象局各城市最新天氣數據

1、問題背景html

天氣數據,在諸多數據分析利用場景中屬於經常使用信息資源。本文爲探討Kettle應用技術,採用中國天氣網(網址:http://www.weather.com.cn)爲主要數據來源,利用Kettle的轉換能力,解析各城市七每天氣數據,導出到本地的Excel文件中。讀者能夠根據本例思路,將最終的數據加載改成DBMS等其餘永久性存儲介質,再加上天天執行的定時任務,能夠下載到各城市每一天的天氣以及七天預報數據,沉澱歷史天氣數據資源。特別聲明,本文僅爲技術探討,讀者採集互聯網信息資源時務必遵照網站版權相關規定,違規責任自負。web

 

2、輸入輸出正則表達式

中國天氣網對每一個城市都設置有一個內部編號(設爲{BH}),每一個城市對應天氣信息能夠經過網址http://www.weather.com.cn/weather/{BH}.shtml得到。例如湖南省張家界市的編號爲101251101,每日天氣數據發佈在網址http://www.weather.com.cn/weather/101251101.shtml。下圖1爲本例轉換輸入數據來源的網站截圖:微信

圖1網站

所以,若是隻須要某一個城市的天氣數據,能夠找到該城市天氣對應連接,天天下載解析保存便可。如須要全部城市的天氣數據,則首先須要獲得全部城市的名稱和內部編號。爲控制篇幅,假設已經拿到須要城市集合的編號與名稱,並保存到本地文件中,以下圖2所示。spa

圖2.net

最終的輸出目標是一個Excel文檔,內含各城市當日以及將來七每天氣數據,包括天氣、最高最低氣溫、風向、風力(以下圖3)等信息單元。其中,次日天氣信息單元名稱爲天氣2,第三每天氣信息單元名稱爲天氣3,以此類推。3d

圖3htm

3、關鍵步驟對象

具體解決思路是,首先動態生成各城市的連接地址,而後依次下載各個連接,解析出感興趣的數據塊,而後將數據塊中數據解析到具體信息單元中,保存到Excel文件。關鍵步驟闡述以下:

一、動態構造城市連接地址

比較簡單的辦法是新建一個常量字段,而後用內部編號(假設字段名爲dqdm)替換其中固定部分,這樣增長一個字符串替換步驟便可實現。本例爲了演示技術運用,採用核心對象/轉換類別中的計算器步驟。首先設置一個常量名爲wUrlC,值爲http://www.weather.com.cn/weather/;而後再設置一個常量名爲wUrlTail,值爲.shtml;最後增長一個新字段wUrl,計算公式爲A+B+C,即wUrlC+dqdm+wUrlTail。這樣,若是dqdm爲101010300,那麼wUrl的值就爲http://www.weather.com.cn/weather/101010300.shtml,恰好符合網站地址規則。計算器步驟設置以下圖4:

圖4

二、下載網頁數據

有了連接地址,下載網頁只需新建一個核心對象/查詢類別中的HTTPclient步驟便可,其中地址來自上一步構造的wUrl字段,具體設置以下圖5所示:

圖5

三、解析數據塊

上一步獲得的網站原始數據(字段名webResult)很是冗長,可是很容易捕獲到數據區域的規律。以下圖6所示,數據塊部分以<div id=」7d」 class=」c7d」>開頭,以<div class=」btn」>結束。

圖6

所以,能夠增長一個核心對象/腳本類別中的正則表達式步驟,解析到數據塊部分。按照前述規律分析結論,設置表達式以下:

[\s\S]*<div id="7d"class="c7d">([\s\S]*?)<div>[\s\S]*

其餘配置以下圖7所示。

圖7

經過上述步驟,數據塊就解析到一個名爲sevenDays的String類型字段中。

四、解析七天數據

若是隻須要今天、明天、後天三天的天氣,經過分析圖6中的數據塊,比較容易找到規律,由於其中有明顯的標誌性字符串:xx日(今天)、xx日(明天)、xx日(後天),那麼經過一個正則表達式步驟,不可貴到此三天的數據。可是,網站後幾天的數據均按照日期和星期標示,例如圖6中依次爲19日(週日)、20日(週一)、21日(週二)、22日(週三),這樣若是到了明天訪問此頁面,後幾天依次是20日(週一)、21日(週二)、22日(週三)、23日(週四)。能夠看出,最後四天的標示是動態的。所以,一種思路是利用今天日期,自動計算3天后的4個周幾,並構造出動態的正則表達式;另一種思路是,直接拆分爲7個部分,依次解析。本例採用後者,增長一個核心對象/轉換類別中的拆分字段步驟。經過對圖6中數據塊的分析,採用<li做爲拆分分隔符,依次從sevenDays字段中拆分出f1~f8共八個新字段。具體配置以下圖8所示:

圖8

部分字段拆分效果參見Kettle預覽圖9:

圖9

五、信息單元解析

有了每一天的數據子塊,後續思路都相似。只需經過增長一個核心對象/腳本類別中的正則表達式步驟,就能夠解析出某一天的一部分信息單元數據。如下簡要舉例:

  • 解析今日天氣,表達式爲:

[\s\S]*? id="hidden_title"value="(.*?)°C"[\s\S]*

  • 解析當天的風向與風力,表達式爲:

[\s\S]*?<spantitle="(.*?)"[\s\S]*?<i>(.*?)</i>[\s\S]*

  • 解析次日到第七天的天氣、最高氣溫、最低氣溫、風向、風力,表達式爲:

[\s\S]*?<p.*?class="wea".*?>(.*?)</p>[\s\S]*?<pclass="tem">[\s\S]*?<span>(.*?)</span>[\s\S]*?<i>(.*?)</i>[\s\S]*?<spantitle="(.*?)"[\s\S]*?<i>(.*?)</i>[\s\S]*

其中,第七天解析步驟的設置以下圖10所示:

圖10

因爲後面的步驟,大部分都是正則表達式,因此本文再也不一一贅述。

六、字段更名

在最後一步Excel輸出前,須要加入一個核心對象/轉換類別中的字段選擇步驟,將須要字段重命名爲中文,方便生成Excel文檔的表頭。具體配置以下圖11所示:

圖11

因爲大量臨時信息單元數據對最終輸出結果無心義,因此也能夠根據狀況,適當增長此步驟,刪除一些沒必要要的字段,這樣能夠極大節省內存消耗。

整個轉換步驟較多,整體截圖以下圖12:

圖12

4、總結

本文經過計算器、正則表達式、拆分字段等步驟操做的演示,實現了一個從原始網頁下載數據的過程。全部網頁數據解析需求,都可參考。

如需原始轉換及演示數據文件,請聯繫微信號carol_sxh獲取,添加好友時請註明所需文件名(KettleSample003.7z)。

 

【注意】本公衆號所發文章皆爲原創,如需轉載請註明出處及做者。


本文分享自微信公衆號 - Kettle博士(gh_f656c3d7ba54)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索