知乎爬蟲(chóng)之2:爬蟲(chóng)流程設(shè)計(jì)(附贈(zèng)爬出的數(shù)據(jù)庫(kù))
本文由博主原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處:我的博客-知乎爬蟲(chóng)之爬蟲(chóng)流程設(shè)計(jì)
git爬蟲(chóng)項(xiàng)目地址(關(guān)注和star在哪里~~):https://github.com/MatrixSeven/ZhihuSpider (已完結(jié))
附贈(zèng)之前爬取的數(shù)據(jù)一份(mysql): 鏈接:https://github.com/MatrixSeven/ZhihuSpider/README.MD 只下載不點(diǎn)贊,不star,差評(píng)差評(píng)~藍(lán)瘦香菇)
(Ps:這個(gè)思路有問(wèn)題,實(shí)際上并不是這么搞得代碼,后續(xù)補(bǔ)上)
說(shuō)到爬蟲(chóng),其實(shí)寫起來(lái)很簡(jiǎn)單,爬蟲(chóng)無(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ò)去的爬蟲(chóng),應(yīng)該有一個(gè)優(yōu)秀的流程,在明確自己的目標(biāo)后,應(yīng)該立馬去設(shè)計(jì)爬蟲(chóng)工作流程,而不是去無(wú)腦的Coding。
那么今天咱們就先研究下咱們這個(gè)爬蟲(chóng)的目標(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è)面<--------
| |
| |
是否存在 |
/\ |
/ \ |
更新 攜帶 |
數(shù)據(jù) 信息 |
/\ |
/ \ |
跟隨 關(guān)注 |
信息 信息----
獲取URL–》解析—》判斷—》更新/攜帶信息?—》分析跟隨者/根系關(guān)注者–》解析頁(yè)面
最終畫出真正的流程圖

//吾愛(ài)Java(QQ群):170936712(點(diǎn)擊加入)

浙公網(wǎng)安備 33010602011771號(hào)