欢迎访问我的独立网站:编程小屋
以前就很喜欢爬虫,一段代码可以去搜集网络上的资源,总觉得是很厉害的事情,因为专业的原因,自身比较熟练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()
定位到标签
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")})
}