1001位知乎姑娘
其实这篇博文是一个基于R的爬虫,抓取了1001位知乎姑娘所有答主上传的美照。共800多张图片。😄
废话不多说,贴下代码和最后的抓取结果。嗯,😄,我会先贴图再贴代码。
这些图片是来源于哪些优秀的知乎问题??(共100个问题)
菇凉们的图:(我只抓了100张图,总共有800多张吧)(如有侵犯隐私,请立刻联系我,我立刻删除)
代码:
#-------- #2015-10-04 知乎的1001位姑娘 #Lee #http://www.zhihu.com/collection/26348030?page=1 #-------- library(magrittr) library(proto) library(gsubfn) library(bitops) library(rvest) library(stringr) library(DBI) library(RSQLite) library(RCurl) library(curl) library(sqldf) get.jpgurl <-function(pgnum) { url <- paste0('http://www.zhihu.com/collection/26348030?page=',pgnum) #url <- 'http://www.zhihu.com/collection/26348030?page=5' text <- url%>%html_session()%>%html_nodes('textarea.content')%>%html_text() #下面这个问题的答案太棒,直接从文本中提取url。非以jpg结尾的url不要,所以又用正则匹配以jpg结尾的url。 #http://stackoverflow.com/questions/26496538/extract-urls-with-regex-into-a-new-data-frame-column url_pattern <- "http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+" #每个回答,答主可能不止上传一张照片,所以需要从答案txt中提取所有的出以.jpg结尾的url combineurl <- data.frame() for(i in 1:length(text)){ urlpick <- sapply(text[i],function(txt) str_extract_all(txt,url_pattern,simplify=T)) if(!is.matrix(urlpick)) next; # 下面总是报如下错误,好像是有的df并没有列名,强制赋给他一个列名,所以报错。 # google了,也没得到很好的解决办法。先跳过。 # 'names'属性的长度[1]必需和矢量的长度[0]一样 # 最后想明白了,有可能有些答案并没有上传图片,答案的txt里也就没有url,这时候就生成了一个空的矩阵,所以,你给空矩阵改列名,是不可取的。 colnames(urlpick) <- c('V1') urlpick <- as.data.frame(urlpick,stringsAsFactors=F) urlpick <- sqldf("select * from urlpick where V1 like '%jpg'")#再次过滤,只要以jpg结尾的url combineurl <- rbind(combineurl,urlpick) } return(combineurl) } #抓取所有以.jpg结尾的url #总共5页,就不写多线程了‹ url.total <- data.frame() for(i in 1:5){ url.total <- rbind(url.total,get.jpgurl(i)) } #下载所有jpg文件,并从1开始编号,下载后发现每张图片都double了,排查下原因, # https://pic4.zhimg.com/d69a132cc27914af57c1b9eeb1a938c7_b.jpg # https://pic4.zhimg.com/d69a132cc27914af57c1b9eeb1a938c7_r.jpg # 以上两个url指向的是同一张图片,但这两个url不一样,是前后挨着的。 # 分别查看了以b.jpg和r.jpg结尾的各有多少,结果是811和750,那就以b.jpg为准吧。 # 811位菇凉,还不到1001,😄 tt <- url.total urltt <- sqldf("select * from tt where V1 like '%b.jpg'") for(i in 1:100) { #想自己爬的,把路径换成自己的就ok了,我把路径用***代替。 tmp <- paste0('/Users/***/R/知乎1001位姑娘/',i,'.jpg') download.file( urltt[i,1],destfile=tmp) print(paste0('第',i,'张图片已经下载完毕')) } #点进几个答案和抓取的图对比,顺序是对的,也抓全了。 #这些图片是来源与哪些优秀的知乎问题?? get.ques <- function(pgnum){ url <- paste0('http://www.zhihu.com/collection/26348030?page=',pgnum) #url <- 'http://www.zhihu.com/collection/26348030?page=1' title <- url%>%html_session()%>%html_nodes('div.zm-item h2.zm-item-title a')%>%html_text()%>%as.data.frame(stringsAsFactors=F) return(title) } title <- data.frame() for(i in 1:5){ title <- rbind(title,get.ques(i)) }
抓取过程:
总结:😁。