基于R语言的自动数据收集:网络抓取和文本挖掘实用指南(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-29 22:22:27

点击下载

作者:(德)蒙策尔特(Munzert,S.)

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

基于R语言的自动数据收集:网络抓取和文本挖掘实用指南

基于R语言的自动数据收集:网络抓取和文本挖掘实用指南试读:

前言

过去20年,互联网的快速发展改变了我们分享、收集和发布数据的方式。企业、政府机构和个人用户都提供了各种类型的信息,新的沟通渠道也带来了有关人类行为的大量数据。社会科学领域曾经的根本性问题——观测数据稀缺和难以获取的情况——正在快速扭转为数据取之不尽用之不竭的局面。这种翻天覆地的形势也并非尽善尽美。例如,传统的数据采集和分析技术可能不足以应对复杂的大量数据。对这种大数据的需求进行分析的结果之一是所谓“数据科学家”的诞生,他们能对数据进行筛选,在研究者和企业那里都很受欢迎。

随着互联网的高歌猛进,我们还见证了第二个趋势,那就是像R这样的开源软件越来越流行,越来越有影响力。对计量社会科学家来说,R是最重要的分析软件之一。它得益于有一个不断发布新组件的活跃社区,而且该社区一直在快速成长。到现在,R已经不仅仅是一个免费统计软件包,它还包含了许多其他编程语言和软件包的接口,这样就大大简化了对各种来源的数据进行处理的工作。

从个人角度来说,我们对社会科学数据所做的工作的特点可以总结如下:

·资金比较稀缺。

·既没有时间也没有意愿进行数据的手工采集。

·感兴趣的是利用最新、高质量和海量的数据来源。

·需要记录从开始(数据采集)到结束(发布结果)的整个研究过程,这样它就可以被重现。

在过去,我们经常受困于对各种来源的数据进行手工整理,还要寄希望于手工整理不可避免带来的编码和复制-粘贴错误只是非系统性的。最终,我们越来越厌倦那种不可重现的研究数据采集方式,这种方式易于出错、缓慢复杂,而且提高了因烦躁而死的风险。因此,我们不断地把数据采集和发布流程纳入在统计分析过程中已熟悉的软件环境——R。这个程序提供了一套很好的基础架构,可以把日常工作流程扩展为实际数据分析前后的一系列步骤。

虽然目前R本身还不是用来采集数据或进行实验的,但我们还是认为本书讲述的技术不仅仅是对于成本高昂的调查、实验和学生助理编程者的“穷人的替代品”。我们相信它们是现代数据分析工具组合的有力补充。我们推崇对在线资源的数据进行采集,不仅认为它是比传统数据采集方法性价比更高的解决方案,更将其视为从新的和不断开发中的数据源中整合数据集的特有方法。此外,我们重视基于电脑程序的解决方案,因为它们能确保可靠性、重现能力、时间效率以及对高质量数据集的整合。除了工作效率,你还会发现自己乐于通过写代码和设计算法方案替代乏味的手工劳动。简而言之,我们相信,如果你愿意花时间学习和采用本书中推荐的技术,在数据分析的简便性和质量上得到的持续提升一定会让你受益匪浅。

假定你已经确定在线数据是你的项目所适用的资源,那么是否真的有必要采用网络抓取或统计性文本处理技术,以及随之而来的自动化或半自动化数据采集流程?虽然我们不能指望拿出一锤定音的准则,但下面是一些有用的判断条件。如果你发现自己符合其中的多个条件,那么自动化的方法很可能就是正确选择:

·你是否计划经常重复这项任务?比如,需要通过它来保持数据库的更新。

·你是否需要让其他人能重复你的数据采集过程?

·你是否经常处理在线的数据源?

·这项任务在规模和复杂度上是否非同小可?

·如果这项任务也可以手工完成……你是否缺乏必要的资源来调动其他人参与?

·你是否愿意通过编程的手段实现自动化流程?

理想情况下,本书讲述的技术让你能够以相当合理的成本创建强大的数据集,这些数据集来自现有的、非结构化或未排序的数据,之前也没有人分析过它们。在很多情况下,根据你的研究主题的特点,你需要对本书讲述的技术重新思考、提炼和组合,才能有所成效。在任何情况下,我们都希望你能发现本书的主题对你有所启发,能开阔你的眼界:网络的街道是用数据铺成的,这些数据正迫不及待地等着被采集。你从本书中不会学到的内容

当你浏览目录的时候,你会对阅读本书之后有望学到的东西有个初步的印象。虽然我们很难确定哪些部分是你希望看到却不在本书讨论范围内的,但是我们还是会指出你在本书中找不到的某几个方面的内容。

你在本书中不会看到对R环境的介绍。这方面已经有很多出色的介绍材料——不管是印刷版的还是在线的——本书不再赘述。如果你之前没有用过R语言,也大可不必失望地将此书束之高阁。我们还会推荐一些写得很好的R入门教材。

你也不要指望本书针对网络抓取或文本挖掘进行全面讲解。首先,我们专门使用了一套软件环境,而它并不是为实现这些目的量身定制的。在一些应用需求下,R对于你要完成的任务并非理想解决方案,其他软件包可能更合适。我们也不会用如PHP、Python、Ruby或Perl等替代环境来干扰你。要想知道本书是否对你有帮助,你应该扪心自问,你是否已经或计划把R用在日常工作中。如果对这两个问题的答案都是否定的,很可能你就应该考虑替代方案了。但是,如果你已经在用或倾向于使用R了,你就可以省下学习另一个开发语言的精力,留在熟悉的开发环境里。

本书也不会严谨地介绍数据科学。在这个主题上也有一些出色的教材,例如O’Neil and Schutt(2013)、Torgo(2010)、Zhao(2012),以及Zumel and Mount(2014)。在这些书中偶尔缺失的部分是如何在真实环境中获取数据科学中用到的数据。在这方面,本书可以作为数据分析的准备阶段的参考书,它还给出了关于如何管理可用信息并让它们保持及时更新的指导原则。

最后,你最不可能从本书看到的是针对你的具体问题的完美解答。在数据采集过程中,获取数据的领域从来都不会完全相似,而且其形式有时也会快速变化,这都是固有的问题。我们的目标是让你能改写例子和案例分析中提供的代码,并创建新的代码,以此帮助你在采集自己所需数据的工作中获得成功。为什么使用R

对于本书中涵盖的问题,R是一个很好的解决方案,我们这么考虑是有很多原因的。对我们来说,最重要的几点原因如下:

·R可以自由和简便地获得。你可以按自己的需要随时随地下载、安装和使用它。不去钻研那些昂贵的专有软件对你是大有裨益的,因为你不需要依赖于雇主支付软件版权费的意愿。

·作为一个主要专注于统计学的软件环境,R拥有一个巨大而且持续繁荣的社区。R被用于各种专业领域,如社会科学、医学科学、心理学、生物学、地理学、语言学以及商业等。这样大的专业范围让你能与很多开发者共享代码,并从文档完善的多领域应用中获益。

·R是开源的。这意味着你能够轻松地分析函数的工作原理并毫不费力地修改它们。这也意味着对程序的修改不会被一个维护产品的独家程序员团队所控制。即使你无意为R的开发贡献代码,你仍然可以从种类繁多的可选扩展项(组件)中获益。组件的数量与日俱增,很多已有的组件也会经常更新。你能在这里找到相当棒的关于R应用的流行主题的概述:http://cran.r-project.org/web/views/。

·对常规任务而言,R是相当快的。如果你用过类似于SPSS或Stata的其他统计软件,并养成了在计算复杂模型的时候顺便度个假的习惯,你应该会赞同这个印象,更不用提那种由“同一个会话,同一个数据框”的逻辑带来的切肤之痛了。甚至还有一些扩展可以用来加速R,例如,在R的内部通过Rcpp组件调用C语言代码。

·R在构建数据可视化效果方面也很强大。虽然这对于数据采集并非显著的增值,在日常工作中你还是不应该错过R的图形特色。我们后面会讲解到,对被采集数据的视觉检查能够且必须作为数据校验的第一步,以及图形如何给海量数据提供直观的总结方式。

·使用R进行的工作主要是基于命令行的。这在R“菜鸟”听起来也许像是一个不足,但相比那些要用鼠标点击的程序来说,这是唯一能支持产生可重现结果的方式。

·R对于操作系统是不挑剔的。它通常可以在Windows、Mac OS和Linux下运行。

·最后,R是能自始至终支持研究过程的完整软件包。如果你在读这本书,你应该不是专职程序员,而是对于你要从事的某个主题或特定数据源有相当大的兴趣。在这种情况下,学习另一门语言不会有成效,反而会让你无法开展研究工作。普通研究流程的一个例子如图1所示。它的特点是永远在各种程序之间切换。如果你需要对数据采集过程进行修正,你就不得不顺着整个梯子爬回去。而使用R的研究过程,正如在本书中所讲述的,只在单一的软件环境中进行(见图2)。对于网络抓取和文本处理而言,这意味着你不必为这项任务去学习另一门编程语言。你需要学习的只是标记语言HTML、XML、正则表达式逻辑和XPath的一些基础知识,但所需的操作都是在R内部执行的。图1 不使用R的研究过程——形象化的例子图2 使用R的研究过程——形象化的例子R起步阶段的推荐读物

市面上有很多写得很好的介绍R的书。在它们当中,我们发现以下几本尤其有帮助:

Crawley,Michael J.2012.The R Book,2nd edition.Hoboken,NJ:John Wiley & Sons.

Adler,Joseph.2009.R in a Nutshell.A Desktop Quick Reference.Sebastopol,CA:O’Reilly.

Teetor,Paul.2011.R Cookbook.Sebastopol,CA:O’Reilly.

除了这些商业化的资源,网上还有很多免费的信息。对绝对的新手来说,Code School上有个真正超棒的在线教程,可以在http://tryr.codeschool.com看到。另外,Quick-R(http://www.statmethods.net/)里有很多基本命令的索引。最后,你也可以在http://www.ats.ucla.edu/stat/r/找到很多免费资源和例子。

R是一个不断成长中的软件,为了跟上它的进展,你或许需要定期访问Planet R(http://planetr.stderr.org/),该网站提供了已有组件的发布历史,偶尔还会介绍一些有意思的应用。R-Bloggers(http://www.r-bloggers.com/)是个博客大杂烩,它专门收集有关R的各种领域的博客。它提供了由数以百计的R应用构成的广阔视角,这些应用涉及的领域从经济学到生物学再到地理学,大部分都附有重现博文内容所必需的代码。R-Bloggers甚至推介了一些探讨自动化数据采集的例子。

当你遇到问题的时候,R的帮助文件有时候不是特别有用。去Stack Overflow(http://stackoverflow.com)这样的在线论坛或Stack Exchange网络旗下的其他站点寻求帮助往往会更有启发性。对于复杂问题,可以考虑去GitHub(http://github.com)上找一些R的专家。另外请注意,还有很多特别兴趣小组(SIG)的邮件列表(http://www.r-project.org/mail.html),里面划分了多种多样的主题,甚至还覆盖全世界的同城R用户小组(http://blog.revolutionanalytics.com/local-r-groups.html)。最后,有人建了个CRAN任务视图,较好地概括了近期Web技术的进展和R框架里的服务:http://cran.r-project.org/web/views/WebTechnologies.html。配套资源

本书的配套网站见http://www.r-datacollection.com。

该网站提供了书中例子和案例分析的相关代码,以及其他一些内容。这意味着你无须手工从书中复制代码,直接访问和修改相应的R文件即可。你也可以在该网站找到某些练习题的解答,以及本书的勘误表。如果你在书中发现了任何错误,也请不吝告知。免责声明

这不是一本关于网络蜘蛛(spider)抓取数据的书。网络蜘蛛是在互联网上抓取信息的程序,它能很快地从一个网页跳转到另一个网页,往往会抓取整个网站的内容。如果你想追随的是Google的Googlebot的足迹,那你很可能拿错书了。本书介绍的技术是用于更明确、更温柔的工作,也就是从特定的网站抓取特定的信息。最后,你要为自己学会这些技术之后的所作所为负责。本书示例的代码和得罪网站管理员的程序之间往往没有太大的鸿沟。所以,下面是关于如何做好一个网络数据采集从业者的一些重要忠告:

·牢记你的数据是从何而来的,在可能的时候,感谢那些最初采集并发布它的人们。

·如果你打算二次发布那些在网络上找到的数据,切勿违反版权协议。如果这些信息不是你自己采集的,有时你需要所有权人的许可才能对其进行加工。

·不要做任何违法的事情!要了解你在数据采集过程中能做和不能做的事情,可以去Justia BlawgSearch(http://blawgsearch.justia.com/,这是一个搜索法律相关博客的网站)核对一下。在里边搜索被标记为“web scraping”(网络抓取)的结果有助于你了解相关法律的进展和近期的判决。另外,电子前沿基金会(http://www.eff.org/)早在1990年就成立了,它致力于保护消费者和大众的数字权利。不过,我们希望你永远不需要仰仗他们的帮助。

关于从网络抓取内容的行为,本书9.3.3节提出了一些更详细的建议。致谢

本书的问世有赖于很多人的帮助。我们想利用这个机会表达我们对他们的感激之情。首先我们想对Peter Selb说声谢谢,是他向我们提出了创建一门关于数据采集的新课程的构想。正是出自他的这一灵光闪现,我们才开始把之前相对零散的一些经验整理成一本全面的教材。我们也要向对本书部分章节提出宝贵意见的几位朋友表示感谢。我们重点感谢Christian Breunig、Holger、Daniel Eckert、Johannes Kleibl、Philip Leifeld和Nils Weidmann,他们的意见极大地提高了本书的水平。我们还要感谢Kathryn Uhrig对手稿的校对工作。

本书的早期版本用于Konstanz大学2012~2013学年夏季学期的“新的数据采集方法”和“从互联网采集数据”两门课程。我们要感谢各位同学提出的意见,以及他们在学习本书、R以及正则表达式的时候表现出来的耐心。我们还要感谢参加了2012年12月在曼海姆召开的“助力实证性政治改革研究:R自动化数据采集”和2013年4月在苏黎世召开的“R自动化在线数据采集”两个研讨会的朋友。我们要特别感谢Bruno Wüest对苏黎世研讨会成功举办的协助,以及Fabrizio Gilardi的热心支持。

现在看来,编写一本有关自动化数据采集的著作是相当耗费时间的。我们在攻读博士学位期间都在从事这个项目,花费了很多本应用在自己课题上的时间来研究复杂的网络抓取技术。我们要感谢我们的导师Peter Selb、Daniel Bochsler、Ulrich Sieberer和Thomas Gschwend在我们走弯路时候的耐心和支持。Christian Rubba还要感谢瑞士国家科学基金会的慷慨资助(经费授予号:137805)。

我们还要衷心感谢在本书中运用的众多组件的创建者和维护者。是他们的持续投入开启了新的学术研究的大门,并为个人研究者开辟了通往广阔数据源的道路。虽然我们没办法在这一段中提到所有的组件开发者,我们还是要对Duncan Temple Lang和Hadley Wickham的杰出工作表示感谢。我们还要感谢Yihui Xie开发的组件,它对本书的排版尤为关键。

我们要感谢来自出版社同仁的帮助,特别是Heather Kay、Debbie Jupe、Jo Taylor、Richard Davies、Baljinder Kaur和其他负责校对与排版的朋友,以及在写作过程中各个阶段提供帮助的朋友。

最后,我们要很高兴地向朋友和家庭成员的支持表示感谢。我们特别要衷心感谢Karima Bousbah、Johanna Flock、Hans-Holger Friedrich、Dirk Heinecke、Stefanie Klingler、Kristin Lindemann、Verena Mack以及Alice Mohr。Simon MunzertChristian RubbaPeter MeiβnerDominic Nyhuis第1章 概述

你是否准备好第一次尝试网络抓取?让我们从一个你能直接在你的电脑上重建的小例子开始,假设你已经安装好R。此案例会让你对本书的核心主题有个初步的印象。1.1 案例研究:濒危世界遗产地

联合国教科文组织(UNESCO)是联合国的一个机构,其职责包括对全世界自然和文化遗产的保护。迄今为止(截至2013年11月),已经有981个地点被列入世界遗产,其中大部分是像胡夫金字塔这样的人造建筑,但也包括像大堡礁这样的自然景观。遗憾的是,一些被划定为世界遗产的地点正在遭受人类活动的威胁。有哪些地点正在遭受威胁?它们分别在哪些地方?世界上是不是有一些地区的遗产比其他地区的遗产处于更加濒危的状态?遗产地面临濒危风险的原因有哪些?这些都是我们在第一个案例研究中想要检验的问题。

当科学家要掌握某个主题的基本情况时,他们一般首先会做哪件事呢?他们会去维基百科(Wikipedia)查阅这个主题!打开世界遗产地的页面(http://en.wikipedia.org/wiki/List_of_World_Heritage_in_Danger),我们会看到一份清单,其中列出了现在和以前濒危的遗产地。这份列表包含了名称、位置(所在城市、国家及其地理坐标)、遗产地面临威胁的种类、该地点被列入世界遗产的年份以及该地点被列入濒危世界遗产的年份。我们首先调查一下这些地点在全世界的分布情况。

虽然这张列表包含了有关遗产地的信息,但它们所在的位置或区域性聚集的情况并不是特别直观。相比用肉眼扫描列表,更有效的方法是在地图上标出每个遗产地的位置。因为人类善于处理视觉信息,所以我们在本书中会尽可能地让分析结果可视化。不过,如何把来自列表的信息对应到地图上呢?这听起来像是个有难度的任务,但实际上并非如此,在后面的内容中,我们会充分讨论一些相关的技术。现在,我们先让你有一个如何用R处理这类任务的初步印象。本书在后面的章节里会更系统化地详细讲解下面的代码片段中的命令。

一开始,我们需要加载一批组件。虽然R只有一组基本函数——主要是与数学和统计学相关的,但是通过用户编写的组件可以轻松地[1]对它进行扩展。对本例而言,我们要用library()函数加载下列组件:

下一步,我们把页面上的数据加载到R中。这可以通过XML组件的readHTMLTable()函数轻松实现:

我们会在第9章详细讲解这一步以及其他重要网络抓取技术的原理。就目前而言,你只需要知道,我们在这一步要告诉R,它要导入的数据是以HTML网页的形式出现的。R有能力解析HTML,也就是说,它知道在这种文件格式下的表格、标题或者其他元素的构成方式。这是通过htmlParse()函数调用的“解析器”(parser)起作用的。在下一步,我们要让R从解析出来的heritage_parsed对象中提取所有能找到的HTML表格,并保存到新的tables对象中。如果你还不熟悉HTML,在第2章你会通过同样的代码片段了解这些HTML表格。readHTMLTable()函数则用来识别和读取这些表格。

现在,我们需要的所有信息都在tables对象里了。这个对象是readHTMLTable()函数在HTML网页中能找到的所有表格的一份列表。在看过所有表格之后,我们甄选了感兴趣的那个表格(第二个)并把它存到一个命名为danger_table的新表格里。该表格里的一些变量并不是我们所感兴趣的,所以我们筛选出的信息只包含了遗产地的名称、位置、遗产标准(文化或自然)、列入遗产的年份以及列入濒危遗产的年份。这个表格里的变量被分配的命名并不是太好用,所以我们要给它们重新进行标记。最后,我们来看一下开头几个遗产地的名称:

这个结果看起来是好用的。另外,我们还要进行一些简单的数据清理,这个步骤通常是把基于网络的内容导入R时所必需的。包含遗产地是“文化”还是“自然”特性信息的变量crit被重新编码,两个[2]年份变量y_ins和y_end也被转换为数字类型。在y_end变量中有一些数据条目是模糊的,其中包含了多个年份值。我们只选择该数据项里最后的一个年份值。为此,我们制定了一个所谓的“正则表达式”(regular expression),它的表达式是[[:digit:]]4$,我们会在下一段内容讲解它的含义。

locn这个变量的值也有点杂乱,我们在数据集里找三条数据作为例子:

该变量包含了遗产地位置的名称、所在国家和多种格式的地理坐标。而我们用到地图上的数据只需要用纬度值(例如,30.84167N)和经度值(例如,29.66389E)表示的坐标。为了提取这个信息,我们必须采用某种更先进的文本处理工具,称为“正则表达式”,在第8章有对它的详细讲解。简而言之,我们必须给R准确描述我们感兴趣的信息看上去是什么样子的,然后让R据此去搜索和提取这些信息。为此,我们采用了来自stringr组件的函数,在第8章也会对该组件进行详细讲解。为了获取纬度值和经度值,我们编写了下列代码:

不要被前两行代码弄晕了。这些看起来像猴子在键盘上胡乱敲出来的东西实际上是对locn变量中包含的坐标的精确描述。该信息在locn变量中的表现方式既有分数格式的度数,也有分开的度、分、秒格式。因为分数格式的度数更容易用正则表达式来表示,所以我们要尝试把这些格式的数据提取出来。编写正则表达式意味着要找到我们希望提取的字符串的一般特征。我们观察到纬度和经度数据总是出现在一个斜杠之后,而且是由一个点分开的多个数字组成的序列。某些值以一个减号开头。纬度和经度两个值由一个分号分开,最后由一个空格和斜杠结尾。当我们用str_extract()命令把这个特征应用到locn变量上,再用str_sub()命令提取出数字信息,就得到了下列数据:

这看起来效果不错。我们已经获取了一组44个坐标,应着44个濒危世界遗产地。我们粗略地看看这些数据。dim()命令返回数据集的行数和列数;head()命令则返回开头的若干条数据:

该数据集由44条数据和6个变量组成。现在,要把这些数据设定成能够映射到地图上的形式。为此,我们要使用另一个叫“maps”的组件。在这个组件里找到了一幅世界地图,可以根据提取出的y和x坐标在地图上对各个遗产地进行精确定位。定位结果如图1-1所示。该结果是由下列代码产生的:图1-1 联合国教科文组织划定的濒危世界遗产地(截至2014年3月)。文化遗产地标记为三角形,自然遗产地标记为圆点

可以看出,很多濒危遗产地位于非洲、中东和西南亚,还有一些位于中南美洲。濒危文化遗产地用三角形标示。它们相对集中在中东和西南亚。相反,用圆点标示的濒危自然遗产地在非洲更突出一些。我们还发现,濒危的文化遗产比自然遗产更多。

我们可以分析相关国家的政治、经济或环境状况导致这些遗产地濒危的可能性。虽然表格中的信息也许太稀疏,不足以进行严谨的推理,但是我们起码可以分析某些时间趋势和教科文组织推行遗产地的潜在动机。为此,我们可以利用y_ins和y_end两个变量,它们包含了某地点被列入世界遗产的年份和它被列入濒危世界遗产的年份。图1-2显示了我们使用hist()命令产生的第二个变量的分布情况。我们发现在最近几十年,濒危目录中的遗产地的增长频率加快了,但同时世界遗产地的总数也在增加:图1-2 世界遗产地被列入濒危名单的年份分布

更有意思的是列入遗产年份和列入濒危年份之间的时间区间的分布情况,也就是说,在一个地点达到世界遗产地位之后被列入“红色警报清单”所经过的时间。我们把濒危年份减去列入遗产年份,计算出这个值。结果绘制在图1-3中。图1-3 列入世界遗产地年份和列入濒危年份之间的时间区间的分布情况

其中很多地点在被认定为世界遗产之后很快就进入了濒危清单。根据文化遗产或自然遗产的官方入选标准,濒危状态并非必要条件。恰恰相反,濒危遗产地有可能会失去它们作为世界遗产的地位。那么问题是为什么它们在可能会很快失去世界遗产地位的风险下还能进入世界遗产名录呢?有人会猜测世界遗产委员会可能非常了解这些情况,也可能利用世界遗产名录作为对这些地点加强保护的一种政治手段。

现在,花几分钟时间用自己采集的数据做一些实验吧!哪个国家的濒危遗产地最多?濒危世界遗产名录的有效性如何?在维基百科页面上还有另一个表格列出了以前被列入过世界遗产的地点的信息。你可能需要把这些数据也抓取下来,把它们合并到地图上。

只用了区区几行代码,我们就充实了这些数据并获得了一些新的[3]见解,如果单独分析原始表格,这些见解并不是一目了然的。这个例子只是我们把贯穿本书的普遍真理实例化的一个变量而已,而这个普遍真理就是:数据是海量的——获取它们,加工它们,使用它们。

[1] 此处假定所有相关组件已经安装好。否则,请在你的控制台输入下面的命令:install.packages(c("stringr","XML",“maps”))。

[2] 假定你已熟悉R中的基础对象类。否则,请查阅前言部分推荐的相关读物。

[3] 细心的读者会在维基百科上注意到一个链接,点击链接就会转到一幅地图,里面标出了所有的濒危遗产地,和图1-1的结果相同。我们赞赏维基百科的这一工作,但还是希望能自行生成这样的结果。1.2 有关网络数据质量的一些讨论

上面的入门例子优雅地避开了一些更严肃的问题,这些问题在你从事科研工作时很可能会遇到。要解决科研中的问题,哪种类型的数据是最适合的?数据的质量足够高吗?获取的信息是否有系统性的缺陷?虽然本书不会讲解科研设计或处理数据噪声的高级统计方法,但是我们还是要在开始获取大量信息之前对这些问题进行强调。

当查看在线数据时,你必须牢记它的来源。信息可能是一手的,例如,Twitter上的帖子也可能是从离线数据源复制而来的二手数据,甚至是从其他地方拼凑出来的。在某些情况下你可能无法追溯数据的源头。要是这么说,使用来自网络的数据还靠谱吗?我们认为答案是肯定的。

说到数据生成的透明度问题,网络数据在这方面和其他二级来源相比并没有太大的差异。就拿维基百科做个流行的例子吧。关于把在线百科全书内容引用到科研和论文里是否合适,这个问题一直存在争议。对于把维基百科的表格数据或文本用于分析的情况,也存在同样的问题。研究表明,维基百科里面内容的准确度也是各不相同的。有一些研究结果发现维基百科与那些历史悠久并得到公认的百科全书的质量是差不多的(Chesney 2006;Giles 2005;Reavley et al.2012),而其他研究结果则提出维基百科的数据质量有时比较低劣(Clauson et al.2008;Leithner et al.2010;Rector 2008)。但是,如果你只依赖于某一个特定的条目,怎么能知道它的质量到底是高还是低呢?所以,我们的建议是找到第二个数据源,用它来验证内容的质量。如果你不确定两个数据源是否来自同一个源头,就应该再次重复寻找下一个数据源的过程。这样的交叉检验对于任何二级数据源都应该是标准的程序,因为数据源的声誉并不能排除随机性或系统性的错误。

此外,数据质量并非像徽章一样订在数据上面,而是取决于它的应用。在随机的一天选取一组Twitter推文的样本,这对于分析#号的使用情况或其中句子的性别特性可能是充分的,但对预测大选结果来说,如果采集样本的当天正好赶上共和党全国大会召开,这些样本就不那么好用了。对于后者的情况,数据很可能因为采集日期不合适而出现偏差,也就是说,从“代表性”的角度来看,它们是达不到质量标准的。因此,唯一的数据质量标准是你自己设定的。事实上,处理事实数据的质量标准会更加相近,比如,非洲大象数量在过去6个月里很可能没有增长三倍,再比如,美国的首都是华盛顿而不是纽约。

毫无疑问,在使用在线数据的情况下,虽然不能因此而降低数据质量的标准,但是需要关心的问题有可能会不一样。比如,你想知道人们对一种新手机的看法。针对这种问题,市场研究行业有好几种标准方法。例如,你可以进行手机调查,询问数以百计的受访者他们是否考虑购买某一种手机,以及其中他们最感兴趣的功能。很多已出版的书籍分析了这种场景下有可能出现的数据质量缺陷。例如,对于那些我希望了解他们看法的人,受访者是否有“代表性”?对受访者的提问是否适合用来征求我所研究问题的答案?

用数据解答这个问题的另一种方法是寻找“代理”(proxy),也就是一些指标,这些指标本身并不是直接用来衡量这个产品受欢迎的程度,但它们和受欢迎程度是紧密相关的。如果受欢迎程度的含义是人们喜爱一种产品超过其他的同类产品,那么电商网站上的销售统计数据就可以是受欢迎程度的一个间接衡量指标。这些统计数据通常会包括所有上架手机的销售排名。那么,代表性的问题又来了:一方面是关于上架手机的(会不会有一些手机没上架,因为该电商网站上没有对它进行销售?),另一方面是关于客户的(在网上买手机,尤其是在特定的电商网站上买手机的是哪些人?)。但不管怎样,这个排名确实提供了关于手机市场的一个更全面的印象:很可能比在合理成本下进行的任何客户调查有希望达到的全面程度更高。获取全新信息的能力大概是使用在线数据最重要的依据,因为它让我们能解答新的问题,或对现有问题获得更深刻的理解。当然,对于这些新的价值,与之俱来的是关于数据质量的新问题,即不同年代的手机能不能放在一起比较,我们能否评价这种排名的稳定性?在很多情况下,对数据源的选择是对其优点和劣势、准确性和完整性、覆盖度和有效性等因素的权衡。

总结一下,要决定为你的应用采集哪些数据并非易事。我们推荐用5个步骤来帮助指导你的数据采集流程:

·要了解自己所需的到底是何种信息。这种信息可能是明确的(“经合组织所有国家过去10年的GDP”),也可能是模糊的(“消费者对X公司出品的新手机的看法”“美国参议院议员之间的合作关系”)。

·确定网上是否有数据源提供了和你的问题直接或间接相关的信息。如果你在寻找确定的事实,这可能会比较容易做到。如果你感兴趣的是相对模糊的概念,那就会困难一些。

·一个国家的大使馆主页可能是了解其外交政策动态很有价值的信息来源,这些政策动态往往隐藏在外交辞令的幕布之后。Twitter帖子可能涵盖了几乎所有问题的舆论方向,电商平台可以告诉我们客户对产品的满意度,房产网站上的租金数据可能反映了城市各地段当前的热度……

·在寻找潜在数据源的同时,制定一套数据生成流程的准则。数据是什么时候产生的,是什么时候上传到网络的,是谁经手的?是否有潜在的领域没有覆盖到、不一致或不准确,你是否有能力甄别并纠正它们?

·在数据源的优点和劣势之间进行权衡。相关的影响因素包括可用性(还有合法性!)、采集成本、新数据源和现有研究主题的兼容性,还有非常主观的因素,例如,其他人对该数据源的接受程度。另外,考虑一下检验数据质量的可能途径。是否有其他独立的数据源可以提供类似的信息,使随机的交叉检验成为可能?对于二手数据,你是否能确定原始数据源并检查数据转换的错误?

·做出决定!选择看起来最适合的数据源,记录你做出决定的原因,并开始数据的预处理。如果可行,要从多个数据源采集数据用于检验数据源。对于多数据源采集策略,只有在实际采集工作开始之后,很多问题和好处才会浮现出来。1.3 传播、提取和保存网络数据的技术

从网络采集数据并不总是像前面的入门例子里描述得那么简单。在数据保存在比HTML表格更复杂的结构里的情况下、在网页是动态生成的情况下或当需要从纯文本中提取信息的时候,困难就冒出来了。用R进行自动化的数据采集会涉及一些学习成本,这主要意味着你必须掌握一套网络和网络相关技术的基础知识。不过,在讲解这些基础工具的内容中,我们会尽可能着重于讲解网络抓取和文本挖掘的必要基础知识,而忽略掉关系不大的细节。要编写良好的网络抓取程序,成为所有网络技术的专家绝不是必需的条件。

要用R在网络上进行数据采集,有三个技术领域是很重要的。图1-4给出了这三个领域的概况。在本章余下的部分里,我们会逐个介绍这些领域并对它们之间的各种联系进行说明。这有助于你在学习本书第一部分的基础知识时保持宏观的视野,然后再继续学习本书第二部分,即实际的网络抓取任务。图1-4 传播、提取和保存网络数据的技术1.3.1 在网络上传播内容的技术

我们涉及的第一个核心内容是在网络上发布内容的技术。数据传播有多种方式,但与这个核心内容关联度最高的是XML/HTML、AJAX和JSON(图1-4左边的一列)。

对于在网络上浏览,在屏幕之后有个隐藏的标准,它定义了信息显示方式的结构,这就是“超文本标记语言”(HTML)。不管我们是在维基百科上查阅资料,在Google上搜索站点,查看我们的银行账号,还是在Twitter、Facebook或YouTube上进行社交,使用浏览器就意味着使用HTML。虽然HTML不是一种专用的数据存储格式,但它往往包含了我们所感兴趣的信息。我们会在文本、表格、列表、链接或其他结构里寻找数据。遗憾的是,数据在浏览器里展示的方式和它们在HTML代码里存放的方式是有差异的。为了从网上自动化采集数据并用R处理它们,对HTML及其信息存放方式的基本理解是必不可少的。我们在第2章里会从网络抓取程序的角度对HTML进行介绍。

可扩展标记语言(XML)是最流行的网络数据交换格式。从都是标记语言的方面来看,它和HTML算是近亲。不过,HTML是用于定义信息的显示,而XML的主要用处是存放数据。所以说,HTML网页用于给浏览器解析并转化成漂亮的输出效果,而XML“仅仅是”用户自定义标签内部的打包数据。用户自定义标签使XML远远比HTML更适合存放数据。近年来,XML及其衍生物,即所谓的“模式”(scheme),已经在网络应用的各种数据交换中大行其道。因此,当你从网络采集数据时,熟悉基本的XML知识是很重要的(见第3章)。HTML和XML风格的文档都提供了用于存放数据的结构,这种结构是自然的,通常也是分层的。为了识别和解析这种结构,我们就需要能“理解”并充分处理这种语言的软件。必要的工具,也就是解析器(parser),会在第2章和第3章介绍。

另一个网络常常用到的标准数据保存和交换格式是“JavaScript对象标记”(JSON)。类似于XML,JSON也被用于大量互联网应用,为Web开发者提供数据。想象一下,XML和JSON都是为纯文本数据定义容器的标准。例如,如果开发者要分析Twitter上的热点,就可以从Twitter设置的一个以JSON格式分发信息的接口来收集必要的数据。之所以数据的分发优先采用XML或JSON格式,主要是因为这两种格式兼容了很多编程语言和软件,包括R在内。由于数据提供者无法知道后期处理这些信息的会是什么软件,合适的方案就是所有参与方都以普遍接受的标准格式来发布数据。JSON的逻辑会在3.2节介绍。

AJAX是一组已经紧密集成到现代Web开发工具集中的技术。在让网站能支持从浏览器会话(session)后台异步请求数据并以动态风格更新其视觉呈现方面,AJAX扮演了举足轻重的角色。虽然现代Web应用的复杂精巧要大大归功于AJAX,但这些技术对于网络抓取程序就很讨厌了,我们用标准的R工具会很快撞进一个死胡同里。第6章会专门讨论JavaScript和XMLHttpRequest这两项关键的技术,并讲解用AJAX改进的网站是如何偏离经典的HTML/HTTP逻辑的。我们还会讨论针对这类问题的一个解决办法,借助浏览器集成的Web开发者工具在浏览器内部进行更深入的探寻。

我们抓取网络信息的时候经常会处理纯文本数据。从某种意义上来说,纯文本是每个HTML、XML和JSON文档的一部分。我们希望强调的关键问题是,纯文本是非结构化数据,至少对逐行读取文本文件的计算机程序来说是这样的。对于纯文本数据,本书中没有安排专门的章节进行介绍,但第8章给出了有关如何从这类数据中提取信息的指南。

为了从网络查找数据,我们必须让电脑能够与服务器和Web服务进行通信。Web通信的通用语是超文本传输协议(即HTTP)。这是客户端和服务器之间最常用的通信标准。实际上,我们打开的每个HTML页面、在浏览器上看到的每个图片、观看的每个视频,都是通过HTTP传输的。尽管我们一直在使用这个协议,但我们大部分人都不会注意到它,因为HTTP交换通常是由电脑进行的。我们会从本书中了解到,对很多基本的网络抓取应用来说,我们不需要关心HTTP协议的细节,因为R可以很好地接手大部分的任务。不过,在某些情况下,我们需要深入该协议内部,构造更高级的Web请求来获取所寻找的信息。因此,HTTP协议的基本概念是第5章的主题。1.3.2 从Web文档中提取信息的技术

要从我们收集的文档中查找信息,就需要用到网络数据采集的第二个核心技术内容了。对应于收集文档使用的不同技术,有不同的工具适用于从这些来源抽取数据(图1-4的中间列)。本节会对这些可用的工具进行简介。使用R进行信息提取的一大优势是我们可以在R的环境内部使用这些技术,即使某些技术并非R专用,而是通过一套组件来实现的。

我们手头的第一个工具是XPath查询语言。它是用来从如HTML、XML及其变体(如SVG或RSS)之类的标记文档中选择特定信息片段的。在一个典型的网络数据抓取任务中,要获得结构良好而且整洁的数据集,调取网页是一项重要但通常只是中间的步骤。为了充分利用网络这一近乎无穷无尽的数据源的好处,一旦相关的网络文档被确定并下载,我们还必须进行一系列的过滤和提取步骤。这些步骤的主要目的是把保存在标记文档中的信息重塑为适合用统计软件进行后期处理和分析的格式。这一任务包括确定我们感兴趣的数据并确定它在特定的文档中的位置,然后对相应文档定制一个查询来提取我们想要的信息。XPath会被作为执行这些任务的一种选项在第4章进行介绍。

相比HTML或XML文档,JSON文档更为轻量级,也更易于解析。要从JSON中提取数据,我们无须使用特定的查询语言,依赖R的高级函数就能很好地解码JSON数据。我们会在第3章说明它的用法。

从利用AJAX技术生成的网页中提取信息是一个更高级、更复杂的场景。作为从R控制台初始化Web请求的有力替代方案,我们要推出Selenium框架,把它作为处理网络数据的一种实用方案。Selenium让我们能通过R向浏览器窗口引入一些命令,例如,鼠标点击或键盘输入。通过在浏览器中直接操作,Selenium能够避免一些与采用AJAX技术所生成的网页相关的问题。我们会在9.1.9节的一个数据抓取案例中介绍Selenium。该节会借助一个实际应用来讨论Selenium框架以及R的Web驱动组件。

网络抓取的一项核心任务是从大量的文本数据中采集与我们研究的问题相关的信息。我们通常会关心文本数据中的系统性元素,特别是在我们需要对结果数据运用量化分析方法的情况下。系统性结构可能是数字或名字,如国家或地址。能用来提取信息中的系统性组成部分的一种技术就是正则表达式。本质上说,正则表达式就是能够匹配文本中固定并重复出现的模式的一些抽象字符串序列。除了使用它们从纯文本文档中提取内容,我们还可以将其应用到HTML和XML文档中,来识别并提取我们感兴趣的文档片段。虽然对标记文档来说,使用XPath查询往往是更好的方法,但是如果需要的信息是藏在最底层的原子级数据中的,正则表达式就能起作用了。此外,如果相关的信息是分散在整个HTML网页中的,某些探索文档结构和标记的方法可能会变得无效。在第8章会详细讲解正则表达式在R中是如何工作的。

除了从文本数据中以数字或名字的形式提取有意义的信息,我们手头还有第二项技术,即文本挖掘(text mining)。运用这类程序可以让研究者基于所使用词句的相似性来对非结构化文本进行分类。要理解文本挖掘的概念,你可以考虑一下字面信息和隐含信息的不同之处。前者描述的是具体关联到特定术语的信息,例如,一个地址或一种温度计量单位,后者则是指不包含在文本内容中的文字标签。例如,在分析一组新闻报道时,人类读者能够把它们划分到特定的主题类别中,如政治、媒体或运动。文本挖掘过程提供了对文本进行自动化分类的解决方案。这在分析网络数据时尤其有用,这些网络数据通常是以无标签、非结构化的文本形式出现的。我们会在第10章详细介绍几种这方面现有的技术。1.3.3 数据保存的技术

最后,网络数据采集的第三个核心技术是处理数据保存的手段(图1-4的右列)。R通常是非常适合管理数据保存(比如数据库)技术的。总体而言,信息提取技术和数据保存技术之间的关联并不是那么明显。最好的保存数据方法未必和它的来源有关系。

如在线购物、浏览图书馆目录、汇款或在超市购买两包糖果这样简单的日常过程都涉及了数据库。我们很少意识到数据库扮演了如此重要的角色,这是因为我们并不直接和它们交互——数据库喜欢在幕后工作。对一个项目来说,只要数据是关键因素,网络管理员就会依靠数据库,这是因为数据库具有可靠性、效率、多用户访问、近乎无限的数据容量以及远程访问的能力。对自动化数据采集而言,数据库备受关注的原因有两个:一是我们偶尔可能会被授权直接访问数据库,所以应该为此做好准备;二是虽然R有很多数据管理工具,但有时可能把数据保存到数据库里比保存在某种本地文件格式里要好。例如,如果你在从事一个项目,项目里的数据需要做成能在线访问的;或者你有多个合作方,他们各自为你搜集特定的一部分数据,一套数据库就能提供必要的基础架构。此外,如果你需要采集的数据量很大,而且经常给数据分组并进行操作,设置一套数据库也是靠谱的做法,因为对它们进行查询的速度就会很快。对于数据库的很多优势,我们会在第7章介绍,并把SQL作为主要的数据库访问和通信语言进行讨论。

不过,在很多情况下普通的R数据保存技术就够用了,例如,用二进制或纯文本格式导入和导出数据。在第11章,我们会讲解网络抓取总体工作流程的一些细节问题,包括数据管理任务。1.4 本书的结构

我们在写这本书的时候,心里一直想着广泛的各种读者需求。人各有志,加上使用R的经验也不同,你既可以从封面一直读到封底,也可以单独选择对完成手头工作有用的一个小节。

·如果你具备R的基本知识但不熟悉任何网络常用的脚本语言,你就可以按部就班地跟着本书学习。

·如果你已经有了一些文本数据并需要从中提取信息,你可以从第8章(介绍正则表达式和基本字符串函数)开始,再加上第10章(介绍统计性文本处理)。

·如果你主要对网络抓取技术感兴趣,但抓取文本数据除外,你应该可以整个跳过第10章。不管是哪种情况,我们都推荐阅读第8章,因为文本操作的基本技术也是网络抓取的基础。

·如果你是一位教师,你应该可以把本书作为基础或补充教材。为此我们在第一部分和第二部分的大部分章节之后都提供了一套练习题。在本书的官网www.r-datacollection.com上有一半左右练习题的参考答案,这样你就可以用它们布置作业或作为考试题。

对于所有其他读者,我们希望你也能发现本书的结构是有所帮助的。下面就是本书三个部分的简单概述。

在第一部分,我们会介绍在互联网上通信、交换、保存和显示信息的基础技术(HTTP、HTML、XML、JSON、AJAX、SQL),并讲解用于查询网络文档和数据集的基本技术(XPath和正则表达式)。这些基础技术对于那些还不熟悉网络架构的读者尤其有用,如果你已经有一些这方面的知识,用它温故知新也是可以的。本书第一部分明确着重介绍数据提取相关的基本概念,本书其他部分都会用到它们,并提供大量的练习让读者快速适应这些技术。

本书第二部分由三个核心章节组成。第一个核心章节讲解了多种网络抓取技术,即正则表达式的使用、XPath、各类API接口、其他数据类型以及开源社区相关的技术。我们展示了一组常见场景,并针对这些任务运用了流行的R组件。我们还会讨论网络抓取的法律层面的问题,并针对如何在网络上行为得体给出了忠告。第二个核心章节是用于统计性文本处理的技术。数据常常是以文本的形式获得的,需要进一步解析才能适用于后续分析。我们会讲解统计性文本处理的两种主要方法(监督与非监督文本分类)的多种实现技术,并演示隐式信息是如何提取出来的。在第三个核心章节,我们会给出关于用R管理数据的项目中常见问题的一些见解。我们会讨论如何利用文件系统,如何利用循环提高编程效率,如何组织网络抓取过程,以及如何安排定期执行的抓取任务。

在本书第三部分,我们会提供一组应用,把第一部分和第二部分所介绍的技术进行实际运用。每个案例分析的开头是相关分析内容的简短需求和目标。相比之前的技术型章节,该部分的案例分析会深入更多细节中,并讨论更广泛的一些问题。另外,这些案例分析还会针对日常的数据抓取和文本处理的工作流程、真实环境数据中的陷阱以及规避它们的方法等问题提供一些实用的见解。这部分还包含了案例分析内容的一览表,其中包括从网络或文本中提取数据用到的关键技术的视图,以及这些任务会用到的关键组件和函数。第一部分 网络和数据技术入门

第2章 HTML

第3章 XML和JSON

第4章 XPath

第5章 HTTP

第6章 AJAX

第7章 SQL和关系型数据库

第8章 正则表达式和基本字符串函数第2章 HTML

在网络上浏览时,我们阅读和操作的几乎所有内容的背后都隐藏着一个标准:超文本标记语言(Hyper Text Markup Language,HTML)。不管是我们在维基百科上查找信息,在Google搜索站点,查看我们的银行账号,还是在Twitter、Facebook和YouTube上进行社交活动,只要使用浏览器,就在使用HTML。

HTML是一种用于展示网上内容的语言,由Tim Berners-Lee于1989年首次提出。在问世之后,这个标准经历了持续演化,最近的版本是由万维网联盟(W3C)和网络超文本应用技术工作组[1](WHATWG)制定的HTML5标准。尽管HTML的每个修订版都会提出新的特性并重构旧的特性,但是HTML网页的基本语法在这些年并没有多少变化,在可预见的未来应该也会保持相对稳定,这使它成为网络相关工作最重要的标准之一。

本章会从网络数据采集者的角度对HTML的基础知识进行介绍。我们会学习如何使用浏览器显示网页的源代码并查看特定的HTML元素(见2.1节)。在2.2节会总体分析标记语言的逻辑,以及HTML作为标记语言具体实例的语法。之后我们继续讲解HTML中最重要的一些词汇(见2.3节)。最后,在2.4节我们会分析解析过程,即重新组织HTML网页结构和语义的过程,以及这个过程是如何帮助我们从网页上获取信息的。

[1] W3C负责为网络技术制定标准。它是由Tim Berners-Lee创建

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载