您好,登錄后才能下訂單哦!
R語言如何實現知乎live二級頁面獲取,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
之前曾經寫過一篇關于知乎live課程信息爬取的短文,那個直接遍歷的知乎live主頁上展示的部分課程,僅僅是很小的一部分。
今日這一篇將是該小項目的升級版,直接對live主頁的課程按照模塊進行二級頁面的遍歷,這樣可以抓取更加豐富的課程信息,本次一共獲取課程數目將近800+
對于課程頁抓包分析詳情,這里不再贅述,想要了解的可以看這一篇舊文,本篇內容僅對二級頁面的遍歷思路進行整理。
知乎live課程數據爬取實戰
因為課程數相對較多,這里使用cookie直接登錄,需要獲取cookie值。
library("httr")
library("jsonlite")
library("httr")
library("magrittr")
library("plyr")
library("rlist")
一級頁面遍歷,獲取各個模塊課程主題信息以及其中的課程id值。
按照以往的抓包流程,一級課程模塊的抓取函數如下:
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' = "請copy自己瀏覽器中知乎網頁cookie"
)
payload<-list(
'limit'=10,
'offset'=0,
'subtype'='special_list'
)
i = 0
myresult <- data.frame()
while (TRUE){
###每次請求offset值偏移10個單位
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")
})
###通過抓包返回值中的狀態信息確定是否應該跳出循環
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)
}
system.time( myresult <- mylive() )
以上我抓到了一級課程模塊的信息,其中就含有所有課程的id值,我們獲取到id值之后,使用id值來遍歷每一個課程模塊(id值)下的子課程信息。
過程與上述一級頁面的遍歷過程基本一致。
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)
}
fulloutdata <- function(){
mydatafull <- data.frame()
i = 1
for (id in ids){
tryCatch({
mydatafull <- outdata(id) %>% rbind(mydatafull,.)
cat(sprintf("正在處理任務【%s】",id),sep = "\n")
Sys.sleep(runif(1,0.5,1.5))
},error = function(e){
cat(sprintf("任務【%s】處理失敗!",i),sep = "\n")
i = i +1
})
}
cat("have done!",sep = "\n")
cat(sprintf("一共有【i】個任務處理失敗!",i),sep = "\n")
return(mydatafull)
}
執行二級頁面遍歷函數
system.time(mydatalast <- fulloutdata())
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")
關于R語言如何實現知乎live二級頁面獲取問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。