编者注: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)。深度网经授权转载。