薛曉軍 薛濤 鄧仕宏


摘 要:利用Python BeautifulSoup模塊,抓取環境監測網站的數據,并對數據進行處理后存儲。爬蟲程序在服務器上持續運行。當網絡不穩定時,爬取失敗后仍會繼續自動重試。該程序對網頁數據不斷爬取,保證數據的連續性價值。通過多線程爬蟲程序提高數據獲取的效率。通過對共同訪問的數據進行加鎖,防止出現資源訪問的錯誤,進行線程的同步。使用百度地圖web服務API中的地理編碼服務,對監測地點進行經緯度的確定。
關鍵詞:數據獲取;多線程程序;線程同步
1.項目研究背景及意義
隨著工業化和城市化進程的推進,城市的空氣污染狀況日趨嚴重,中國目前已經成為全球PM2.5污染最為嚴重的地區之一[1-3]。“霧霾”出現頻率的增加,范圍擴大,嚴重影響到我們的生活質量和身體健康。
北京地區霧霾污染嚴重,區域傳輸影響較大,北京霧霾的成因中,傳輸型的污染占比約30%(全年平均),在傳輸型污染中,區域傳輸所占的比例高于50%。從霧霾成因全年平均來看,區域傳輸占比約20%。2016年環保部專家們會商認定黑龍江秸稈焚燒造成幾乎從整個東北到華北甚至山東江蘇霧霾,但此認定缺少示蹤監測、模型分析的過程,缺少相關的科學依據,也沒有向民眾展示霧霾傳輸的方式和軌跡,并沒有得到廣大群眾的認可。而在目前公布的數據中,只給出區域傳輸所占比例,沒有給出霧霾區域傳輸的來源,即傳輸來源于哪些地區及其所占的比例并不明確。
2.1獲取數據
2.1.1數據來源背景
本項目的數據主要來源是Pm25.in網站,數據來源豐富,該網站共包括375座城市,1600個數據點。每個點包含AQI、空氣質量指數類別、首要污染物、PM2.5細顆粒物、PM10可吸入顆粒物等重要污染物,符合本項目對霧霾區域傳輸研究數據的要求。
數據來源可靠、真實。Pm25.in網站是一個為廣大應用開發者免費提供空氣質量數據的一個公益性網站,Pm25.in的數據全部來源于網友提供的國家環保網站公開數據,網站會根據國家環保網站的實時數據進行二次核實。
2.1.2獲取數據方式的選擇
運用python的Beautiful Soup庫對Pm25.in網站進行數據爬取。Beautiful Soup 是一個可以從HTML或XML文件中提取數據的Python庫,它是一個靈活又方便的網頁解析庫,處理高效,支持多種解析器。它能夠通過轉換器實現慣用的文檔導航,查找,修改文檔的方式,Beautiful Soup具有高效性,會幫本項目在爬取節省很多工作時間。
2.1.3獲取數據的步驟
1)獲取網頁源碼
采用python的urllib2模塊對Pm25.in網站數據進行爬取。利用urllib2庫的HTTPCookieProcessor對象來創建cookie處理器,讓HTTPCookieProcessor作為build_opener()函數的參數來創建自定義Opener對象。將urllib2.Request()實例化,需要訪問的url地址連同headers則作為Request實例的參數,返回獲取網頁的源碼。
獲取網頁源碼的python程序設計如下圖獲取網頁源碼程序圖所示:
2)處理網頁源碼
運用Beautiful Soup庫的find() split()方法遍歷源碼,找到所需要的數據。利用python對文件的處理,將這些需要的原始數據寫入記事本當中,以便以后處理使用。
處理源碼的python程序設計如下圖處理網頁源碼圖所示:
3)需要注意的問題
●連續性
當出現網絡不穩定或網絡斷開導致爬取數據失敗時,爬蟲程序自動重試對網頁源碼的讀取,重試失敗次數達到10次后放棄爬取,輸出錯誤日志。等待人工處理錯誤。這樣設計python程序可以保證該程序對Pm25.in網站的數據不斷的爬取,盡量使得獲取的數據是連續的,更有利用價值。
●實時性
Pm25.in網站的數據是一個小時更新一次,為確保數據的實時性,爬蟲程序便每一小時對監測點數據進行抓取。確保獲取數據的有效性和實時性。對這些實效性數據進行清洗后,用于霧霾區域傳輸相關性研究,可以確保研究的正確性和時效性。
●高效性
使用多線程對網站數據進行抓取。多線程之間可以快速切換,提高效率,縮短爬取大量數據所需的時間。最初實現爬蟲程序時,使用單線程進行數據抓取,抓取效率很低,單次執行需要等待較長時間,測試時效率也很低。對程序進行完善,使用多線程實現效率的提升。定義MultiThread類實現多線程的抓取,在該類的構造函數中有兩個參數,一個是并發線程的總數,一個是任務個數。通過調整并發線程的總數實現不同效率的數據抓取。MultiThread類的具體實現如圖所示。
通過對共同訪問的數據進行加鎖,進行線程的同步,防止出現資源訪問的錯誤。剛開始使用多線程程序對文件進行讀寫操作時,最終存入文件的數據總是錯誤的,有的是多行數據混在一行,有的是數據編號不正確,出現了很多問題,發現問題是多個線程同時對文件進行讀寫,出現了讀寫錯誤。解決方法是對共同訪問的文件進行加鎖,當有進程在對文件進行操作時,其他進程進行等待,進行線程的同步。加鎖的位置也十分關鍵,共同使用的文件、變量都需要進行加鎖。
2.2數據處理
地點與對應經緯度轉化:對于爬取的數據進行經緯度的轉換,在這里使用的是百度地圖web服務API中的地理編碼服務。
獲取密鑰:注冊百度賬號,申請成為百度開發者之后,獲得服務密鑰(ak)。然后便可以運用拿到的ak來使用地理編碼服務,使得本項目數據點的具體地址轉化為需要的經緯度。
調用服務:本項目對地理編碼服務的請求,具體是對http://api.map.baidu.com/geocoder/v2/?address=北京市海淀區上地十街&output;=json&ak;=ak&callback;=showLocation網址進行GET請求。
參考文獻:
[1]孟偉,高慶先,張志剛等. 北京及周邊地區大氣污染數值模擬研究[ J ]. 環境科學研究. 2006,19(5):11-18.
[2]安靜宇. 長三角地區冬季大氣細顆粒物來源追蹤模擬研究[D].碩士學位論文. 東華大學,2015年.
[3] Wang YueSi, Yao Li, Wang LiLi , et al .Mechanism for the formation of the January 2013 heavy haze pollution episode over central and eastern China[ J ]. Science China Earth Sciences,January 2014 ,Vol.57 No.1: 14–25.