教你實現一個可視化爬蟲監控系統


image.png

# 1.  前言  

本文並非講解爬蟲的相關技術實現的,而是從實用性的角度,將抓取並存入 MongoDB 的數據 用 InfluxDB 進行處理,然後又經過 Grafana 將爬蟲抓取數據狀況經過酷炫的圖形化界面展現出來。python

在開始以前,先對 Grafana 和 InfluxDB 作一下簡要的介紹:web

  • Grafana:是一個開源的分析和監控系統,擁有精美的web UI,支持多種圖表,能夠展現influxdb中存儲的數據,而且有報警的功能。mongodb

  • Influxdb :是一款開源的時間序列數據庫,專門用來存儲和時間相關的數據(好比我用它存儲某個時間點爬蟲抓取信息的數量)。數據庫

最終能實現的效果是這樣的:
json

請注意如下操做,都是 Mac 下實現的。可是原理是類似的,你能夠在本身的 PC 上進行試驗。瀏覽器

#2. 安裝配置 InfluxDB 

安裝 InfluxDBapp

 
 

brew update
brew install influxdb
ide

修改配置文件/usr/local/etc/influxdb.conf,若是原文件中沒有對應配置項,需本身添加。spa

 
 

[data]
  # 將存儲 TSM 文件的路徑,修改爲本身的目錄。
  dir = "/usr/local/var/influxdb/data"     
# 將存儲 WAL 文件的路徑,修改爲本身的目錄。
  wal-dir = "/usr/local/var/influxdb/wal"  

[admin]
  # 設定 admin 管理界面的 host 和 port 
  bind-address='127.0.0.1:8083'

[http]
  # 修改 API 的 host 和 port
  bind-address = ":8086"
3d

#3. 安裝配置 Grafana 

安裝 Grafana

 
 

brew update
brew install grafana

並修改 Grafana 配置文件/usr/local/etc/grafana/grafana.ini,內容以下:

 
 

[data]
  # 將存儲 TSM 文件的路徑,修改爲本身的目錄。
  dir = "/usr/local/var/influxdb/data"     
# 將存儲 WAL 文件的路徑,修改爲本身的目錄。
  wal-dir = "/usr/local/var/influxdb/wal"  

[admin]
  # 設定 admin 管理界面的 host 和 port 
  bind-address='127.0.0.1:8083'

[http]
  # 修改 API 的 host 和 port
  bind-address = ":8086"


#4. 爬蟲代碼 

因爲這裏主是要介紹如何將 Grafana 和 InfluxDB 與爬蟲進行結合的方案,而不是主講爬蟲原理,並且代碼也比較多,影響可讀性,因此就不貼出爬取的代碼。

若你對這代碼感興趣,能夠點擊原文鏈接查看詳細內容!

#5. 監控腳本  

考慮到可能要增長爬蟲到監控中,所以這裏使用了熱更新對監控進行動態配置。

配置文件 influx_settings.conf 主要用於熱更新相關設置。

 
 

# [須要監控的 MongoDB 數據的 數據庫名 和 集合名]
[db]
db_collection_dict = {
    'learn_selenium_doubandianying''movie_info',
    }

# [設置循環間隔時間]
[time]
interval = 
15

如何動態讀取這個配置文件的設置呢?須要寫一個腳原本監控。代碼以下:

 
 

import ast
import time
import pymongo
import traceback
from configparser import ConfigParser
from influxdb import InfluxDBClient
from datetime import datetime
from os.path import getmtime

