空氣質量數據網頁爬蟲加數據處理

Python這門語言因其簡單強大已經火了很久了,但我接觸的比較晚,前幾個月因爲一篇博客開始初步瞭解這門語言,並且之後模仿某位北郵的前輩的微博寫了一個新浪微博的爬蟲


這裏給出鏈接:python編寫的新浪微博爬蟲


當時爲了能夠順便把從微博上抓下來的數據存儲起來,順便裝了MySQL,之所以用MySQL,主要是因爲Python支持MySQL的插件比較好找,比SQLserver好找一些,不過本人對數據庫瞭解比較少,順便學習了一些數據庫方面的簡單操作。


寫好之後運行起來發現有些問題,主要是新浪微博的服務器對訪問次數和訪問頻率有限制,以至於我下載了一些數據後,服務器會自動屏蔽不再傳數據給我,當時挺困惑,網上有人說讓程序睡一段時間再繼續抓數據,當時也請教了北郵的前輩,也沒給我一個明確的答覆,也或許是自己寫的問題,所以讀到這裏的朋友也可以提想法哈。或者到我微薄上留言:http://weibo.com/u/1820299335


---------------------------------------------------------分割線-----------------------------------------------


最近看國內天氣質量堪憂,所以心血來潮想要再寫個程序把空氣質量數據爬下來分析一下,於是開始動手,由於之前寫新浪微博爬蟲的經驗,這次比較快,因爲不像新浪微博需要模擬用戶登錄,中華人民共和國環境保護部--數據中心 的網頁比起微博還算簡單,所以很快代碼就寫好了,期間由於正則表達式運用不熟練,在抓取城市名稱和污染指數時遇到點小麻煩,網頁的html代碼如下:


<td οnmοuseοver="report1664549over()" class="report1_4" style="color:#00A7D1;"><a href="http://datacenter.mep.gov.cn/report/air_daily/

airDairyCityHourMain.jsp?city=%B1%B1%BE%A9%CA%D0" style="font-family:宋體;font-size:12px;color:#00A7D1;font-weight:normal;

font-style:normal;text-decoration:underline;">北京市</a></td>

<td class="report1_10" style="color:#00A7D1;">2014-08-08 20:00</td>

<td class="report1_10" style="color:#00A7D1;">85</td>

<td class="report1_10" style="color:#00A7D1;">良</td>

<td οnmοuseοver="report1664549over()" class="report1_10" style="color:#00A7D1;">PM2.5</td>


是表格形式的,關鍵項的前後正則表達式不太會寫,這裏還望高手指點,不過我找到了替代的方法,網頁下面還有一部分相關可以提取的html代碼:

<area shape="rect" coords="76,116,86,216" title="北京市 AQI指數 85">

<area shape="rect" coords="104,120,114,216" title="天津市 AQI指數 82">

<area shape="rect" coords="131,141,141,216" title="石家莊市 AQI指數 64">

<area shape="rect" coords="159,131,169,216" title="唐山市 AQI指數 72">

這個就方便提取多了,用python的正則表達式包可以一次性把所有的結果保存下來,其實也就這麼幾行代碼:

def getList(self,text):

        pat = re.compile('<area shape="rect" coords=".*" title="(.*) .+ ([0-9]+)">'.encode('utf-8'))

        try:

            cityList = pat.findall(text)

        except:

            cityList = None

        return cityList

其中加了異常處理,一面在長時間運行過程中,出現錯誤程序異常終止。

第一次抓數據是從2014年1月抓到8月,(不知道爲什麼網站上沒有2014年以前的空氣質量數據,可能數據庫沒有開通吧),抓取數據的時間間隔爲12小時,結果處理完生成GIF動圖後發現,時間間隔略長,畫面不連續,於是重寫抓取,這次採用的是2個小時,一共運行了10幾個小時把所有數據都下載下來了。


然後就是想辦法做數據可視化,以前沒用過地圖數據可視化的工具,但是Matlab用的比較熟,Matlab做這種數據處理和圖像處理都比較強大,所以就自己純手工來進行數據可視化吧。


在網上截了箇中國地圖當背景,然後想辦法用Matlab往上畫數據。期間遇到點小麻煩,就是從網上找的城市座標是經緯度表示的,需要映射到地圖圖像上相應的位置,我直接選用最簡單的線性映射方式進行映射,結果發現在低緯度的城市映射結果還算準確,但是高緯度的城市要差200多km,無語了,怎麼會差這麼多!查了下發現,因爲地圖是百度地圖截屏的,百度地圖用的是所謂的麥卡托投影法,也就是圓柱投影,虧自己以前在本科時研究過光纖陀螺測量地理維度,這個都沒注意到。修正之後城市的投影位置準確多了。比如說首都的位置:




把所有城市的空氣質量用漸變色標在地圖上,才發現自己美工差:




(顏色隨着空氣污染指數的變差按:綠(優)、黃(良)、橙(輕微污染)、紅(輕度污染)、紫(中度污染)、黑(重度污染)的順序變化)


一個一個的紅點像是生了皮膚病,還是用插值處理一下吧,還好Matlab在這方面功能比較強大,不用費工夫:




好了很多,當然上圖的效果也是經過小小處理過的,總的來講畫面感同專業軟件比還有一定差距,但考慮到我是用Matlab畫出來的,這個畫質我接受了,能夠說明問題就行。


然後我挑選了一些有特點的空氣污染比較嚴重的日子,製作生GIF動圖,動圖使用PhotoShop製作的。圖中着重關注紅紫色的霧霾在大氣中的移動。



這個是14年1月2日14點 至14年1月4日18點,這次嚴重霧霾天影響全國,霧霾主要產生地主要有三個,河北山東一帶,湖南湖北一帶,重慶四川一帶,總的看來是人口稠密,工業較多,而且也有地形因素在內。




左:(2014-01-11-18至2014-01-13-08)右:(2014-01-19-14至2014-01-20-18),北方的霧霾天還是比較嚴重的,並且冬季多北風,霧霾向南方或東南方向擴散,當時南方的很多霧霾天也就這麼產生了。。。





(2014-03-17-06至2014-03-19-06)其實北京地區的污染源也並不完全是北京河北,比如這個就說明污染來自春季的蒙古大草原,查詢當天北京是北風。。。




(2014-05-26-20 至2014-05-28-00)再如這張,也比較明顯,查詢當天北京天氣是浮塵,也是北風


總的來說,空氣質量差是全國性的,污染源比較多,只不過有些地方地理因素擴散起來快一些,擴散慢的話,即便是山清水秀的貴州也難免有霧霾。過了4月份,全國性的霧霾天明顯有所減少。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章