RCurl包学习
基础
library(RCurl)
d = debugGatherer()
temp <-getURL("http://www.dataguru.cn/",debugfunction=d$update,verbose = TRUE)
cat(d$value()[3])#提交给服务器的头信息
cat(d$value()[1])#服务器地址以及端口号
cat(d$value()[2])#服务器端返回的头信息
#将头部结果以列表形式输出
h = basicHeaderGatherer()
txtt=getURL("http://www.dataguru.cn/",headerfunction = h$update)
names(h$value())
h$value()
#将头部结果以字符串形式输出
headers = basicTextGatherer()
txt=getURL("http://www.dataguru.cn/",headerfunction = headers$update)
names(headers$value())#说明是字符串形式
headers$value()#转换成列表cat(headers$value())
#查看Curl的访问信息
curl = getCurlHandle()
d=getURL("http://www.dataguru.cn/", curl = curl)
getCurlInfo(curl)$response.code
getCurlInfo(curl)
#伪装自己的操作系统的信息
myheader<-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"
)
#伪装成UC浏览器来进行服务器的访问
myheader<-c(
"User-Agent: NOKIA5700/ UCWEB7.0.2.37/28/999",
"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"
)
d = debugGatherer()
temp <-getURL("http://www.dataguru.cn/",debugfunction=d$update,verbose = TRUE,httpheader=myheader)
#getForm数据不用进行加密提交搜索数据
#PostForm数据需要进行加密提交搜索数据
#对百度搜索的网页进行爬取
url <- getForm("http://www.baidu.com/s?wd=火影")
write.table(url,"url.txt")
getURL函数中的参数的解释
1. verbose:输出访问的交互信息
2. httpheader:设置访问信息报头,可自定义httpheader=myheader
3. .encoding="UTF-8" "GBK"
4. debugfunction,headerfunction,curl
5. .params:提交的参数组
6. dirlistonly:仅读取目录
7. followlocation:支持重定向,比如一个网页<http://www.sina.com > 尾部应该是.cn,如果此时输入错误,则会进行报错,但是加上参数followlocation=T,则网站会进行自行的跳转,跳转到<http://www.sina.cn>
8. maxredirs:最大重定向次数,防止跳转链接进入一个死循环
抓取网页中文乱码解决方法
1. 抓取页面时编码没有选对;2. 解析表单时编码没有选对。解决方法如下:
url="http://data.earthquake.cn/datashare/datashare_more_quickdata_new.jsp"
wp<-getURL(url,.encoding="gb2312") #用网页本身的编码
wp2=iconv(wp,"gb2312","UTF-8") #转码
Encoding(wp2) #UTF-8
doc <- htmlParse(wp2,asText=T,encoding="UTF-8") #选择UTF-8进行网页的解析
#查看doc的内容时显示有乱码,但没关系,table的解析结果没有乱码
tables <-readHTMLTable(doc,header=F)
- 网址:http://f.dataguru.cn/thread-356009-1-1.html
- 解决RCurl爬虫,首先考虑将Rstudio编码设置为GB2312,然后再考虑使用上述的方法来进行爬虫,可能文件在爬取的过程中会显示是乱码,但是只要使用xpathSapply函数进行文件解析最后的结果是中文的,就能满足要求。
使用getBinaryURL函数下载文件
url <- "http://10.0.1.8/images/links/bbs1.gif"
temp <- getBinaryURL(url)#下载一个URL二进制文件
note <- file("hello.gif",open = "wb")#打开一个文件链接,对该文件进行二进制写入操作,注意文件的后缀名
writeBin(temp,note)#将temp写入note文件中
close(note)#关闭写入文件
批量下载文件
library(XML)#XML/HTML解析包
library(RCurl)#RCurl爬虫包
library(stringr)#文本处理包
url <- "http://rfunction.com/code/1202/"#主界面
html <- getURL(url)#下载二进制html文件
html_doc <- htmlParse(html)#解析html文件
url_html <- str_replace_all(unlist(xpathSApply(doc = html_doc,path = "//li/a[contains(./text(),'.R')]",fun=xmlValue)),pattern = " ",replacement = "")
#使用xpath查询语句将.R文件的名字提取出来,unlist将列表扁平化转换为向量,然后使用stringr包中的函数str_replace_all将字符串向量中的空格删除掉
temp <- NULL;
#i=1
for(i in 1:length(url_html))
{
url_html_last<- paste(url,url_html[i],sep="");
#将界面的url链接和.R文件名字连接起来,成为每个.R文件的url路径
temp <- getBinaryURL(url_html_last);
#下载每个.R文件的二进制html文件
note <- file(paste(url_html[i]),open="wb")
#打开文件,对该文件进行二进制写入操作,文件的名字为.R文件的名字
writeBin(temp,note)
#将temp文件写入连接note中
close(note)
#关闭文件,运行成功后即可下载完毕
Sys.sleep(time = 30)
#每爬一次休息一会儿
}
使用RCurl爬取豆瓣电影评分
require(RCurl)
library(XML)
x='明日世界'
search <- getForm("https://movie.douban.com/", search_text = x)
searchweb<-htmlParse(search,asText=T,encoding="UTF-8")
#乱码了 searchweb
searchweb
# 解析搜索结果页面
resnodes<-getNodeSet(searchweb,"//div[@id='wrapper']//table[1]//a")
#查找id为wrapper的div里面table第一第的数
resurl<-xmlGetAttr(resnodes[[1]],name="href")
#找到电影url地址
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]])
name;
score;
解决中文乱码的例子
library(RCurl)
library(XML)
library(stringr)
url="http://baike.baidu.com/subview/273889/5093882.htm"
wp<-getURL(url,.encoding="gb2312",followlocation=T) #用网页本身的编码
#直接进行解析,#加上参数followlocation=T,支持网页跳转
doc <- htmlParse(wp,asText=T,encoding="UTF-8")
#doc文件显示的中文是乱码,但是不要紧,使用xpath查询结果是正常的
xpathSApply(doc,"//dt[@class='basicInfo-item name']",xmlValue)#查询电影的基础信息字段名字
xpathSApply(doc,"//dd[@class='basicInfo-item value']",xmlValue)#查询电影的基础信息的值
#二者的长度应该是相等的
####考虑是否需要转码的程序
wp2=iconv(wp,"gb2312","UTF-8") #转码
Encoding(wp2) #UTF-8
doc <- htmlParse(wp2,asText=T,encoding="UTF-8") #选择UTF-8进行网页的解析
#查看doc的内容时显示有乱码,但没关系,table的解析结果没有乱码
tables <-readHTMLTable(doc,header=F)
#使用百度搜索爬虫的例子
getwd()
setwd("./我的R/RCurl包学习/")
#先使用百度搜索一个例子,比如“碟中谍”,获取参数
url <- "https://www.baidu.com/s?wd=%E7%A2%9F%E4%B8%AD%E8%B0%8D&rsv_op=LteD3w8Y4BopY7Hr664Ak1Oh37Ol8AKpP2A187anxe7YHooBmDGaNkS96wCFnFd7XgAn50j824I648lYQzUlqvED4jYBAvjPX8d93MMky05546hIl122t2pM7269NN5Q7bRIMidr695Ybd0UgCQNjgVcw2y4dt2wMrk29jh0IG7OXWwuj88fRg&tn=91514441_hao_pg&ie=gbk"
#得到url链接的参数
getFormParams(url)
#修改参数wd,即为百度搜索的内容参数wd,其他参数复制粘贴进函数中,然后运行
wp <- getForm("http://www.baidu.com/s",wd="RCurl",rsv_op ="LteD3w8Y4BopY7Hr664Ak1Oh37Ol8AKpP2A187anxe7YHooBmDGaNkS96wCFnFd7XgAn50j824I648lYQzUlqvED4jYBAvjPX8d93MMky05546hIl122t2pM7269NN5Q7bRIMidr695Ybd0UgCQNjgVcw2y4dt2wMrk29jh0IG7OXWwuj88fRg" ,tn ="91514441_hao_pg",ie ="gbk" )
doc <- htmlParse(wp,asText=T,encoding="UTF-8")
write.table(wp,"百度搜索例子.txt")
#使用淘宝搜索的页面爬取的例子
url <- "https://s.taobao.com/search?q=%E5%9B%BE%E8%A7%A3%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.50862.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20161029"
#得到url链接的参数
getFormParams(url)
#修改参数wd,即为淘宝搜索的内容参数q,其他参数复制粘贴进函数中,然后运行
wp <- getForm("https://s.taobao.com/search?", q="火影",imgfile="",commend="all" ,ssid="s5-e",search_type="item",
sourceId=
"tb.index" ,
spm =
"a21bo.50862.201856-taobao-item.1" ,
ie =
"utf8" ,
initiative_id=
"tbindexz_20161029" )
write.table(wp,"淘宝搜索例子.txt")
#使用淘宝搜索的页面爬取的例子
url <- "https://s.taobao.com/search?q=%E5%9B%BE%E8%A7%A3%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.50862.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20161029"
#得到url链接的参数
getFormParams(url)
#修改参数wd,即为淘宝搜索的内容参数q,其他参数复制粘贴进函数中,然后运行
wp <- getForm("https://s.taobao.com/search?", q="火影",imgfile="",commend="all" ,ssid="s5-e",search_type="item",
sourceId=
"tb.index" ,
spm =
"a21bo.50862.201856-taobao-item.1" ,
ie =
"utf8" ,
initiative_id=
"tbindexz_20161029" )
write.table(wp,"淘宝搜索例子.txt")
library(RCurl)
library(XML)
#Rstudio 需要设置默认的编码格式为gb2312,即网页的默认编码格式
#百度新闻查询结果数据是乱码格式,考虑解决的办法
#试试新浪首页
url <- "http://www.sina.com.cn/"
wp<-getURL(url,.encoding="gb2312",followlocation=T) #用网页本身的编码
#wp2 <- iconv(wp,"gb2312","UTF-8")#转码
#Encoding(wp2)#编码
#直接进行解析,#加上参数followlocation=T,支持网页跳转
doc <- htmlParse(wp,asText=T,encoding="UTF-8")#解析
#doc文件显示的中文是乱码,但是不要紧,使用xpath查询结果是正常的
#write.table(xpathSApply(doc,path = "//a",xmlValue),"百度新闻.txt")
#xpathSApply(doc,path="//ul[@class='list-a news_top']/li/a",xmlValue)
#xpathSApply(doc,path="//ul[@class='list-a news_bottom']/li/a",xmlValue)
xpathSApply(doc,path="//div[@class='top_newslist']/ul/li/a",xmlValue)
#使用RCurl爬取豆瓣电影评分
require(RCurl)
library(XML)
x='明日世界'
search <- getForm("https://movie.douban.com/", search_text = x)
searchweb<-htmlParse(search,asText=T,encoding="UTF-8")
#乱码了 searchweb
searchweb
# 解析搜索结果页面
resnodes<-getNodeSet(searchweb,"//div[@id='wrapper']//table[1]//a")
#查找id为wrapper的div里面table第一第的数
resurl<-xmlGetAttr(resnodes[[1]],name="href")
#找到电影url地址
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]])
name;
score;
#爬取豆瓣电影top250
library(stringr)
library(RCurl)
library(XML)
url <- paste("https://movie.douban.com/top250?start=",seq(0,225,by=25),"&filter=",sep = "")
y <- NULL;
for (i in 1:length(url)){
wp<-getURL(url[i],.encoding="gb2312",followlocation=T)
doc <- htmlParse(wp,asText=T,encoding="UTF-8")#解析
#电影名字
name <- xpathSApply(doc,path="//span[@class='title'][1]",xmlValue)
#评分
score <- xpathSApply(doc,path="//span[@class='rating_num' and @property='v:average']",xmlValue)
#上映时间
time <- str_extract(xpathSApply(doc,path="//div[@class='bd']/p[@class='']",xmlValue),pattern = '[1-2][0-9]{3}')
#生产地区
for(j in 1:25){
country[j] <- str_split(str_extract(xpathSApply(doc,path="//div[@class='bd']/p[@class='']",xmlValue),pattern = '[1-2][0-9].*/.*/'),pattern = "/")[[j]][2]
}
country <- str_trim(country)
x <- cbind(name,score,time,country)
y <- rbind(y,x)
}
y <- as.data.frame(y)#存入数据框y
#豆瓣大众点评
#报头设置非常重要,爬虫一定要伪装,另外for循环一定要间隔休息
myheader<-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"
)
#url <- "http://t.dianping.com/list/guangzhou?q=%E7%94%B5%E5%BD%B1"
url <- "https://www.douban.com/"
url <- paste(url,"search?q=数学分析",sep = "")
wp<-getURL(url,.encoding="gb2312",followlocation=T,httpheader=myheader)
doc <- htmlParse(wp,asText=T,encoding="UTF-8")#解析
xpathSApply(doc,path = "//div[@class='result']")
总结:
- R语言做爬虫,如果是爬静态网页,使用RCurl包和XML包就能很好解决,主要是使用Xpath查询语句和正则表达式,另外,最好是在linux环境中进行R爬虫,考虑到中文编码的问题,最好环境是使用Rstudio-server环境。