RCurl包学习

来源:互联网 发布:网络公关公司良心哥 编辑:程序博客网 时间:2024/06/03 18:49


参考文档:http://www.omegahat.org/RCurl/,CRAN上提供的pdf文档

有个很好的讲R的网站:http://www.programmingr.com/

先来个desctiption:

The RCurl package is an R-interface to the libcurl library that provides HTTP facilities. Thisallows us to download files from Web servers, post forms, use HTTPS(the secure HTTP), use persistent connections, upload files, usebinary content, handle redirects, password authentication, etc.

CRAN对包的检查很严格。一般CRAN上包都会有比较详细的文档说明。阅读这些文档。能够很好的理解包和解决问题


getURL,简单下载网页

简单到什么程度?知道将网址作为参数就可以返回一个网站的内容。

官方给的example

omegahatExists = url.exists("http://www.omegahat.org")   # Regular HTTP  if(omegahatExists) {     txt = getURL("http://www.omegahat.org/RCurl/")        # Then we could parse the result.     if(require(XML))         htmlTreeParse(txt, asText = TRUE)  }

在此之前要安装RCurl和XML包。安装的时候可能会出现问题。在该网站上给出来提示来。

上面的代码可以修改成一个比较通用的。

web_page <- function(x)

{

   if(url.exists(x))

   {

     txt=getURL(x)

     htmlTreeParse(txt,asText=TRUE)

    }

}

web_page('blog.csdn.net')

简单的下载网页来。不过我想getURL有更加有用的地方。

我们可以用它来获取提交表单后的信息。(不是所有都可以)。本人测试了百度搜索。成功,本人也很想测试google。不过google连不上。说道google连不上。又让我想起之前用RGoogleAnalytics包的时候要提供google account了,连不上,我的RHadoop实例没法做。

百度搜索ICKelin.然后会得到这个网址

http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=ICKelin&rsv_enter=1&rsv_sug3=9&rsv_sug4=919&rsv_sug1=4&rsv_sug2=0&inputT=3659&rsv_sug=1

其他的不用看,就看wd=ICKelin就行。可以猜测这是搜索关键字。我们可以猥琐的将ICKelin改为要搜索的关键字。比如说CSDN,COS.

http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=CSDN&rsv_enter=1&rsv_sug3=9&rsv_sug4=919&rsv_sug1=4&rsv_sug2=0&inputT=3659&rsv_sug=1

以上只是假设。下面来真格

出于测试。直接就getURL来,不判断链接是否存在

page_ICKelin <- getURL("http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=ICKelin&rsv_enter=1&rsv_sug3=9&rsv_sug4=919&rsv_sug1=4&rsv_sug2=0&inputT=3659&rsv_sug=1")

page_CSDN <- getURL("http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=CSDN&rsv_enter=1&rsv_sug3=9&rsv_sug4=919&rsv_sug1=4&rsv_sug2=0&inputT=3659&rsv_sug=1")

page_COS <- getURL("http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=COS&rsv_enter=1&rsv_sug3=9&rsv_sug4=919&rsv_sug1=4&rsv_sug2=0&inputT=3659&rsv_sug=1")

htmlTreeParse(page_ICKelin)


htmlTreeParse(page_CSDN)


htmlTreeParse(page_COS)

结果有了,和直接搜索是一样的。这样我们就通过R实现和在浏览器上实现百度搜素的功能了。我们不喜欢上面的代码。冗余。文档也给我们写了

  if(interactive() && omegahatExists) {     curl = getCurlHandle()     pages = list()     for(u in c("http://www.omegahat.org/RCurl/index.html",                "http://www.omegahat.org/RGtk/index.html")) {         pages[[u]] = getURL(u, curl = curl)     }  }

尽管getURL可以获取一些数据。但是不是最优。众所周知,表单通过post请求将数据发送到http服务器。post请求是不会在浏览器地址栏上显示数据的。如果新浪将你的用户名和密码显示在地址栏上。这样真的不好。

