編者註:2016年10月,英國政府批准了希思羅機場修建第三跑道的計劃,欲以此增加就業,刺激經濟。反對聲音則指此舉會給倫敦造成更嚴重的環境、空氣及噪音污染。為研究噪音對機場附近居民的影響,BBC數據記者Daniel Wainwright編寫網絡爬蟲,抓取希思羅機場官網數據,結果發現平均每五分鐘機場就會收到一個噪音投訴。他的數據調查隨後由BBC發表。想知道他怎麼收集與分析數據?深度網為你編譯他的分享。
我一直納悶:為什麼在一些大會上分享有關爬蟲程序知識的人,從來都不真正解釋一下爬蟲的編寫過程呢?在我看來,這應該是每個調查記者最熱衷的技能之一。
因此,在英國伯明翰舉行的第一屆數據新聞大會上,我在一個即興環節嘗試講了一下如何編寫爬蟲。然後我就明白了,這講解起來還真不是想象中那麼容易。
如果你不熟悉數據新聞,讓我來解釋一下:爬蟲就像一種神奇的魔法,只是你施展的工具是表格而非魔杖。
運用爬蟲,無窮無盡的數據和文字就會乖乖地整整齊齊地列在一張表格中,讓你能輕鬆地進行整理、過濾和查詢。
你還可以讓爬蟲程序在一旁“跑着”,而你去聯繫採訪,或者只是泡一杯茶。
收集希思羅機場的噪音投訴
我用了一個十分基礎的爬蟲程序,從希思羅機場網站上收集了三年來針對機場噪音投訴的數據。那段時間第三跑道修建計劃屢見報端,我想要快速地弄明白噪音究竟是多大的問題。
最終,我的調查故事發表在BBC上,隨即被其他許多新聞機構採用。
我是怎麼做的呢?
這是希思羅機場網站上,2016年11月14日那天的日常運作數據頁面。由此可知,每天的噪音投訴數據是以單獨的URL鏈接發布的。要把這些數據整理到一張表格上,必將花費我好幾個小時甚至好幾天時間。
於是,在Googlesheets上,我創建了一個標準公式,以導入每個運作數據網頁的HTML表格數據。(最好新建表格來做這一步。在英國數據新聞大會上,我試着在原有的表格上改動,結果生成了一整頁的 #REF! 錯誤。)
參見上圖。注意頭兩個數字對應的是通信(電話、電郵與信件)和網絡投訴的總數:
投訴總數(E欄)等於這兩者相加,=C2+D2。
抓取數據的公式
現在讓我們來一步步分解這個公式:
=substitute(INDEX(ImportHTML(A2, “table”, 1), 33, 2), “*”, “ ”)
從中間開始,ImportHTML能使表格從單元格A2中的網頁鏈接中抓取信息。
“table”指令則會自動尋找表格。接下來的幾個數字:1代表搜索到的第一個表格,33指的是該表格的第33行,2指該表格的第2列。
Substitute(“替換”)跟數據抓取的最後一步有關。它的作用是告知爬蟲,如果遇到用星號標註的數據,要把星號替換成“ ”里的內容。而在這個例子里無需替換,因為涉及的數據沒有星號標識。但也可用“%20”來替換空格字符,這樣做能使瀏覽器工作更方便。
哪一行?
要找到數據,我們要重新看回網站上的原始數據。右擊鼠標,選擇“查看源代碼”,會得到以下這個頁面:
不要慌
用“Ctrl+F”搜索“complaints”(投訴)。
你能看到下一行寫着“第33行”,而緊接在“第二列”之後的,就是我們需要的實際數據。
以同樣的方法我們可以得到第34行的數據。我們把公式複製到毗鄰的D列時要改動行數。
複製到所有日期
如果你要把每天數據的URL鏈接複製到A列的話,那就跟你手動來查差不多啦。
每個日期的URL都有一樣的開頭,即http://hearthrowoperationaldata.com/
因此,我們可以先從運作數據網頁右側的下拉菜單中複製這些日期,然後把它們粘貼到B列。
接下來回到A列。在該列中,我們輸入以下公式:
= “http://hearthrowoperationaldata.com/”&B2
這個公式會把每日數據相應的URL補充完整,生成有效鏈接。
然而你會注意到,先前複製過來的日期、月份和年份都是以空格分開的。而在URL鏈接中,我們需要用短劃線(-)來作分隔,否則URL就無法打開。如何用短劃線替換空格見下圖。
如此,你便可以在A列中下拉複製公式,這樣就能得到每一天數據的URL。
這一步完成後,爬蟲就能行動起來,開始填充整張表格了。
保證信息準確無誤
牢記要徹底檢查你的發現。
爬蟲能夠幫你收集到以同一形式儲存的信息,但如何確保那些信息準確可靠,就要看你個人了。
此外,嘗試即興展示你獨立做成過一次的事情,與書寫及報道新聞一樣,對沉澱經驗十分有用。
編譯/梁思然
編輯/Ivan Zhai
Daniel Wainwright是BBC News Online的數據記者。
本文首發於網絡新聞博客(Online Journalism Blog)。深度網經授權轉載。