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

  

抓取過程:

總結:😁。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM