知乎爬蟲之2:爬蟲流程設計(附贈爬出的資料庫)

来源:http://www.cnblogs.com/seven007/archive/2017/01/04/6248532.html
-Advertisement-
Play Games

本文由博主原創,轉載請註明出處:我的博客-知乎爬蟲之爬蟲流程設計 git爬蟲項目地址(關註和star在哪裡~~):https://github.com/MatrixSeven/ZhihuSpider (已完結) 附贈之前爬取的數據一份(mysql): 鏈接:https://github.com/Ma ...


本文由博主原創,轉載請註明出處:我的博客-知乎爬蟲之爬蟲流程設計

git爬蟲項目地址(關註和star在哪裡~~):

(Ps:這個思路有問題,實際上並不是這麼搞得代碼,後續補上)
說到爬蟲,其實寫起來很簡單,爬蟲無非就是將自己想要的內容在頁面上抽離出來,並且存儲。這個過程在今天已經變得非常輕鬆,在Java下有Jsoup,Python下有BS4,還有通吃的正則等等,然而真正難的卻是在於偽造請求,截獲分析請求參數,獲取正確的頁面.
首先來說,一個能混得過去的爬蟲,應該有一個優秀的流程,在明確自己的目標後,應該立馬去設計爬蟲工作流程,而不是去無腦的Coding。

那麼今天咱們就先研究下咱們這個爬蟲的目標和流程。
首先咱們是要獲取知乎頁面上的個人信息,關註和被關註信息,首先咱們會遇到第一個問題就是登陸,咱們這裡暫且不講,
其次咱們就是要給定一個初始化url,然後進行followers的和followees的獲取,然後迴圈爬起來,那麼其中一定會遇到數據重覆和人物關係建立的問題。

1.過濾重覆數據

這個相對而言比較簡單,有幾種常規方法:

1. 資料庫設置主鍵,鎖定人物ID
2. 存入數據時查詢資料庫數據
3. 使用緩存隊列,在緩存中查找數據判斷

首先來說第一種,資料庫設置主鍵,鎖定人物ID,這個方法可以使數據永遠不重覆,但是也會造成批量插入的時候造成出錯
第二種方法,存入數據時查詢資料庫數據,可行,但是多次訪問資料庫,造成效率低下
第三種方法,使用緩存隊列,在緩存中查找數據判斷,這種方法很好,而且速度相對較快,但是緩存太多容易出現OOM問題

在這裡咱們不選擇某一種方案,而是採用主鍵+優先緩存+資料庫查詢方式,後期自己實現一個LRU緩存隊列,提供命中率

2. 爬取時創建人物關係

這個問題思考了很久,也比較噁心,在人物不確定的情況下進行人物的獲取和關係的創建,怎麼處理好呢。我的想法是讓每一個人員信息攜帶一個上級信息,來判斷是否能夠構建人物關係,有點類似於尾遞歸的思想。

3. 繪製流程圖

那麼對於咱們的一個整體流程目前就有了(挑戰一下,還是放棄了、哈哈):

獲取URL-->解析頁面<--------
            |            |
            |            |
         是否存在         |
            /\           |
           /  \          |
        更新   攜帶       |
        數據   信息       |
               /\        |
              /  \       |
            跟隨  關註    |
            信息  信息----

獲取URL–》解析—》判斷—》更新/攜帶信息?—》分析跟隨者/根系關註者–》解析頁面
最終畫出真正的流程圖

//吾愛Java(QQ群):170936712(點擊加入)

 

 

 

 

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2009 年我讀了李笑來老師的《把時間當朋友》,知識了柳比歇夫的時間記錄法。當時激動壞了,馬上動手實踐起來。一開始的時候,是用一個小本子,走到哪兒都帶著。完成一件事,就記錄一下花費的時間。這樣的做法持續了一周多的時間,我發現每天浪費在 Google Reader 上的時間大幅度減少了。那個時候,我使 ...
  • 什麼是Servlet?① Servlet就是JAVA 類② Servlet是一個繼承HttpServlet類的類③ 這個在伺服器端運行,用以處理客戶端的請求 Servlet相關包的介紹--javax.servlet.* :存放與HTTP 協議無關的一般性Servlet 類;--javax.servl ...
  • 直接插入排序是將一個記錄插入到已經排好序的有序表中,從而得到一個新的記錄數加1的有序表。 下麵的代碼中會先假設數組的第一個元素是已經拍好序的有序表,然後從第二個元素開始遍歷剩下的元素。 所以呢,第一個for迴圈是遍歷待插入的元素,第二個for迴圈是遍歷被插入的有序表,並將待插入元素與有序表的元素比較 ...
  • 參考 http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html 問題:bash怎麼提取字元串的最後一位?例如python中string[-1]就是python字元串最後一位。 echo ${PATH:((${#PATH} - 1)) ...
  • RSA.h #ifndef _RSA_H #define _RSA_H #include #include #include /* 密鑰產生: 1.隨機選定兩個大素數p, q. 2.計算公鑰和私鑰的公共模數 n = pq . 3.計算模數n的歐拉函數 φ(n) . 4.選定一個正整數e, 使1 e,... ...
  • SHA-1.cpp TEST.cpp ...
  • if __name__== "__main__" 的意思(作用)python代碼復用 轉自:大步's Blog http://www.dabu.info/if-__-namelxx_-main__-mean-function-python-code-reuse.html 有人在學習python腳本時 ...
  • Java是最早開始有併發的語言之一,再過去傳統多任務的模式下,人們發現很難解決一些更為複雜的問題,這個時候我們就有了併發. 引用 & 160; & 160; & 160; & 160;多線程比多任務更加有挑戰。多線程是在同一個程式內部並行執行,因此會對相同的記憶體空間進行併發讀寫操作。這可能是在單線程 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...