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
- RCurl包学习
- RCurl包学习笔记
- 基于RCurl包的爬虫技术
- R语言爬虫-RCurl和XML学习笔记
- RCurl抓取
- 利用RCurl包完成自己感兴趣的团购信息【批量】抓取
- R不务正业之RCurl
- R不务正业之RCurl
- RCurl的强大
- Rcurl抓取NCBI信息
- R不务正业之RCurl
- RCurl来了-RCurl三大函数初识
- Rcurl--炼数成金课程第一周
- Rcurl小应用,爬取京东评论
- 利用RCurl实现爬虫实战
- RCurl在linux安装问题
- RCurl汽车之家抓取
- RCurl抓取团购信息
- Shuttle ESB(一)——入门实例
- 猴子排圈求最后编号问题
- AngularJS中ng-include随屏幕宽度改变实例
- poj 3080 Blue Jeans(数据结构:KMP)
- jquery 仿微博实现内容自动向下滚动加载
- RCurl包学习
- 004字符串去重 (keep it up)
- 线索二叉树的实现 先序 中序 后序
- BufferedReader源码分析之readLine方法
- C#,Excel数据的导入、处理、导出
- Best of Sublime Text 3: Features, Plugins, and Settings
- 外观模式(Facade Pattern)小结
- Ubuntu 安装配置minicom
- 串口修改PAN ID和Channel