(Ps:這個思路有問題,實際上并不是這么搞得代碼,后續(xù)補上)
說到爬蟲,其實寫起來很簡單,爬蟲無非就是將自己想要的內(nèi)容在頁面上抽離出來,并且存儲。這個過程在今天已經(jīng)變得非常輕松,在Java下有Jsoup,Python下有BS4,還有通吃的正則等等,然而真正難的卻是在于偽造請求,截獲分析請求參數(shù),獲取正確的頁面.
首先來說,一個能混得過去的爬蟲,應(yīng)該有一個優(yōu)秀的流程,在明確自己的目標(biāo)后,應(yīng)該立馬去設(shè)計爬蟲工作流程,而不是去無腦的Coding。
那么今天咱們就先研究下咱們這個爬蟲的目標(biāo)和流程。
首先咱們是要獲取知乎頁面上的個人信息,關(guān)注和被關(guān)注信息,首先咱們會遇到第一個問題就是登陸,咱們這里暫且不講,
其次咱們就是要給定一個初始化url,然后進行followers的和followees的獲取,然后循環(huán)爬起來,那么其中一定會遇到數(shù)據(jù)重復(fù)和人物關(guān)系建立的問題。
1.過濾重復(fù)數(shù)據(jù)
這個相對而言比較簡單,有幾種常規(guī)方法:
1. 數(shù)據(jù)庫設(shè)置主鍵,鎖定人物ID 2. 存入數(shù)據(jù)時查詢數(shù)據(jù)庫數(shù)據(jù) 3. 使用緩存隊列,在緩存中查找數(shù)據(jù)判斷
首先來說第一種,數(shù)據(jù)庫設(shè)置主鍵,鎖定人物ID,這個方法可以使數(shù)據(jù)永遠(yuǎn)不重復(fù),但是也會造成批量插入的時候造成出錯
第二種方法,存入數(shù)據(jù)時查詢數(shù)據(jù)庫數(shù)據(jù),可行,但是多次訪問數(shù)據(jù)庫,造成效率低下
第三種方法,使用緩存隊列,在緩存中查找數(shù)據(jù)判斷,這種方法很好,而且速度相對較快,但是緩存太多容易出現(xiàn)OOM問題
在這里咱們不選擇某一種方案,而是采用主鍵+優(yōu)先緩存+數(shù)據(jù)庫查詢方式,后期自己實現(xiàn)一個LRU緩存隊列,提供命中率
2. 爬取時創(chuàng)建人物關(guān)系
這個問題思考了很久,也比較惡心,在人物不確定的情況下進行人物的獲取和關(guān)系的創(chuàng)建,怎么處理好呢。我的想法是讓每一個人員信息攜帶一個上級信息,來判斷是否能夠構(gòu)建人物關(guān)系,有點類似于尾遞歸的思想。
3. 繪制流程圖
那么對于咱們的一個整體流程目前就有了(挑戰(zhàn)一下,還是放棄了、哈哈):
獲取URL-->解析頁面<-------- | | | &nbs