爬蟲圖解——輪子哥關注了哪些妹紙

原文鏈接:http://www.iamwr.com/2018/04/09/vczh-followers-analysis/

一、前言

本文以知乎大V輪子哥關注的用戶列表作為爬蟲對象,爬取每個用戶的url_token、暱稱、性別、該用戶關注其他用戶的數量、回答數、文章數、一句話介紹和頭像的鏈接。並將這些數據持久化存儲在數據庫中,將用戶頭像下載到本地。最後簡單使用 Python 中的 matplotlib 庫將爬取的部分信息可視化。

爬蟲圖解——輪子哥關注了哪些妹紙

二、爬蟲思路

打開輪子哥知乎上關注的用戶列表 ,調出Chrome的開發者工具(Developer Tools),重新刷新頁面,選擇『XHR』,第一個就是我們需要的請求信息:

爬蟲圖解——輪子哥關注了哪些妹紙

我們觀察 請求頭 Headers,得知實際該頁面的數據請求URL為:

爬蟲圖解——輪子哥關注了哪些妹紙

分析這個URL的字段,其中excited-vczh為輪子哥的url_token,是知乎識別唯一用戶的字段,followees代表是輪子哥的關注列表,如果是followers,代表輪子哥的粉絲列表,不難發現URL中間部分包含data、answer_count、articles_count、gender、follower_count等字段信息,而這些信息正是我們想要的。再看最後的兩個字段是offset,代表用戶列表頁起始數量,limit代表每頁返回用戶信息的數量。

點擊『Preview』,可以看到格式化後響應的Json數據,源數據可以在『Response』查看。

查看 Json 數據結構:

爬蟲圖解——輪子哥關注了哪些妹紙

根據字段見名知意,其中 avatar_url 就是用戶頭像鏈接,avatar_url_template 是頭像的路由模板,在該鏈接中有個 {size} 參數,當我們點擊查看網頁源碼發現,size 為 xll 表示頭像大圖,所以在程序中,我們每爬到這個鏈接都需要把 {size} 參數替換成 xll,這樣就可以爬取用戶較為清楚的頭像,這個 Json 中還有個 badge 字段,表示該用戶所獲得的徽章,也就是在知乎的成就,比如各個領域的高質量答主,但不是本次爬蟲所關心的。每一次請求,都是20條用戶數據:

爬蟲圖解——輪子哥關注了哪些妹紙

那麼問題來了,這時我們確實能夠爬蟲這20個被輪子哥關注的用戶的一些數據,但是輪子哥關注的用戶肯定不止20個,那麼其他用戶的數據該怎麼爬?繼續觀察 Json 數據:

爬蟲圖解——輪子哥關注了哪些妹紙

有個『paging』字段,該字段下封裝了『is_end』『totals』『previous』『is_start』『next』五個參數,分別代表:

  • 是否是輪子哥關注用戶列表的最後一頁URL
  • 輪子哥一共關注了多少人
  • 當前關注用戶列表頁的前一頁的URL
  • 是否是輪子哥關注用戶列表的第一頁URL
  • 當前關注用戶列表頁的下一頁的URL

我們找到輪子哥關注列表的第一頁開始爬蟲,只需要每頁爬蟲20個用戶數據,就獲得『next』的值,即下一頁URL,可以繼續爬蟲,直至所有輪子哥關注的用戶全部爬取完成。

三、實現方法

在網頁瀏覽時,我們可以不用登錄知乎帳號就可以查看知乎某個用戶關注了哪些人,當我們在沒有登錄知乎的時候,把上述真正的用戶列表URL在地址欄訪問時,其實是查看不了的:

爬蟲圖解——輪子哥關注了哪些妹紙

爬蟲圖解——輪子哥關注了哪些妹紙

說明登錄進知乎,我們得到我們想要的數據,這些數據和之前在 Chrome 開發者模式『Preview』 中的格式化的數據是一模一樣的。

這是非常小規模的爬蟲,純粹使用 urllib 庫足以完成需求,對於模擬登錄,可以查找登錄的實際請求 URL ,根據規則用鍵值對的形式封裝帳號、密碼形成 post 請求的數據。另一種是直接是在瀏覽器中登錄後,把整個 cookie 放進程序的請求頭中,當然,為了更加逼真體現我們是合法的請求,把『user-agent』『accept』『accept-language』等信息也放進請求中。在爬蟲的同時,也將輪子哥關注的用戶的信息進行 Mysql 數據庫本地持久化,以便後續的數據可視化,同時也將輪子哥關注的用戶的頭像存在本地。

四、代碼實現

爬蟲圖解——輪子哥關注了哪些妹紙

注意:

  • 代碼中的 Mysql 的連接需要換成你自己的數據庫、表、用戶名和密碼
  • cookie 使用你登錄知乎的cookie
  • 頭像本地存儲需要對’/Users/rundouble/Desktop/excited-vczh_followers/‘ + name + ‘.jpg’修改成你的路徑
  • 對URL中的 url_token 可以換成其他用戶的url_token 也可以正常使用
  • 代碼中一共兩個方法,一個是 followers(url) 進行數據的爬蟲,另一個是 visualize()
  • 對爬取到數據進行簡單的可視化

五、結果

  • 數據持久化
爬蟲圖解——輪子哥關注了哪些妹紙

  • 頭像爬取
爬蟲圖解——輪子哥關注了哪些妹紙

  • 數據可視化
爬蟲圖解——輪子哥關注了哪些妹紙

  • 輪子哥帶逛聞名遐邇,今日一見,名不虛傳。輪子哥關注的用戶中接近三分之二是女性用戶,接近三分之一是男性用戶。
爬蟲圖解——輪子哥關注了哪些妹紙

  • 被輪子哥關注的用戶中,這些用戶的粉絲數量分佈還是很均勻的,他們的粉絲數在 0-1k 範圍內,佔到輪子哥關注的用戶的一半比例,輪子哥關注的大於十萬粉的用戶也有72位,其中輪子哥關注的用戶中粉絲數最多是張佳瑋老師,接近160w粉。
爬蟲圖解——輪子哥關注了哪些妹紙

  • 輪子哥關注的用戶的回答數分佈如上圖,其中最高的三個柱子是回答了:1~5、51~100、11~20,其中1~5個回答數人數最多,有410個用戶。其中,回答數11~50和回答數大於51的人數是差不多的, 這個是很有意思的情況。
爬蟲圖解——輪子哥關注了哪些妹紙

  • 在輪子哥關注的用戶中,有82.49%的用戶個人信息中含有『一句話介紹』,17.51%的用戶是沒有『一句話介紹』。
爬蟲圖解——輪子哥關注了哪些妹紙

輪子哥關注的用戶中,有接近80%的人是有文章輸出的,而這個比例,接近之前含有『一句話介紹』的用戶數量。

六、參考

https://www.zhihu.com/people/excited-vczh/following

https://github.com/yrzx404/interview-question-code/blob/master/spider/vczh-spider.py


分享到:


相關文章: