本节书摘来异步社区《机器学习与数据科学(基于R的统计学习方法)》一书中的第2章,第2.12节,作者:【美】Daniel D. Gutierrez(古铁雷斯),更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.12 读取Twitter数据
鉴于数据科学正在快速演变,我们可以看到社交媒体中的非结构化数据正在为传统的数据源增添异彩。毋庸置疑的是,最流行的社交媒体数据源是Twitter。“非结构化”这一术语用于描述社交媒体数据,因为它不像典型的企业事务数据那样通常呈现表格形式。非结构化数据是自由格式,可能是纯文本,在推文中是140个字符、缩略语、控件、标签和特殊符号。就像其他所有数据源一样,使用这类数据的第一步是将它读进R环境。在本节中,我们将分步演示使用R读取推文的过程。
遗憾的是,使用Twitter作为数据源有点费劲,因为从2013年3月开始,安全要求成为了必备条件(在此之前,读取数据容易得多)。你必须拥有一个Twitter账户,并在你的R代码中提供对这个账户的身份验证。
首先,我们要安装twitteR包,来帮助读取推文。这是基于R的Twitter客户端,这个包提供了一个到Twittwe网页API的接口,也包括了ROAuth库(开放式身份验证),用Twitter对我们进行身份验证必须用到该库。
> install.packages("twitteR") # Contains ROAuth
> library(twitteR)
> library(ROAuth)```
下一步,我们将定义几个变量来存放几个特殊的URL,用于和Twitter进行通信:requestURL、accessURL和authURL。而且,如果你是一个Windows用户,需要从下面提供的URL中下载特殊的CA(社区驱动的证书颁发机构)证书文件。
requestURL <- "https://api.twitter.com/oauth/request_token"
accessURL <- "https://api.twitter.com/oauth/access_token"
authURL <- "https://api.twitter.com/oauth/authorize"
download.file(url="http://curl.haxx.se/ca/cacert.pem", destfile= "cacert.pem")`
接下来,你要访问http://dev.twitter.com/apps/new
,用你的Twitter账户登录,创建一个Twitter应用。然后在页面上输入详细信息,才能通过Test Auth按钮得到用户关键字和用户秘钥。你需要将秘钥复制粘贴到你的R代码中。
> consumerKey <- "tu4dkb9fHLgLrNptaI2CA"
> consumerSecret <- "UzlhoMFyF9IZ6bxxG89DLdPB74VUzur3mBWcr6LcVE"
> Cred <- OAuthFactory$new(consumerKey=consumerKey,
consumerSecret=consumerSecret,
requestURL=requestURL,
accessURL=accessURL,
authURL=authURL)```
现在输入下面这行代码,要求Twitter提供一个数值型的PIN号码给你。你将看到R控制台的消息,指导你将控制台中展示的特殊URL复制粘贴到你的浏览器中(注意:如果你无法高亮显示控制台中的URL并将它复制到剪贴板中,需要升级RStudio了)。一旦你做完这个,Twitter API会展现一个网页,包含7位的PIN。你需要把这些数字打印到一直等待输入的控制台中。
Cred$handshake(cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl") )
`
这时,可以使用save()函数将你的Twitter身份验证保存下来,便于以后使用。最后,你需要用twitteR包中的registerTwitterOAuth()函数注册你的Twitter身份验证。
> save(Cred, file="twitter authentication.Rdata")
> registerTwitterOAuth(Cred)
[1] TRUE```
如果想在以后读取推文,只需要使用下面这段代码:
load("twitter authentication.Rdata")
registerTwitterOAuth(Cred)`
最后,我们已经做好了读取推文的准备了。在下面这段代码中,我们使用了searchTwitter()函数,并给它传递了一个搜索关键字。在这个例子中,标签#MLB代表了美国职业棒球大联盟。Twitter API限制了你可以读取的推文最多是499条。推文以列表的形式返回,所以我们使用twListToDF()函数将它们转化成数据框的形式,便于后续分析。最后,我们可以将推文以CSV的格式写出,便于保存。
> MLB.list <- searchTwitter('#MLB', n=499, cainfo="cacert. pem")
> MLB.df = twListToDF(MLB.list)