# 配置 influxdb
client = InfluxDBClient(host='localhost', port=8086# influxdb默認端口爲8086

# 建立 database
client.create_database('Spider')
# switch 到 database
client.switch_database('Spider')

# 設定配置文件
config_name = 'influx_settings.conf'

WATCHED_FILES = [config_name]
WATCHED_FILES_MTIMES = [(f, getmtime(f)) for f in WATCHED_FILES]  

_count_dict = {}
_size_dict = {}

# 獲取配置文件中的設置
def parse_config(file_name):
    try:
        # 建立一個配置文件對象
        cf = ConfigParser() 
        # 打開配置文件
        cf.read(file_name)
        # 獲取配置文件中的統計頻率
        interval = cf.getint('time''interval')
        # 獲取配置文件中要監控的 dbs 和 collection
        dbs_and_collections = ast.literal_eval(cf.get('db''db_collection_dict'))
        return interval, dbs_and_collections

    except:
        print(traceback.print_exc())
        return None


# 從 MongoDB 獲取數據,並寫入 InfluxDB
def insert_data(dbs_and_collections):

    # 鏈接 MongoDB 數據庫
    mongodb_client = pymongo.MongoClient(host='127.0.0.1',port=27017)  # 直接使用默認地址端口鏈接 MongoDB

    for db_name, collection_name in dbs_and_collections.items():

        # 數據庫操做,建立 collection 集合對象
        db = mongodb_client[db_name]
        collection = db[collection_name]

        # 獲取 collection 集合大小
        collection_size = round(float(db.command("collstats", collection_name).get('size')) / 1024 / 10242)

        # 獲取 collection 集合內數據條數
        current_count = collection.count()

        # 初始化數據條數,當程序剛執行時,條數初始量就設置爲第一次執行時獲取的數據
        init_count = _count_dict.get(collection_name, current_count)
        # 初始化數據大小,當程序剛執行時,大小初始量就設置爲第一次執行時獲取的數據大小
        init_size = _size_dict.get(collection_name, collection_size)

        # 獲得數據條數增加量
        increase_amount = current_count - init_count        
        # 獲得數據大小增加量
        increase_collection_size = collection_size - init_size

        # 獲得當前時間
        current_time = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ')

        # 賦值
        _count_dict[collection_name] = current_count
        _size_dict[collection_name] = collection_size

        # 構建
        json_body = [
            {
                "measurement""crawler",
                "time": current_time,
                "tags": {
                    "spider_name": collection_name
                },
                "fields": {
                    "count": current_count,
                    "increase_count": increase_amount,
                    "size": collection_size,
                    "increase_size": increase_collection_size

                }
            }
        ]
        # 將獲取
        if client.write_points(json_body):
            print('成功寫入influxdb!',json_body)


def main():
    # 獲取配置文件中的監控頻率和MongoDB數據庫設置
    interval, dbs_and_collexctions = parse_config(config_name)

    # 若是配置有問題則報錯
    if (interval or dbs_and_collexctions) is None:
        raise ValueError('配置有問題,請打開配置文件從新設置!')

    print('設置監控頻率:', interval)
    print('設置要監控的MongoDB數據庫和集合:', dbs_and_collexctions)

    last_interval = interval
    last_dbs_and_collexctions = dbs_and_collexctions

    # 這裏實現配置文件熱更新
    for f, mtime in WATCHED_FILES_MTIMES:
        while True:
            # 檢查配置更新狀況,若是文件有被修改,則從新獲取配置內容
            if getmtime(f) != mtime:
                # 獲取配置信息
                interval, dbs_and_collections = parse_config(config_name)
                print('提示:配置文件於 %s 更新!' % (time.strftime("%Y-%m-%d %H:%M:%S")))

                # 若是配置有問題,則使用上一次的配置
                if (interval or dbs_and_collexctions) is None:
                    interval = last_interval
                    dbs_and_collexctions = last_dbs_and_collexctions

                else:
                    print('使用新配置!')
                    print('新配置內容:', interval, dbs_and_collexctions)
                    mtime = getmtime(f)

            # 寫入 influxdb 數據庫
            insert_data(dbs_and_collexctions)

            # 使用 sleep 設置每次寫入的時間間隔
            time.sleep(interval)

if __name__ == '__main__':
    main()

來試着運行一下

 
 

python3 influx_monitor.py 

運行,獲得下圖內容,表示監控腳本運行成功。

另建窗口,修改配置文件 influx_settings.conf

 
 

# 修改間隔時間爲8秒
interval = 8

切換至第一次運行 influxDB 的窗口,會提示配置更新,說明配置熱更新生效。

#6. 配置 Grafana 

首先打開 Chrome 瀏覽器,輸入 http://127.0.0.1:3000 登陸 grafana 頁面。

鏈接本地 influxDB 數據庫,操做以下圖。
在紅色方框內選擇 Type 類型爲 InfluxDB,並輸入URL:
http://localhost:8086

image.png
image.png

在紅框內輸入influxDB數據庫名稱

新建 dashboard

image.png

新建 graph 類型 dashboard

修改 dashboard 設置

image.png

點擊紅色方框修改設定


image.png

修改 dashboard 配置

設置監控的數據對象

在監控腳本中,寫入influxDB的代碼以下,其中 "measurement" 對應 表名,"fields" 對應寫入的字段;

 
 

"measurement""crawler",
                "fields": {
                    "count": current_count,
                    "increase_count": increase_amount,
                    "size": collection_size,
                    "increase_size": increase_collection_size
   }

#7. 運行爬蟲文件

啓動 MongoDB 數據庫服務。

 
 

brew services mongodb start

新建一個 terminal 窗口,運行爬蟲文件。

image.png

爬蟲文件運行成功

咱們能夠在剛剛打開的控制檯裏查看效果展現:

image.png

本文來自讀者投稿,小明對原文進行了大量的修剪及排版使得內容更適應公衆號手機閱讀。如需文中說起的代碼,請點擊左下方原文連接進行查看。
相關文章
相關標籤/搜索