想知道有哪些議員在“吃空餉”?自己寫一個爬蟲吧!

Print More

編者按:從數據挖掘、數據分析到數據可視化,神通廣大的R語言早已成為許多數據記者首選傍身之技。熱愛數據的你,R的功能用過多少?用R編寫網絡爬蟲,你又嘗試過嗎?比利時數據達人Maarten Lambrechts最近就利用R語言的rvest包編寫了一個爬蟲程序,調查分析比利時弗拉芒大區議會議員的議政情況,並將對數據挖掘過程的剖析發佈於個人網站上。深度君經授權編譯Lambrechts的文章,文末還有完整的程序代碼分享,數據愛好者們趕緊練起來吧!


新任弗拉芒聯盟(N-VA)主席Jan Peumans最近表示,有些議員在弗拉芒議會中“毫無作為”。作為一個數據記者,我立刻意識到:應該找出這些“吃空餉”的傢伙!於是,我利用比利時政府的公開資料,研究了議員們在議會中的表現,製作了靜態的散點圖和動態交互圖表來呈現結果。(弗拉芒大區是比利時的一個自治行政區,擁有自己的政府和議會。文章中議員均是指弗拉芒大區議會的議員。)

接下來,就讓我來分享一下製作的過程吧。

flemish-parliament-768x730

                     弗拉芒議會網站上的議員名單

數據搜集

弗拉芒議會有完善的開放數據政策,所有議員在議會中的活動資料都會被公開。起初,我決定通過政府的開放API來獲取數據。API(Application Programming Interface)即應用程序接口,我可以通過這個公開的入口,向政府的服務器發送數據請求。

但我很快發現,這個方法對我來說有些困難。一方面,這會得到大量冗餘的數據。通過API,我必須反覆多次請求大量數據,每次的結果都要保存,才能最終得到我感興趣的數據。

另一方面,通過API獲得的數據格式也會帶來問題。服務器發回的都是.json和.xml格式的數據,但我並不擅長處理這些格式。

深思熟慮後,我決定放棄API這條路,改用網頁爬蟲的方法。幸運的是,我發現政府網站上的數據——包括我想要的信息在內——結構化程度都非常高。

在議會網站的議員信息資料頁,所有議員的頭像、姓名和政黨信息都按照字母表的順序列了出來。每個議員的名字上都有一個超鏈接(地址為url1),點進去可以導流到議員個人資料頁。在個人資料頁,可以看到所有與該議員相關的活動信息,包括每人的質詢、發言和提案記錄等。每條活動信息上都另有一個超鏈接(地址為url2),可以進一步導流到該活動的詳細介紹頁面。

這些結構化的網頁信息,就是我們接下來要用爬蟲抓取的目標。

這個夏天,我花時間學習了R語言及其相關拓展包,現在是它們大顯身手的時候了!二話不說,我馬上開始寫代碼。這次,我主要使用了rvest包。

爬蟲是怎樣工作的呢?

第一步,批量抓取議員的姓名、政黨和個人資料頁的超鏈接地址,即url1,並把數據結構化地存儲下來。

第二步,批量抓取議員的活動信息超鏈接。根據第一步中的url1,爬蟲會逐個訪問議員的個人資料頁,然後抓取上面的url2。之所以還是抓取超鏈接而不是文本數據,是為了方便接下來的數據篩選工作。

第三步,過濾多餘的數據信息。在url2中,爬蟲通過替換關鍵詞的方法,過濾出議員在當前任期內的活動數據,排除掉了無效的歷史數據。

第四步,爬蟲再次逐個訪問篩選後的url2,抓取出議員們在當前任期內的活動數據。

整個爬蟲過程就是這麼簡單!與之前失敗的API方法相比,網頁爬蟲在這次的製作中顯得更高效。

然後呢?

有了這些數據,我決定從兩方面來衡量議員在議會中的活躍程度。一方面是議員的質詢數量,另一方面是議員自己的提案數量(包括提出的議案、修正案等)。這樣的數據用散點圖來呈現是最合適的。於是我就用R語言中的ggplot2包來製作散點圖,橫軸表示質詢數,縱軸表示提案數,每個點代表一個議員,點的顏色代表了不同的政黨。plot_withoutmedians-771x771圖表顯示出了清晰的數據分布趨勢,雖然存在一些離散值,但不影響我們對整體的分析。那麼問題來了:這些數據的新聞點在哪裡呢?

秘訣在於圖上兩條輔助線。散點圖本身好像看不出什麼規律,但是當我們以橫軸和縱軸的中位數為界,在圖上添加兩條輔助線後,形勢立刻就明朗了。

tussenkomsten_vs_vrageninitiatieven-771x771這兩條線將整個散點圖分為了四個象限:右上角(第一象限)是“盡職盡責派”,代表了那些質詢很多、提案也很多的議員;左上角(第二象限)是“默默實幹派”,代表了那些質詢很少、提案很多的議員;左下角(第三象限)是“消極參與派”,代表了那些質詢很少、提案也很少的議員;右下角(第四象限)是“口誅筆伐派”,代表了那些質詢很多、提案很少的議員。

這兩條參考線讓枯燥的圖表頓時鮮活了起來,讀者也更容易理解其中的核心觀點。如果沒有做這一步劃分,我覺得編輯十有八九要斃掉我的圖和稿子。

針對紙質印刷,我先把散點圖從R中導出並製作為.pdf格式的文件。之後,我的設計師同事 009_gpv1qu_20161001_tyd01_00_orig-771x1150對於scatterplot_mps-771x507 手機等移動端的讀者就只能查看靜態圖表了。不過為了照顧這些讀者,我把大圖化整為零,用ggplot2包把不同的政黨分別製作了一個散點圖,使數據更加清晰。smallmultiples-771x202

關於R

就像我之前提到的:學好R語言,幸福天天見。寫代碼不僅可以做數據搜集和可視化,你只需輕點一下鼠標,它就會自動幫你完成抓取、清洗、整理、可視化等一系列工作了,甚至還會貼心地為你準備好之後交互設計的數據,從而讓我們徹底告別重複乏味的手動編輯數據!

實際上,我周五早上才開始寫代碼,然後周六就做出圖表並且發布。雖然在正式發表前,我還需要做很多其它的工作,但是這些代碼讓我徹底從數據搜集和處理的工作中解脫了出來。什麼?你要更新的數據?點擊運行,剩下的交給程序去做吧。

附錄:什麼是中位數

怎麼跟讀者解釋中位數是我一直頭疼的問題。但是就這張圖而言,很簡單:一條中位數線把所有點分成了兩半,一半點的數值比中位數低,另一半比它高。就是這樣。

福利:這次作品的開源代碼

源碼的照片如下,你還可以點擊查看我的maartens-code-771x1251

 

編譯/程一祥

編輯/Ivan Zhai,梁思然

 


 

martenMaarten Lambrechts 是比利時媒體 De TijdL’Echo 的數據和多媒體編輯。他熱衷於數據探索,擅長製作靜態數據圖、地圖、交互式圖表等數據可視化作品。本文原載於 Lambrechts 的個人網站,經授權轉載。

Print Friendly, PDF & Email

發表回復

您的電子郵箱地址不會被公開。 必填項已用 * 標註