爲了督促本身更加積極地寫博客,我但願有一個排名系統能讓我看到本身的進步。可是博客園對用戶的排名體系相對是比較少的,主要是推薦博客排行和積分排行;但它們人數少難度大,短時間內難以進入排名。所以我決定自力更生,爬取一份博客園粉絲數排行榜。html
爲避免誤(封)會(號),先作以下聲明:git
一、本排行榜非官方發佈,是我經過爬蟲獲得的。github
二、爬蟲過程一直堅持網站友好原則:服務器
(1)只查詢網站公開內容(固然,非公開的我也不會)cookie
(2)爲避免對服務器形成壓力,一直使用單線程發送請求,且每兩個請求之間都設置了必定時間間隔網站
首先介紹一下爬蟲的思路,不感興趣的朋友能夠直接拉到文章最後看結果,或者點擊這裏查看:博客園粉絲數排行榜(粉絲數很多於100)spa
思路基本分兩步:一、初始化種子用戶;二、迭代。線程
這一步的目標,是找到儘量多的種子用戶,種子用戶最好發過文章,尤爲是高質量文章,這樣他們有較大機率有較多的粉絲。htm
下面是我選取的種子用戶來源,在博客園的對應位置在下圖標出:blog
獲得種子用戶的用戶名後,即可以在其我的頁面獲取暱稱、粉絲數、園齡、文章首頁等基本信息。例如,榜首(暱稱:孤傲蒼狼)的用戶名是xdp-gacl,則他的我的頁面是:https://home.cnblogs.com/u/xdp-gacl/
迭代的目的是從種子用戶出發,找到其餘粉絲數較多的用戶;方法是獲取種子用戶「關注的人」——由於被關注的人有較大機率有更多的粉絲。用戶關注的人在這裏(仍是以榜首孤傲蒼狼爲例):https://home.cnblogs.com/u/xdp-gacl/followees/
所以一輪迭代的步驟是這樣的:
(1)遍歷當前用戶列表,獲得他們關注的用戶;
(2)將這些關注的用戶加入到當前用戶列表。
如此循環往復,進行多輪迭代;直到再也不有新的用戶爲止。
有義務說明一下本排行榜的不足之處:
(1)爬取時間主要在5.10-5.19,排行榜不會反映在此期間及以後發生的變化(如用戶粉絲數上漲)。
(2)經過這種方式,確定沒法爬取全部用戶信息,可是粉絲數較多的用戶被爬到的機率要大得多;所以爲了儘量保證準確性,排行榜只列出了粉絲數很多於100的用戶。
(3)排行究竟漏掉了多少用戶,還是一個未知數,若是你認爲有什麼方法上的漏洞,或者有漏掉的用戶,歡迎討論。
本次爬蟲使用的技術比較常規:語言使用Python3,發送請求使用requests庫,HTML解析使用BeautifulSoup,數據存儲使用Redis;此外,爬蟲過程當中還會遇到動態加載頁面、使用cookie進行身份校驗等,都比較常見,再也不贅述。
數據存儲之因此選擇Redis,主要是考慮到數據在內存中,訪問快,且Redis提供了豐富的數據類型(若有序集合),使用起來比較方便;爲了保證數據不丟失,必定要保證Redis開啓了持久化,最好開啓AOF持久化。
排行榜(粉絲數不小於100)能夠點擊連接查看:博客園粉絲數排行榜
前25名截圖以下:
其中:
一、榜首是孤傲蒼狼,有1.8w+粉絲,遙遙領先;在我爬蟲這幾天,漲了幾十名粉絲,實在厲害。
二、粉絲數10000以上的,共有5位;粉絲數1000以上的,有286位;粉絲數100以上的,有3068位。
三、官方帳號博客園團隊有4644位粉絲,排第26位。
四、若是你的目標是進入前100名,至少須要2200+位粉絲;若是你的目標是進入前1000名,至少須要300+位粉絲。