溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

R語言如何實(shí)現(xiàn)知乎live二級(jí)頁面獲取

發(fā)布時(shí)間:2021-11-22 09:35:04 來源:億速云 閱讀:170 作者:柒染 欄目:大數(shù)據(jù)

R語言如何實(shí)現(xiàn)知乎live二級(jí)頁面獲取,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。

之前曾經(jīng)寫過一篇關(guān)于知乎live課程信息爬取的短文,那個(gè)直接遍歷的知乎live主頁上展示的部分課程,僅僅是很小的一部分。

今日這一篇將是該小項(xiàng)目的升級(jí)版,直接對(duì)live主頁的課程按照模塊進(jìn)行二級(jí)頁面的遍歷,這樣可以抓取更加豐富的課程信息,本次一共獲取課程數(shù)目將近800+

對(duì)于課程頁抓包分析詳情,這里不再贅述,想要了解的可以看這一篇舊文,本篇內(nèi)容僅對(duì)二級(jí)頁面的遍歷思路進(jìn)行整理。

知乎live課程數(shù)據(jù)爬取實(shí)戰(zhàn)

因?yàn)檎n程數(shù)相對(duì)較多,這里使用cookie直接登錄,需要獲取cookie值。

library("httr") 
library("jsonlite")
library("httr")
library("magrittr")
library("plyr")
library("rlist")

一級(jí)頁面遍歷,獲取各個(gè)模塊課程主題信息以及其中的課程id值。

R語言如何實(shí)現(xiàn)知乎live二級(jí)頁面獲取

按照以往的抓包流程,一級(jí)課程模塊的抓取函數(shù)如下:

mylive <- function(){
    baseurl<-"https://api.zhihu.com/lives/special_lists"
    header <- c(
         'Content-Type'='application/json; charset=utf-8',
         'User-Agent'='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36',
         'Referer'='https://www.zhihu.com/lives/specials',
         'Cookie' = "請(qǐng)copy自己瀏覽器中知乎網(wǎng)頁cookie"          )    payload<-list(
       'limit'=10,
       'offset'=0,
        'subtype'='special_list'        )    i = 0    myresult <- data.frame()
   while (TRUE){
       ###每次請(qǐng)求offset值偏移10個(gè)單位        payload['offset'] = payload[['offset']] %>% `+`(10*i)
       tryCatch({        r <- GET(baseurl,add_headers(.headers =header),query =payload, encode="json")        myresult <-r %>% content(as="text") %>% fromJSON(flatten = TRUE) %>% `[[`(3) %>% rbind(myresult,.)        cat(sprintf("正在處理第【%d】頁!",i),sep = "\n")        },error = function(e){        cat(sprintf("第【%d】頁抓取失敗!",i),sep = "\n")        })
       ###通過抓包返回值中的狀態(tài)信息確定是否應(yīng)該跳出循環(huán)        if ( r %>% content(as="text") %>% fromJSON(flatten = TRUE) %>% `[[`(2) %>% `[[`(1) == TRUE) break            Sys.sleep(runif(1,0.5,1.5))        i = i +1    }    cat("all page is OK!!!",sep = "\n")
   return (myresult)     }

執(zhí)行代碼

system.time( myresult <- mylive() )

R語言如何實(shí)現(xiàn)知乎live二級(jí)頁面獲取

以上我抓到了一級(jí)課程模塊的信息,其中就含有所有課程的id值,我們獲取到id值之后,使用id值來遍歷每一個(gè)課程模塊(id值)下的子課程信息。

過程與上述一級(jí)頁面的遍歷過程基本一致。

R語言如何實(shí)現(xiàn)知乎live二級(jí)頁面獲取

定義一個(gè)子頁面遍歷函數(shù),每輸入一個(gè)id值,該函數(shù)即可通過內(nèi)置的邏輯函數(shù)自動(dòng)判斷該模塊下是否遍歷到盡頭,如果子頁面遍歷完了,則跳出循環(huán),并返回所有課程數(shù)據(jù),否則繼續(xù)。

outdata <- function(id){
    baseurl<-sprintf("https://api.zhihu.com/lives/special_lists/%s/lives",id)
    header <- c(
         'Content-Type'='application/json; charset=utf-8',
         'User-Agent'='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36',
         'Referer'=sprintf('https://www.zhihu.com/lives/specials/%s',id),
         'Cookie' = Cookie          )    payload<-list(
       'limit'=10,
       'offset'=0,
       'subtype'='special_list'        )    myresult <- data.frame()    i = 0    while (TRUE){        payload['offset'] = payload[['offset']] %>% `+`(10*i)
       tryCatch({        r <- GET(baseurl,add_headers(.headers =header),query =payload, encode="json")        myresult <-r %>% content(as="text") %>% fromJSON(flatten = TRUE) %>% `[[`(3) %>% rbind(myresult,.)        })
       if ( r %>% content(as="text") %>% fromJSON(flatten = TRUE) %>% `[[`(2) %>% `[[`(1) == TRUE) break            Sys.sleep(runif(1,0.5,1.5))        i = i +1    }
     return (myresult)     }

 

使用一個(gè)循環(huán)來執(zhí)行以上子頁面遍歷函數(shù)。

fulloutdata <- function(){
    mydatafull <- data.frame()
    i = 1
    for (id in ids){
       tryCatch({        mydatafull <- outdata(id) %>% rbind(mydatafull,.)        cat(sprintf("正在處理任務(wù)【%s】",id),sep = "\n")        Sys.sleep(runif(1,0.5,1.5))          },error = function(e){        cat(sprintf("任務(wù)【%s】處理失敗!",i),sep = "\n")        i = i +1        })    }    cat("have done!",sep = "\n")    cat(sprintf("一共有【i】個(gè)任務(wù)處理失?。?quot;,i),sep = "\n")
   return(mydatafull) }

執(zhí)行二級(jí)頁面遍歷函數(shù)

system.time(mydatalast <- fulloutdata())

R語言如何實(shí)現(xiàn)知乎live二級(jí)頁面獲取

R語言如何實(shí)現(xiàn)知乎live二級(jí)頁面獲取

將最終返回?cái)?shù)據(jù)存入mongodb

library("rmongodb")
mongo <- mongo.create(host = "localhost")
bson <- mongo.bson.from.list(mydatalast)
mongo.insert(mongo,"rmongo_test.",mydatalast)
list.save(mydatalast,"D:/R/File/liveinfo.json")

關(guān)于R語言如何實(shí)現(xiàn)知乎live二級(jí)頁面獲取問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI