其實這篇博文是一個基於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)) }
抓取過程:
總結:😁。