1. 程式人生 > >一個簡單的分散式的知乎爬蟲

一個簡單的分散式的知乎爬蟲

一個分散式的網路爬蟲,用於抓取知乎的使用者詳細資訊,包括使用者名稱、行業、位置、畢業院校、介紹、關注者、關注人等。

原理

  • 主機
    負責分發任務。從起始位置開始,將當前使用者的所有關注者提取出來,並壓入Redis任務佇列,然後隨機的進入到其中一個關注者的主頁,遞迴上述操作。

  • 從機
    負責抓取網頁。連線至Redis佇列,從中取出一個使用者的URL,然後對URL的內容進行抓取,並儲存到MongoDB中,然後迴圈上述操作。

各模組功能

  • Master.py:主機的入口,包含了主機的抓取和去重策略。
  • Slave.py:從機的入口。
  • dbAPI.py:儲存模組,用於將資料存入資料庫。
  • login.py:登入模組,用於登入到知乎。
  • utils.py:工具模組。
  • Error.py:異常類模組。
  • setting.json:配置檔案,用於設定資料庫的Host和Port等。

需要額外安裝的庫

  • redis,用於連線Redis
    pip3 install redis
  • pymongo,用於連線MongoDB
    pip3 install pymongo
  • requests,用於向網站傳送請求
    pip3 install requests
  • BeautifulSoup,用於解析HTML
    pip3 install bs4
  • lxml,配合BeautifulSoup使用,加快解析速度。
    pip3 install lxml
  • PyInstaller(非必要,如果有需要的話)
    pip3 install PyInstaller
    該庫用於將.py檔案打包為.exe檔案,這樣就可以將從機執行在沒有裝Python的PC機下了。
    如果想要將從機打包,可以將資料夾定位在本目錄,然後執行
    pyinstaller -F Slave.py

需要額外安裝的應用

  • Redis :用於構造任務佇列。

  • MongoDB :用於存放抓取到的資料。
    如果使用的是雲資料庫,可以不用在本地安裝Redis和MongoDB。

  • Robomongo(非必須,但推薦安裝):用於視覺化管理MongoDB,便於檢視資料。

需要配置的設定

需要在setting.json中配置好從機暱稱,和資料庫設定,如果使用的是本地服務,則無需配置。

{
    "user":"liu",
    "redis":
    {
        "host": "localhost",
        "port": 6379
    },
    "mongodb":
    {
        "host": "localhost",
        "port": 27017
    }

}

執行方法

  • 資料庫端
    開啟Redis和MongoDB。
  • 主機
    需要準備一個知乎帳號。然後執行
    python3 Master.py

  • 從機
    setting.py中設定一下從機的暱稱(便於區分多個從機),然後執行
    python3 Slave.py

一種推薦的部署方法

經過測試,一臺主機大概可以保證30個左右的從機的URL供應,所以我們只需要一臺計算機作為主機就夠用了。在這裡我推薦將主機和資料庫分開部署,用一臺單獨的計算機作為Redis和MongoDB伺服器(推薦使用阿里雲、騰訊雲等遠端伺服器),然後使用自己的計算機作為主機,其他的計算機作為從機。