一個簡單的分散式的知乎爬蟲
阿新 • • 發佈:2019-02-01
一個分散式的網路爬蟲,用於抓取知乎的使用者詳細資訊,包括使用者名稱、行業、位置、畢業院校、介紹、關注者、關注人等。
原理
主機
負責分發任務。從起始位置開始,將當前使用者的所有關注者提取出來,並壓入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伺服器(推薦使用阿里雲、騰訊雲等遠端伺服器),然後使用自己的計算機作為主機,其他的計算機作為從機。