本文並非講解爬蟲的相關技術實現的,而是從實用性的角度,將抓取並存入 MongoDB 的數據 用 InfluxDB 進行處理,然後又經過 Grafana 將爬蟲抓取數據狀況經過酷炫的圖形化界面展現出來。python
在開始以前,先對 Grafana 和 InfluxDB 作一下簡要的介紹:web
Grafana:是一個開源的分析和監控系統,擁有精美的web UI,支持多種圖表,能夠展現influxdb中存儲的數據,而且有報警的功能。mongodb
Influxdb :是一款開源的時間序列數據庫,專門用來存儲和時間相關的數據(好比我用它存儲某個時間點爬蟲抓取信息的數量)。數據庫
最終能實現的效果是這樣的:
json
請注意如下操做,都是 Mac 下實現的。可是原理是類似的,你能夠在本身的 PC 上進行試驗。瀏覽器
安裝 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
安裝 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"
因爲這裏主是要介紹如何將 Grafana 和 InfluxDB 與爬蟲進行結合的方案,而不是主講爬蟲原理,並且代碼也比較多,影響可讀性,因此就不貼出爬取的代碼。
若你對這代碼感興趣,能夠點擊原文鏈接查看詳細內容!
考慮到可能要增長爬蟲到監控中,所以這裏使用了熱更新對監控進行動態配置。
配置文件 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 / 1024, 2)
# 獲取 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 的窗口,會提示配置更新,說明配置熱更新生效。
首先打開 Chrome 瀏覽器,輸入 http://127.0.0.1:3000 登陸 grafana 頁面。
鏈接本地 influxDB 數據庫,操做以下圖。
在紅色方框內選擇 Type 類型爲 InfluxDB,並輸入URL:http://localhost:8086
在紅框內輸入influxDB數據庫名稱
新建 dashboard
新建 graph 類型 dashboard
修改 dashboard 設置
點擊紅色方框修改設定
修改 dashboard 配置
設置監控的數據對象
在監控腳本中,寫入influxDB的代碼以下,其中 "measurement" 對應 表名,"fields" 對應寫入的字段;
"measurement": "crawler",
"fields": {
"count": current_count,
"increase_count": increase_amount,
"size": collection_size,
"increase_size": increase_collection_size
}
啓動 MongoDB 數據庫服務。
brew services mongodb start
新建一個 terminal 窗口,運行爬蟲文件。
爬蟲文件運行成功
咱們能夠在剛剛打開的控制檯裏查看效果展現: