本文由博主原創,轉載請註明出處:個人博客-知乎爬蟲之爬蟲流程設計mysql
git爬蟲項目地址(關注和star在哪裏~~):https://github.com/MatrixSeven/ZhihuSpider (已完結)git
附贈以前爬取的數據一份(mysql): 連接:https://github.com/MatrixSeven/ZhihuSpider/README.MD 只下載不點贊,不star,差評差評~藍瘦香菇)github
(Ps:這個思路有問題,實際上並非這麼搞得代碼,後續補上)
說到爬蟲,其實寫起來很簡單,爬蟲無非就是將本身想要的內容在頁面上抽離出來,而且存儲。這個過程在今天已經變得很是輕鬆,在Java下有Jsoup,Python下有BS4,還有通吃的正則等等,然而真正難的倒是在於僞造請求,截獲分析請求參數,獲取正確的頁面.
首先來講,一個能混得過去的爬蟲,應該有一個優秀的流程,在明確本身的目標後,應該立馬去設計爬蟲工做流程,而不是去無腦的Coding。
那麼今天我們就先研究下我們這個爬蟲的目標和流程。
首先我們是要獲取知乎頁面上的我的信息,關注和被關注信息,首先我們會遇到第一個問題就是登錄,我們這裏暫且不講,
其次我們就是要給定一個初始化url,而後進行followers的和followees的獲取,而後循環爬起來,那麼其中必定會遇到數據重複和人物關係創建的問題。sql
這個相對而言比較簡單,有幾種常規方法:數據庫
1. 數據庫設置主鍵,鎖定人物ID
2. 存入數據時查詢數據庫數據
3. 使用緩存隊列,在緩存中查找數據判斷
首先來講第一種,數據庫設置主鍵,鎖定人物ID,這個方法可使數據永遠不重複,可是也會形成批量插入的時候形成出錯
第二種方法,存入數據時查詢數據庫數據,可行,可是屢次訪問數據庫,形成效率低下
第三種方法,使用緩存隊列,在緩存中查找數據判斷,這種方法很好,並且速度相對較快,可是緩存太多容易出現OOM問題緩存
在這裏我們不選擇某一種方案,而是採用主鍵+優先緩存+數據庫查詢方式,後期本身實現一個LRU緩存隊列,提供命中率ide
這個問題思考了好久,也比較噁心,在人物不肯定的狀況下進行人物的獲取和關係的建立,怎麼處理好呢。個人想法是讓每個人員信息攜帶一個上級信息,來判斷是否可以構建人物關係,有點相似於尾遞歸的思想。post
那麼對於我們的一個總體流程目前就有了(挑戰一下,仍是放棄了、哈哈):url
獲取URL-->解析頁面<--------
| |
| |
是否存在 |
/\ |
/ \ |
更新 攜帶 |
數據 信息 |
/\ |
/ \ |
跟隨 關注 |
信息 信息----
獲取URL–》解析—》判斷—》更新/攜帶信息?—》分析跟隨者/根系關注者–》解析頁面
最終畫出真正的流程圖spa
//吾愛Java(QQ羣):170936712(點擊加入)