您好,登錄后才能下訂單哦!
Python這門語言因其簡單強大已經火了很久了,但我接觸的比較晚,前幾個月因為一篇博客開始初步了解這門語言,并且之后模仿某位北郵的前輩的微博寫了一個新浪微博的爬蟲
這里給出鏈接:python編寫的新浪微博爬蟲
當時為了能夠順便把從微博上抓下來的數據存儲起來,順便裝了MySQL,之所以用MySQL,主要是因為Python支持MySQL的插件比較好找,比SQLserver好找一些,不過本人對數據庫了解比較少,順便學習了一些數據庫方面的簡單操作。
寫好之后運行起來發現有些問題,主要是新浪微博的服務器對訪問次數和訪問頻率有限制,以至于我下載了一些數據后,服務器會自動屏蔽不再傳數據給我,當時挺困惑,網上有人說讓程序睡一段時間再繼續抓數據,當時也請教了北郵的前輩,也沒給我一個明確的答復,也或許是自己寫的問題,所以讀到這里的朋友也可以提想法哈。或者到我微薄上留言:http://weibo.com/u/1820299335
---------------------------------------------------------分割線-----------------------------------------------
最近看國內天氣質量堪憂,所以心血來潮想要再寫個程序把空氣質量數據爬下來分析一下,于是開始動手,由于之前寫新浪微博爬蟲的經驗,這次比較快,因為不像新浪微博需要模擬用戶登錄,中華人民共和國環境保護部--數據中心 的網頁比起微博還算簡單,所以很快代碼就寫好了,期間由于正則表達式運用不熟練,在抓取城市名稱和污染指數時遇到點小麻煩,網頁的html代碼如下:
<td οnmοuseοver="report1664549over()" class="report1_4" ><a >北京市</a></td>
<td class="report1_10" >2014-08-08 20:00</td>
<td class="report1_10" >85</td>
<td class="report1_10" >良</td>
<td οnmοuseοver="report1664549over()" class="report1_10" >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月份,全國性的霧霾天明顯有所減少。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。