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

  

抓取过程:

总结:😁。

 

posted @ 2015-10-04 15:59  龙君蛋君  阅读(3502)  评论(5编辑  收藏  举报