Tags
書寫爬蟲已經成爲數據記者的必備技能。雖然有諸如ScrapingHub、Morph、ParseHub等在線服務,可以一定程度上實現無代碼抓取網頁,但很多時候,還是需要手動編寫爬蟲邏輯。爬蟲書寫分爲兩個部分,第一個是爬,第二個是取。「爬」即是從一個網頁出發,找到它所包含的鏈接,逐一訪問,不斷重複這個過程,最終收穫到需要的頁面。這個過程和人們瀏覽網頁是類似的,有種「順藤摸瓜」的意思。「取」則是從網頁中提取有效信息的過程,將「半結構化」的網頁,轉換爲「結構化」的數據表格。
本文介紹最簡單的爬蟲,只需要一行命令: wget -r
打開MAC系統自帶的Terminal軟件,「wget -r 」(有一個空格),後面加上待爬取網站的種子鏈接。按回車後,命令開始運行,很快該網站的網頁、圖片、數據表格就會被下載到本地。
圖:wget -r 命令示例
實例:下載陝西統計年鑑數據表格
打開陝西統計年鑑2016,在左側選擇一個指標,比如「人口」。可以看到右側網頁只有一個圖片,沒有數據表格,連圖片化的表格都沒有。
圖:陝西統計年鑑「人口」章
實際上,陝西統計年鑑的網站上包含有數據表格,但網頁編碼有問題,導致二級目錄沒有展示出來。通過Chrome Developer Tool分析,可以看到「display:none」,代表這個列表是隱藏的。而這個隱藏的列表中恰好包含了以「.xls」結尾的數據文件鏈接。
圖:頁面結構分析
分析至此,已經可以通過右鍵菜單打開並下載這些表格。
如果不會頁面分析,是否就找不到表格呢?當然有辦法。比較暴力的做法是使用「wget -r」從種子頁面開始爬,wget並不管鏈接是否被隱藏(「display:none」),它會跟蹤到沒有發現新的鏈接爲止。我們輸入命令「 wget -r http://www.shaanxitj.gov.cn/upload/2016/tongjinianj2016/2016/indexce.htm 」,看爬取的結果。
圖:wget運行截圖,共下載1034個文件,總計112M,耗時21分鐘
可以想像wget爲一個瘋狂的用戶,它點擊了頁面上的所有鏈接,然後在打開的新網頁中繼續點擊所有鏈接,直到整個網站都被訪問過一次爲止。有意思的是,這個用戶不僅瘋狂,還很有組織,下載好的文件也按照原始目錄結構存放好了。
圖:左邊爲陝西統計年鑑數據文件夾,由wget自動生成;右邊爲其中一個表格的預覽
實例:區議會選舉數據
端傳媒早前整理了1999年-2015年區議會的候選人記錄。該數據集綜合利用了多種數據源,包括選舉網站、選舉結果書本、網絡起底(調查)等。香港的區議會、立法會、特首選舉,都可以在 http://www.elections.gov.hk/ 找到資料。網站以「xls」格式保存了大多數年份的選舉記錄,但網頁上比較容易找到的是「htm」中內嵌的表格,不少還存在字符編碼的問題。後來記者使用了 wget 命令,從多個入口將整個網站爬了一遍,檢查下載下來的本地文件夾時,發現了對應的「xls」表格文件,成功節省了大量寶貴的調查時間,也提高了數據搜集的質量。
總結
「wget -r」是最簡單的爬蟲,但常常發揮極大的作用。除了能夠幫助我們發現「隱藏鏈接」、「隱藏文件」外,它還能幫助記者在第一時間保存(網絡)現場。當突發新聞來臨的時候,你沒有足夠的時間取寫一個系統的爬蟲,那麼先用wget把涉事網站保存下來,未來可以分析這些文件。
稿件:Pili Hu