如何學習視覺化監控你的爬蟲!爬蟲一個不小心就會犯法的!
好,開始今天的文章。
今天主要是來說一下怎麼視覺化來 監控你的爬蟲的狀態 。
相信大家在跑爬蟲的過程中,也會好奇自己養的爬蟲一分鐘可以 爬多少頁面 , 多大的資料量 ,當然查詢的方式多種多樣。今天我來講一種視覺化的方法。
關於爬蟲資料在mongodb裡的版本我寫了一個可以熱更新配置的版本,即添加了新的爬蟲配置以後,不用重啟程式,即可獲取剛剛新增的爬蟲的狀態資料,大家可以通過關注我的公眾號以後, 回覆“ 視覺化” 即可獲取指令碼地址 。
1.成品圖
進群:548377875 即可獲取小編精心準備的大禮包一份哦!
這個是監控伺服器網速的最後成果,顯示的是下載與上傳的網速,單位為M。爬蟲的原理都是一樣的,只不過將資料存到InfluxDB的方式不一樣而已。
2. 環境
- InfluxDb ,是目前比較流行的時間序列資料庫;
- Grafana ,一個視覺化面板(Dashboard),有著非常漂亮的圖表和佈局展示,功能齊全的度量儀表盤和圖形編輯器,支援Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作為資料來源
- Ubuntu
- influxdb (pip install influxdb)
- Python 2.7
3. 原理
獲取要展示的資料,包含當前的時間資料,存到InfluxDb裡面,然後再到Grafana裡面進行相應的配置即可展示;
4. 安裝
4.1 Grafana安裝
官方安裝指導
安裝好以後,開啟本地的3000埠,即可進入管理介面,使用者名稱與密碼都是 admin 。
4.2 InfulxDb安裝
這個安裝就網上自己找吧,有很多的配置我都沒有配置,就不在這裡誤人子弟了。
5. InfluxDb簡單操作
碰到了資料庫,肯定要把增刪改查學會了啊, 和sql幾乎一樣,只有一絲絲的區別,具體操作,大家可以參考官方的文件。
- influx 進入命令列
- CREATE DATABASE test 建立資料庫
- show databases 檢視資料庫
- use test 使用資料庫
- show series 看錶
- select * from table_test
- DROP MEASUREMENT table_test 刪表
6. 存資料
InfluxDb資料庫的資料有一定的格式,因為我都是利用python庫進行相關操作,所以下面將在python中的格式展示一下:
json_body = [ { "measurement": "crawler", "time": current_time, "tags": { "spider_name": collection_name }, "fields": { "count": current_count, "increase_count": increase_amount, "size": co_size, "increase_size": increase_co_size } } ]
其中:
- measurement , 表名
- time ,時間
- tags ,標籤
- fields ,欄位
可以看到,就是個列表裡面,嵌套了一個字典。其中,對於時間欄位,有特殊要求,可以參考 這裡 , 下面是python實現方法:
from datetime import datetime current_time = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ')
所以,到這裡,如何將爬蟲的相關屬性存進去呢?以MongoDB為例
mongodb_client = pymongo.MongoClient(uri) for db_name, collection_name in dbs_and_cos.iteritems(): # 資料庫操作 db = mongodb_client[db_name] co = db[collection_name] # 集合大小 co_size = round(float(db.command("collstats", collection_name).get('size')) / 1024 / 1024, 2) # 集合內資料條數 current_count = co.count() # 初始化,當程式剛執行時,初始量就設定為第一次執行時獲取的資料 init_count = _count_dict.get(collection_name, current_count) # 初始化,當程式剛執行時,初始量就設定為第一次執行時獲取的資料大小 init_size = _size_dict.get(collection_name, co_size) # 條數增長量 increase_amount = current_count - init_count # 集合大小增長量 increase_co_size = co_size - init_size current_time = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ') # 賦值 _size_dict[collection_name] = co_size _count_dict[collection_name] = current_count json_body = [ { "measurement": "crawler", "time": current_time, "tags": { "spider_name": collection_name }, "fields": { "count": current_count, "increase_count": increase_amount, "size": co_size, "increase_size": increase_co_size } } ] print json_body client.write_points(json_body)
完整程式碼,關注上面的公眾號,傳送“” 視覺化 “”即可獲取。
那麼現在我們已經往資料裡存了資料了,那麼接下來要做的就是把存的資料展示出來。
7.展示資料
7.1 配置資料來源
以admin登入到Grafana的後臺後,我們首先需要配置一下資料來源。點選左邊欄的最下面的按鈕,然後點選DATA SOURCES,這樣就可以進入下面的頁面:
點選ADD DATA SOURCE,進行配置即可,如下圖:
其中,name自行設定;Type 選擇InfluxDB;url為預設的http://localhost:8086, 其他的因為我前面沒有進行配置,所以預設的即可。然後在InfluxDB Details裡的填入Database名,最後點選測試,如果沒有報錯的話,則可以進入下一步的展示資料了;
7.2 展示資料
點選左邊欄的+號,然後點選GRAPH
接著點選下圖中的edit進入編輯頁面:
從上圖中可以發現:
- 中間板塊是最後的資料展示
- 下面是資料的設定項
- 右上角是展示時間的設定板塊,在這裡可以選擇要展示多久的資料
7.2.1 配置資料
- 在Data Source中選擇剛剛在配置資料來源的時候配置的NAME欄位,而不是database名。
- 接著在下面選擇要展示的資料。看著就很熟悉是不是,完全是sql語句的視覺化。同時,當我們的資料放到相關的欄位上的時候,雙擊,就會把可以選擇的項展示出來了,我們要做的就是直接選擇即可;
- 設定右上角的時間,則可以讓資料實時進行更新與展示
因為下面的配置實質就是sql查詢語句,所以大家按照自己的需求,進行選擇配置即可,當配置完以後,就可以在中間的面板裡面看到資料了。
8. 總結
到這裡,本篇文章就結束了。其中,對於Grafana的操作我沒有介紹的很詳細,因為本篇主要講的是怎麼利用這幾個工具完成我們的任務。
同時,裡面的功能確實很多,還有可以安裝的外掛。我自己目前還是僅僅對於用到的部分比較瞭解,所以大家可以查詢官方的或者別的教程資料來對Grafana進行更深入的瞭解,製作出更加好看的視覺化作品來。