R語言爬蟲實戰:知乎live課程資料爬取實戰,爬蟲live

來源:互聯網
上載者:User

R語言爬蟲實戰:知乎live課程資料爬取實戰,爬蟲live

杜雨,EasyCharts團隊成員,R語言中文社區專欄作者,興趣方向為:Excel商務圖表,R語言資料視覺效果,地理資訊資料視覺效果。個人公眾號:資料小魔方(ID:datamofang) ,“資料小魔方”創始人。


本文是一篇R語言爬蟲實戰練習篇,同樣使用httr包來完成,結合cookies登入、表單提交、json資料包來完成整個資料爬取過程,無需書寫複雜的xpath、css路徑甚至繁瑣的Regex(儘管這三個技能對於資料爬取而言意義非凡)。

之前已經演練過如何使用httr來完成網易雲課堂的課程爬取,其中用到POST方法和表單提交。

今天爬取對象是知乎live課程資訊,用到的GET方法,結合cookies登入和參數提交來完成,這一篇會給大家稍微涉獵一些細節技巧。

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

第一步:仍然是確定對象網頁所用到的技術架構:

看到頁面初始化的時候大概只有10條課程資訊的展示量,然後繼續往下滑動滑鼠會自動重新整理,妥了,這個典型的非同步載入網頁。

使用Chrome瀏覽器F12鍵開啟後台,你可以在all菜單裡面找到一個homefeed?limit=10&offset=10&includes=live的非同步載入連結(XHR),通常情況下非同步載入連結都是在XHR菜單裡面的,但是也有例外,這時候你需要在all菜單裡面尋找(可能有很多其他媒體類型請求,需要你耐心尋找,如果找不到就狂按F5重新整理,看哪個請求是新蹦出來的)。

這個連結一看就很像課程連結的樣子,limit是限制網頁記錄展示數量的參數(剛好10條),offset是位移量參數(剛好預設也是10,就是說滑鼠往下滑動之後會重新整理出來10條新課程記錄,也就是offset位移量會以10的整數倍增加,每下拉一次,非同步載入請求會增加10條記錄資訊),includes是模組性質,這裡是live。

到底是不是這樣呢, 讓我們點進去這個xhr請求,到右下側的網頁預覽裡面詳細一看便知,果不其然,剛好是我們要的資訊,全部都是以json資料包的形式封存在網址為https://api.zhihu.com/lives/homefeed?limit=10&offset=10&includes=live的網頁裡面。

然後我們接下來需要做的工作就是詳細分析其請求方式、前序參數設定、cookies設定、需要提交的參數等資訊。

第二步:構造前序資訊、參數表資訊、cookies資訊

開發人員工具定位到右側下的Headers菜單下:你會看到以下四個模組的資訊:

