R语言爬虫-RCurl和XML学习笔记

       

欢迎访问我的独立网站:编程小屋

以前就很喜欢爬虫,一段代码可以去搜集网络上的资源,总觉得是很厉害的事情,因为专业的原因,自身比较熟练R语言,但是Python并不熟悉,所以便查找了网上关于R语言爬虫的文章,在此做一个总结。以便自己随时复习。

      首先,提到R语言爬虫,不得不提到两大利器RCurl和XML包,通过这两个包会发现爬虫怎么那么容易 哈,本文不会讲原理乱七八糟的,而是最实用的的函数和方法,你只需要会R最基本的操作,就能阅读本文的内容。

      首先安装这两个函数包并加载

     

install.packages("RCurl")
install.packages("XML")
library(RCurl)
library(XML)

 

 

 

      

      本文将对半次元的网站http://bcy.net/coser/detail/48126/1026772进行萌妹子图片的爬取

      首先,需要把网页爬下来,这一点就需要用到一个利器,getURL(url)函数,url便是你要爬去的网站的网址,直接百度复制就好了(如果你要爬多个网址,研究一下url写个循环就可以啦)

url<-"http://bcy.net/coser/detail/48126/1026772"
web<-getURL(url)

 

     接下来要对爬取得网页进行处理,生成标准的HTML树形结构,方便利用XML里面的函数进行处理

 

doc<-htmlTreeParse(web,encoding="UTF-8", error=function(...){}, useInternalNodes = TRUE,trim=TRUE)

 

     接下来就是最重点的部分了,节点定位,此时建议去你需要读取的网页,浏览器右键读取源代码,找到我们需要的资源所在的标签如下。

 

阿爸~阿妈~快把小蝴蝶带回家啊~










      定位到源码里面我们需要的那部分,如上,包含了网页我们需要的图片的url,我们的目的就是把它提取出来,网页每一个标签都是以开始,以作为结尾的,而我
们想提取,首先定位到标签

 

 

div[@class='post__content js-content-img-wrap js-fullimg js-maincontent mb20']/img

     如果想提取标签里面的文本使用text()

 

 

div[@class='post__content js-content-img-wrap js-fullimg js-maincontent mb20']/text()

     定位到标签

里面的,然后通过getNodeSet函数将定位到的资源提取出来。

 

 

node<-getNodeSet(doc1, "//div[@class='post__content js-content-img-wrap js-fullimg js-maincontent mb20']/img")

      然后通过sapply函数和XML函数结合,可以进一步提取资源,比如我们需要的是img标签里面src的内容

 

 

info=sapply(node,xmlGetAttr,"src")

      在此加上常用的函数,提取数据会变得异常容易

 

 

xmlName() :节点的名字
xmlSize() :字节点的个数
xmlAttrs() :命名所有属性的特征向量
xmlGetAttr(name):获得属性name的值
xmlValue():提取属性所对应的值
xmlParent():叶节点的内容
xmlAncestors():父节点的名字
getSibling():向左向右的姐弟间的值

      通过循环将读取的图片url下载进本地

 

 

x<-1
for(inf in info){
y<-paste("E:/image1/",x,".jpg")#确保本地有image1文件夹
tryCatch({                     #tryCatch()异常处理,若下载图片失败,跳过执行下一次循环
download.file(inf,y,mode="wb") #下载函数,根据图片url下载文件
x<-x+1},error=function(e){
cat("ERROR:",conditionMessage(e),"\n")
}
)
}

 

半次元代码已经过期  附上豆瓣相册爬虫  兼容性很好  更改相册地址 即可爬取相册全部照片  ~~~~  学习用

 

 

 

install.packages("RCurl")
install.packages("XML")
library(RCurl)
library(XML)


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")


ye<-c(1,seq(18,630,18))
info<-NULL


for(i in ye){
  url<-paste("https://www.douban.com/photos/album/50903114/?start=",i,sep="")
  web<-getURL(url,httpheader=myHttpheader)
  doc<- htmlTreeParse(web,encoding="UTF-8", error=function(...){}, useInternalNodes = TRUE,trim=TRUE)
  node<-getNodeSet(doc, "//div[@class='photo_wrap']/a")
  info=c(info,sapply(node,xmlGetAttr,"href"))
}


x<-1
dir.create("E:/image1/") 
for(urlweb in info){
  web1<-getURL(urlweb,httpheader=myHttpheader)
  doc1<- htmlTreeParse(web1,encoding="UTF-8", error=function(...){}, useInternalNodes = TRUE,trim=TRUE)
  node1<-getNodeSet(doc1, "//div[@class='photo-edit']/a")
  info1=sapply(node1,xmlGetAttr,"href")
  web2<-getURL(info1,httpheader=myHttpheader)
  doc2<- htmlTreeParse(web2,encoding="UTF-8", error=function(...){}, useInternalNodes = TRUE,trim=TRUE)
  node2<-getNodeSet(doc2, "//td[@id='pic-viewer']/a/img")
  info2=sapply(node2,xmlGetAttr,"src")
  y<-paste("E:/image1/",x,".jpg")
  tryCatch({
    download.file(info2,y,mode="wb")
    x<-x+1},error=function(e){
      cat("ERROR:",conditionMessage(e),"\n")
      print("loser")})
}



 

 

 

 

你可能感兴趣的:(编程语言)