我们是如何学会不再担心而热爱网上刮网的

2020-09-09 22:42:02

在研究中,时间和资源是宝贵的。自动化常见任务(如数据收集)可以使项目变得高效和可重复,进而提高生产力和产出。您最终将得到一种可共享且可重现的数据收集方法,其他人可以对其进行验证、使用和扩展,换言之,这是一种可计算重现的数据收集工作流。

在目前的一个项目中,我们正在分析验尸官的报告,以帮助防止未来的死亡。它需要下载3000多份PDF来搜索与阿片类药物相关的死亡,这是一项巨大的数据收集任务。在与更大的团队讨论时,我们认为这项任务是自动化的一个很好的候选者。通过几天的工作,我们能够编写一个计算机程序,可以快速、高效和可重复地收集所有PDF,并创建一个记录每个案例的电子表格。

这样的工具被称为“网络刮刀”,我们团队经常使用它们。我们使用它们从临床试验注册中心收集信息,并丰富我们的OpenPrescribing.net数据集,该数据集跟踪英国的初级保健处方-如果没有一些相对简单的代码的帮助,这些任务将从恼人到不可能完成。

在我们的验尸官报告项目中,我们每小时可以手动筛选和保存大约25个案例报告。现在,我们的程序每小时可以节省1000多个案例,同时我们还可以做其他事情,节省了40倍的时间。它还打开了协作的机会,因为我们可以共享产生的数据库。当发布新的PDF时,我们可以通过重新运行我们的程序来使数据库保持最新。

在这里,我们提供一些关于Web抓取的基础知识,以及如何在您的研究项目中开始使用它。

网络抓取器是从网站中提取信息的计算机程序,也就是“抓取”信息。网页的结构和内容是用超文本标记语言(HTML)编码的,您可以使用浏览器的“查看源代码”或“检查元素”功能来查看。刮取器理解HTML,并能够解析和提取其中的信息。例如,您可以对刮取器进行编程,以便从在线表格中提取特定的信息字段或下载页面上链接的文档。

常见的抓取任务包括迭代从www.example.com/data/1到www.example.com/data/100的每个可能的URL(有时称为“爬行”),并存储每个页面中需要的内容,而不存在提取过程中出现人为错误的风险。一旦您的程序编写完成,假设网站的结构基本保持不变,您可以随时重新捕获这些数据。

并不是所有的抓取任务都需要编程。当您在浏览器中访问网页时,现成的浏览器扩展(如webscillper.io)允许您单击包含您感兴趣的数据的页面元素。然后,他们可以自动解析HTML的相关部分,并将数据导出为电子表格。

另一种选择是建造自己的铲运机-这是一个更困难的过程,但提供了更好的控制。我们使用Python,但是任何现代编程语言都应该可以工作。(对于特定的包,请求和BeautifulSoup在Python中可以很好地协同工作;对于R,可以尝试rvest。)。有必要检查是否有人已经为您的数据源编写了刮取器。如果没有,无论您喜欢哪种语言,都有资源和免费教程可以帮助您入门。

与大多数编程项目一样,会有一些试验和错误,不同的网站可能会使用不同的数据结构或HTML实现方式的变化,这将需要对您的方法进行调整。然而,发展的这个解决问题的方面可能是相当有回报的。随着你对这个过程越来越熟悉,克服这些障碍将开始成为你的第二天性。

但请注意:根据页面数量、互联网连接和网站服务器的不同,清理工作仍可能需要数天时间。如果您有访问权限和技术诀窍,在私有服务器上运行代码可能会有所帮助。在个人计算机上,请确保防止计算机休眠,因为休眠会中断Internet连接。另外,仔细考虑一下你的刮板怎么会出故障。理想情况下,您应该有一种记录故障的方法,这样您就可以知道哪些是有效的,哪些是无效的,以及在哪里需要进一步调查。

你能以一种更容易的方式获取数据吗?对于我们的FDAAA TrialsTracker项目来说,每天从ClinicalTrials.gov上清除全部30多万条记录将是一项艰巨的工作。幸运的是,ClinicalTrials.gov使他们的完整数据集可供下载;我们的软件每天只需抓取该文件一次。我们没有那么幸运地拥有欧盟TrialsTracker的数据,所以我们每月都会刮掉欧盟的注册表。

如果没有批量下载,请检查网站是否有应用程序编程接口(API)。API让软件可以直接与网站的数据交互,而不是请求HTML。这可能比抓取单个网页的负担小得多,但API访问可能需要付费(例如,参见Google的Map API)。在我们的工作中,PubMed API通常很有用。或者,检查网站运营者是否可以直接向您提供数据。

这个网站可以被刮掉吗?一些网站不会将其数据直接放在HTML中使用,可能需要一些更高级的技术(有关特定问题的帮助,请查看诸如StackOverflow之类的资源)。其他网站包括验证码和反拒绝服务(DoS)等保护措施,这些措施可能会使抓取变得困难。一些网站只是不想被刮掉,而是为了阻止它而建的。允许抓取也很常见,但前提是您必须遵循某些规则,这些规则通常编码在robots.txt文件中。

你是在做有礼貌的刮水工吗?每次您的程序从网站请求数据时,都需要将底层信息“提供”给您。您在浏览器中只能如此快速地移动,但是刮取器可能每分钟发送数百到数千个请求。像这样攻击Web服务器可能会使网站变慢或完全瘫痪(实质上是执行无意的DoS攻击)。这可能会让你暂时甚至永久地从网站上被屏蔽-你应该小心将伤害的可能性降到最低。例如,您可以在每个请求之间暂停程序几秒钟。(检查站点的robots.txt文件,查看它是否指定了所需的暂停长度。)。

数据是否受到限制?确保检查提取数据的许可或版权限制。你也许可以使用你刮下来的东西,但值得检查一下你是否也可以合法地分享它。理想情况下,网站内容许可证将随时可用。无论您是否可以共享数据,您都应该使用GitHub之类的服务来共享您的代码-这是很好的开放科学实践,并确保其他人可以发现、重复您所做的工作,并在此基础上再接再厉。

我们强烈认为,应该有更多的研究人员开发代码来帮助进行他们的研究,然后与社区共享。如果手动数据收集对于您的项目来说一直是个问题,Web Screper可能是一个完美的解决方案,也是一个很棒的初学者编码项目。Screper足够复杂,可以教授有关软件开发的重要课程,但也足够常见,而且文档充分,初学者可以对实验充满信心。在你的计算机上编写一些相对简单的代码,并让它与外部世界互动,感觉就像是一个研究超级大国。你在等什么?。

这是一篇来自“自然职业社区”的文章,“自然”的读者可以在这里分享他们的职业经验和建议。鼓励发表嘉宾帖子。