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