getURL的另外一个用法是自己提供html请求头。这个有点麻烦,要用到火狐的插件。ie也有,不过ie的httpwatch似乎是收费产品

举个例子,例子来自R不务正业。

myHttpheader<- c(
"User-Agent"="Mozilla/5.0(Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.6)",
"Accept"="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language"="en-us",
"Connection"="keep-alive",
"Accept-Charset"="GB2312,utf-8;q=0.7,*;q=0.7"
)

temp<- getURL("http://cos.name/",httpheader=myHttpheader)

R不务正业也给出来查看请求头和相应头的方法。有兴趣好好阅读一番

表单操作在RCurl中提供更为一般的method

getForm,postForm,.postForm比较常用,暂时不介绍。获取页面是很容易的事,获取完页面要干嘛?下一步是解析页面。获取我们想要的内容。以前用c语言写的时候解析页面获取url然后再利用队列结构来存放,实现解析页面下载。总之,获取完页面,要干嘛就得靠你的想象力和你的猥琐程度了.

下面是我在dataguru上看到的一个比较有意思的用法。分享下。

///////////////////////////////////////////////////////////////////////////////////////////////////

作为一个伪影迷,经常纠结一些电影该不该下,要不要看。毕竟吾生也有涯而片源无涯。还好可以去豆瓣一类的地方看看大家的评分择优录用。去豆瓣查分需要登录网站搜索再鼠标点点点,如果要查好几部电影就有点费事儿。其实可以用R写个函数,先抓取相应的网页,再筛选返回需要的分值。这样在R里头就可以批量查分了,恩,走起来。

library(RCurl)library(XML)movieScore <- function(x) {    stopifnot(is.character(x))    # 提交搜索豆瓣表单    search <- getForm("http://movie.douban.com/subject_search", search_text = x)    searchweb <- htmlParse(search)    # 解析搜索结果页面    resnodes <- getNodeSet(searchweb, "//div[@id='wrapper']//table[1]//a")    if (is.null(resnodes))         return(NULL) else resurl <- xmlGetAttr(resnodes[[1]], name = "href")    # 得到影片页面后第二次解析    resweb <- getURL(resurl, .encoding = "UTF-8")    content <- htmlParse(resweb, encoding = "UTF-8")    resnodes <- getNodeSet(content, "//div[@id='interest_sectl']//p[@class='rating_self clearfix']//strong")    namenodes <- getNodeSet(content, "//div[@id='content']//h1//span")    # 得到影片评分    score <- xmlValue(resnodes[[1]])    name <- xmlValue(namenodes[[1]])    return(list(name = name, score = score))}

看看天机这部大烂片多少分。

movieScore("天机")## $name## [1] "天机·富春山居图"## ## $score## [1] "2.9"

抓网页比较慢,豆瓣为人民群众着想提供了API,我们也可以使用API来调取分数,函数也比较简单。

library(RCurl)library(XML)library(RJSONIO)movieScoreapi <- function(x) {    api <- "https://api.douban.com/v2/movie/search?q={"    url <- paste(api, x, "}", sep = "")    res <- getURL(url)    reslist <- fromJSON(res)    name <- reslist$subjects[[1]]$title    score <- reslist$subjects[[1]]$rating$average    return(list(name = name, score = score))}movieScoreapi("僵尸世界大战")## $name## [1] "僵尸世界大战"## ## $score## [1] 7.5

有了这个查分函数,我们可以在R中批量查阅电影评分了。但是豆瓣对于频繁的访问会有限制,对于没有认证的API使用是每分钟10次,超过就会暂时封IP。对于网页抓取,肖楠在第六次R会议上有个很棒的演讲,有兴趣的同学可以去看看。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

如果想获取微薄信息的话。还有个Rweibo扩展包,作者发布两个包,一个是Rweibo,一个是Rwordseg.Rwordseg用来进行中文分词。本人也想尝试利用这两个包来做一个微薄应用。具体细节参照帮助文档。总算是中文。http://jliblog.com/app/rweibo

0 0