General:Request URL:https://api.zhihu.com/lives/homefeed?limit=10&offset=10&includes=liveRequest Method:GETStatus Code:200 OKRemote Address:47.95.51.100:443Referrer Policy:no-referrer-when-downgrade
Response Headers:Access-Control-Allow-Credentials:trueAccess-Control-Allow-Headers:Authorization,Content-Type,X-API-VersionAccess-Control-Allow-Methods:GET,PATCH,PUT,POST,DELETE,OPTIONSAccess-Control-Allow-Origin:https://www.zhihu.comConnection:keep-aliveContent-Encoding:gzipContent-Type:application/json; charset=utf-8Date:Wed, 11 Oct 2017 13:24:38 GMTEtag:W/"0b0bb047bb0eaf6962481a517b4276e48a774d54"Server:ZWSTransfer-Encoding:chunkedVary:Accept-EncodingX-Backend-Server:zhihu-live.liveweb.761d7228---10.4.165.2:31030[10.4.165.2:31030]X-Req-ID:10B3371859DE1B96X-Req-SSL:proto=TLSv1.2,sni=,cipher=ECDHE-RSA-AES256-GCM-SHA384X-Tracing-Servicename:livewebX-Tracing-Spanname:LiveHomeFeedHandler_get
Request Headers:accept:application/json, text/plain, */*Accept-Encoding:gzip, deflate, brAccept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4Authorization:oauth 8274ffb553d511e6a7fdacbc328e205dConnection:keep-aliveCookie:_zap="請鍵入個人知乎cookies"Host:api.zhihu.comIf-None-Match:W/"ba0517e8bddf8a410ffcda75a507295dc4024786"Origin:https://www.zhihu.comReferer:https://www.zhihu.com/lives/User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36X-Api-Version:3.0.63
Query String Parameters:limit:10offset:10includes:live


備忘:(請求參數裡我匿了我的登入cookies哈哈,畢竟如今知乎有六七千關注量,雖然不算大號,但是對我挺重要的,不能隨便登入資訊泄露噠~)

OK,完美,那麼確定本次使用到的瀏覽器請求方式是GET請求,網址對象是

https://api.zhihu.com/lives/homefeed?limit=10&offset=10&includes=live

注意體會其與你瀏覽器中的原始網址有何異同,在瀏覽器中直接開啟live欄目,你的網址欄裡面顯示的是如下網址:https://www.zhihu.com/lives,想要不斷展示所有的課程記錄是需要你使用滑鼠滾輪不斷的向下滾動的。

但是他在後台所發起的非同步載入請求調用的網址實際上是通過參數提交之後的如下網址,這個網址因為是get請求,在網頁瀏覽器也是可以直接開啟的,不過因為是json頁面,開啟之後是沒有任何渲染的純文字檔案。網址如下

https://api.zhihu.com/lives/homefeed?limit=10&offset=10&includes=live
#構造cookies:
Cookie='請鍵入個人知乎cookies'
#構造瀏覽器前序資訊:(這些資訊均來自於request模組)
headers <- c(
         'Accept'='application/json',
         '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/',          
         'Connection'='keep-alive',          
         'Cookie'=Cookie          )

以上前序資訊中,Accept告知知乎伺服器我想要擷取什麼格式的檔案資訊;Content-Type是伺服器返回的資訊編碼格式;User-Agent是本地瀏覽器的規格資訊(很重要);Cookie是登入資訊。

前序資訊參數在不同的網頁中可能會差異很大,很多時候需要我們自己嘗試那些是有用的那些是無用的, 但是常用的幾個需要重點關注。

#構造表單提交參數:
payload<-list(
       'limit'=10,
       'offset'=10,
       'includes'='live'
         )

GET方法的參數本來是可以寫在url裡面的,但是對於需要多頁遍曆的網頁,如果單獨將參數寫在參數表裡面將會在構造迴圈或者遍曆網頁時更加方便。參數表只能接受list格式提交,本案例只涉及三個參數,且都是必要參數。查詢參數在httr的GET方法裡面對應query參數(還記得POST方法裡面定位網頁的時,用到的表單體是對應什麼參數嗎)。

第三步:單步嘗試查看輸出內容結構:

baseurl<-"https://api.zhihu.com/lives/homefeed"
r <- GET(baseurl,add_headers(.headers =headers),query =payload, encode="json",verbose())myresult<-r %>% content()

完美,網頁響應沒有任何問題,接下來查看輸出內容結構:

myresult<-r %>% content() %>% `[[`(2)


我們需要的課程資訊位於輸出內容的第二個list內,因而使用以上語句便可提取所有的課程資訊內容,剛好10條。

對於本篇案例遇到最大的困難是,我們無法判斷一共有多少條課程記錄,後台所有參數中均沒有給出,所以……我有個大膽的想法。

既然Query String Parameters:模組給出的是預設的單次記錄展示資料量以及課程記錄位移量,那麼我是否可以人為設定一個limit和offset呢,比如我設定limit為100,offset為0,100,200這樣,或許多試幾次基本就可以確定了。

當我設定limit=200,offset=150時,已經沒有課程資訊了,也就是說150之後已經沒有資料了,那麼課程條目數量應該在150以內,網頁返回資訊如下:

https://api.zhihu.com/lives/homefeed?limit=200&offset=150&includes=live{"paging": {"is_end": true, "next": "https://api.zhihu.com/lives/homefeed?limit=200&offset=350", "previous": ""}, "data": [], "attached_info": "MiBlODVkMzE1NDYyNGQ0MDY5YTA4OTVhM2FhMGIxZWVhNw=="}

當我設定limit=200,offset=100時,內容顯示是正常的,也就是說課程總數目應該在100~150之間,於是就想,如果limit設為500,offset為0,讓請求單次返回記錄數顯示為500,不產生任何位移量,這樣豈不是所有內容都會在同一頁上。

從下拉進度條看起來,似乎是可行的,然後你可以ctrl+S將網頁儲存為json格式,之後我們可以進行驗證。

以下過程我們直接在構造payload參數時,將limit和offset分別設定為200,0,這樣正常情況下我們請求一次即可拿到所有課程資料啦:

payload<-list('limit'=200,'offset'=0,'includes'='live')
baseurl<-"https://api.zhihu.com/lives/homefeed"
r <- GET(baseurl,add_headers(.headers =headers),query =payload, encode="json",verbose())myresult<-r %>% content() %>% `[[`(2) length(myresult)[1] 144

OK,長度剛好為144,處於我們之前估測的100~150之間。

接下來我們使用jsonlite包的fromJSON匯入剛才儲存的json檔案,驗證下手動儲存的json檔案資料量與剛才代碼請求的網頁資料是否保持一致。

homefeed<-fromJSON("C:/Users/RAINDU/Desktop/homefeed.json",simplifyVector=FALSE)length(homefeed$data)length(homefeed$data)[1] 144

看來我的猜測是對的,這個limit確實只是一個預設的要求節流參數,並非不可更改,這裡我們更改的limit之後,直接避免了手動書寫並提交表單參數的過程,何樂而不為呢。

接下來將以上json檔案儲存,至於內容的分析與可視化嘛,當然下期繼續分享啦哈哈~

你可以直接在瀏覽器中將網頁儲存為json,也可以將剛才輸出的內容單獨儲存為本地json檔案,使用rlist包的list.save函數。

list.save(homefeed,"C:/Users/RAINDU/Desktop/zhihulive.json")

如果你已經等不及的話,想要自己做這份資料分析與可視化,可以按照以上步驟抓取並提取內容,我也會把這份未清洗的資料上傳到GitHub,可以自行下載。

線上課程請點擊文末原文連結:
往期案例資料請移步本人GitHub:
https://github.com/ljtyduyu/DataWarehouse/tree/master/File


相關課程推薦


R語言爬蟲實戰案例分享: 網易雲課堂 知乎live、今日頭條、B站視頻


分享內容:本次課程所有內容及案例均來自於本人平時學習練習過程中的心得和筆記總結,希望藉此機會,將自己的爬蟲學習曆程與大家分享,並為R語言的爬蟲生態改善以及工具的推廣,貢獻一份微薄之力,也是自己爬蟲學習的階段性總結。

☟☟☟ 戳閱讀原文,即刻加入課程。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.