(Ps:這個(gè)思路有問(wèn)題,實(shí)際上并不是這么搞得代碼,后續(xù)補(bǔ)上)
說(shuō)到爬蟲,其實(shí)寫起來(lái)很簡(jiǎn)單,爬蟲無(wú)非就是將自己想要的內(nèi)容在頁(yè)面上抽離出來(lái),并且存儲(chǔ)。這個(gè)過(guò)程在今天已經(jīng)變得非常輕松,在Java下有Jsoup,Python下有BS4,還有通吃的正則等等,然而真正難的卻是在于偽造請(qǐng)求,截獲分析請(qǐng)求參數(shù),獲取正確的頁(yè)面.
首先來(lái)說(shuō),一個(gè)能混得過(guò)去的爬蟲,應(yīng)該有一個(gè)優(yōu)秀的流程,在明確自己的目標(biāo)后,應(yīng)該立馬去設(shè)計(jì)爬蟲工作流程,而不是去無(wú)腦的Coding。

那么今天咱們就先研究下咱們這個(gè)爬蟲的目標(biāo)和流程。
首先咱們是要獲取知乎頁(yè)面上的個(gè)人信息,關(guān)注和被關(guān)注信息,首先咱們會(huì)遇到第一個(gè)問(wèn)題就是登陸,咱們這里暫且不講,
其次咱們就是要給定一個(gè)初始化url,然后進(jìn)行followers的和followees的獲取,然后循環(huán)爬起來(lái),那么其中一定會(huì)遇到數(shù)據(jù)重復(fù)和人物關(guān)系建立的問(wèn)題。

1.過(guò)濾重復(fù)數(shù)據(jù)

這個(gè)相對(duì)而言比較簡(jiǎn)單,有幾種常規(guī)方法:

1. 數(shù)據(jù)庫(kù)設(shè)置主鍵,鎖定人物ID
2. 存入數(shù)據(jù)時(shí)查詢數(shù)據(jù)庫(kù)數(shù)據(jù)
3. 使用緩存隊(duì)列,在緩存中查找數(shù)據(jù)判斷

首先來(lái)說(shuō)第一種,數(shù)據(jù)庫(kù)設(shè)置主鍵,鎖定人物ID,這個(gè)方法可以使數(shù)據(jù)永遠(yuǎn)不重復(fù),但是也會(huì)造成批量插入的時(shí)候造成出錯(cuò)
第二種方法,存入數(shù)據(jù)時(shí)查詢數(shù)據(jù)庫(kù)數(shù)據(jù),可行,但是多次訪問(wèn)數(shù)據(jù)庫(kù),造成效率低下
第三種方法,使用緩存隊(duì)列,在緩存中查找數(shù)據(jù)判斷,這種方法很好,而且速度相對(duì)較快,但是緩存太多容易出現(xiàn)OOM問(wèn)題

在這里咱們不選擇某一種方案,而是采用主鍵+優(yōu)先緩存+數(shù)據(jù)庫(kù)查詢方式,后期自己實(shí)現(xiàn)一個(gè)LRU緩存隊(duì)列,提供命中率

2. 爬取時(shí)創(chuàng)建人物關(guān)系

這個(gè)問(wèn)題思考了很久,也比較惡心,在人物不確定的情況下進(jìn)行人物的獲取和關(guān)系的創(chuàng)建,怎么處理好呢。我的想法是讓每一個(gè)人員信息攜帶一個(gè)上級(jí)信息,來(lái)判斷是否能夠構(gòu)建人物關(guān)系,有點(diǎn)類似于尾遞歸的思想。

3. 繪制流程圖

那么對(duì)于咱們的一個(gè)整體流程目前就有了(挑戰(zhàn)一下,還是放棄了、哈哈):

獲取URL-->解析頁(yè)面<--------
            |            |
            |    &nbs
        
		

網(wǎng)友評(píng)論