點擊我前往Github查看源代碼 別忘記star
本項目github地址:https://github.com/wangqifan/ZhiHu
一.如何獲取到用戶的信息
前往用戶主頁,以輪子哥為例
從中可以看到用戶的詳細信息,教育經歷主頁,主修。所在行業,公司,關注量,回答數,居住地等等。打開開發者工具欄查看網絡,即可找到,一般是html或者json這個數據在Html頁面里。
URL為https://www.zhihu.com/people/excited-vczh/answers,excited-vczh是輪子哥的id,我們只要拿到某個人的Id就可以獲取詳細信息了。
二.信息藏在哪
對這個json數據進行解析,即可找到用戶信息
根據URL下載Html頁面,解析json就可以獲取用戶信息了
三.如何獲取更多的用戶Id
每個人都有自己的關注列表,關注的人和被關注的人,抓取這些人再到這些人主頁去抓關注列表,這樣就不抽找不到用戶了
這里還有nexturl,這個鏈接可以保存下來。如果isend為true的化就是列表翻到頭了,url就不必保存下來
二.爬蟲工作流程
有兩個爬蟲模塊,一個爬蟲負責重nexturl隊列中得到url,下載json並解析,得到的nexturl插入哈希表,如果插入成功,加入隊列
另外一個負責中urltoken隊列獲取urltoken,下載解析頁面,將用戶信息存入數據庫,將nexturl存入nexturl隊列
三.常見問題解決思路
重復爬取問題
解析得到的Urltoken肯定有大量的重復,高高興興獲取很多數據,卻發現都是重復的,那可不行。解決辦法是對於已經加入隊列的urltoken,都放到一張hash表進行標記
斷點續爬
爬取百萬用戶是個比較大的工作量,不能保證一次性爬取完畢,對於中間數據還是要進行持久化,這里選用的是Redis數據庫,對於爬取任務加入隊列,如果程序中途停止,再次開啟只需要重新在隊列中獲取任務繼續爬起
反爬蟲問題
抓取過於頻繁,服務器返回429.這個時候需要切換代理IP了,我有過自建代理IP池(https://github.com/wangqifan/ProxyPool),也有買過服務商提供的代理服務
例如阿布雲:https://www.abuyun.com/
多台機器共同爬取
任務比較大,借助實驗室的電腦,一共有10台電腦,5台電腦裝了Redis,3台做hash表,2台作隊列,具有良好的伸縮性