在以前的文章中,我寫過一篇使用selenium來模擬登錄知乎的文章,然后在很長一段時間里都沒有然后了。。。
不過在最近,我突然覺得,既然已經模擬登錄到了知乎了,為什么不繼續玩玩呢?所以就創了一個項目,用來采集知乎的用戶公開信息,打算用這些數據試着分析一下月入上萬遍地走、清華北大不如狗的貴乎用戶像不像我們想象中的那么高質量。
第一步:首先是爬蟲抓取用戶信息,能用圖解釋的絕不多廢話:
但是還是得主要說下:
首先:個人感覺,在寫一些小的demo時用框架就反而更顯得繁瑣,所以我沒有使用框架,而是自己使用requests來發起請求的。
然后簡要解釋一下整體流程:
(1)zhihu_login.py 是我模擬登錄的腳本,並且在前三步中,理想狀態下是利用schedule寫一個定時執行框架,定期的更換session.txt中的cookie以供后邊的抓取腳本使用,然而非常無奈,
這個方法是我在最后數據抓取基本結束時才想到的,所以沒有用到,所以我在抓取數據時使用了代理IP.的。
(2)畫圖時將錯誤的將第4步寫成了第5步。。。MasterFollowing.py是用來獲取用戶唯一標示:Token的,原理是:以一個用戶的url作為起始地址發起請求,遍歷該用戶的關注列表,將關注列表中的所有用戶Token都存入redis中,
下一次請求時,將會從redis中隨機取出一個Token拼接成目標url再遍歷關注列表將Token存入redis中,因為理論上從redis中取出一個Token就會向里邊塞入少則幾十多達上百個Token(視該用戶關注人數而定),所以理論上redis中的Token值會越來越多,
且我是以set類型來存Token的,所以會自動去重,非常方便。
(3)activities.py是用來抓取最終用戶信息的,它每次redis中獲取一個Token,拼接成目標Url,請求用戶詳情頁面,采集到用戶信息,將其存入到數據庫中。
(4)因為兩個腳本之間使用redis進行數據共享,即使有哪個蜘蛛宕掉,也不會造成數據丟失,達到了斷點續傳的效果。
(5)整個過程中,唯一扯淡的是,知乎似乎對並發數做出了限制,當並發請求超過某一閥值時,請求就會被重定向到驗證頁面,即使使用了代理IP也沒用。不過我想,如果用我最終想到的方法每隔一段時間模擬請求,更換cookie的話,
這個問題有可能會得到解決。
整個爬蟲項目我在個人github上邊扔着,大家可以去拉下來玩玩,感興趣的可以幫我把代碼完善下,把那個定時更新cookie的代碼加上,或者各位有什么更好的方法,也可以告訴我。
github地址:https://github.com/songsa1/zhihu_user_relationship
第二步:使用抓取下的數據進行簡單分析
大概抓了20w左右的數據,並且數據分析的代碼也在上邊那個項目中丟着,制作圖表使用了matplotlib.
首先我們知道,知乎個人信息中,所屬行業一共分為了14大類、98小類:
我們先看看按照小類來分的話,知乎用戶群體主要是做什么的呢?
不出所料啊,互聯網行業果然是最多的,當然,也有存在誤差的可能,我是以我的知乎用戶作為起點來抓取的,我關注的人中基本都是互聯網圈中的,這樣傳遞下去,采集到的數據中IT圈中的人估計會多一些,不過窺一斑而知全豹,真實情況估計也差不太多。
這次按照14大類來瞅一下:
依舊是高新科技位居第一啊,教育行業和服務行業緊隨其后。
然后我們再來看看知乎用戶群體的性別比例:
果然男性用戶占據了一半還多,女性用戶只占了34%,當然還有14%沒有填性別的外星人。
我們一直說逼乎貴乎,一聽起來就很有檔次的感覺,不負眾望,知乎用戶群體的文化程度還是非常高的,果然清華北大遍地走,985、211不如狗啊,有圖為證(詞雲中字體越大表明權重越大):
最后我們來看看知乎用戶群體大概居住地,目測北上廣等一線新一線比較多:
想了解更多Python關於爬蟲、數據分析的內容,歡迎大家關注我的微信公眾號:悟道Python