RCurl包爬虫学习

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环境。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容