在使用爬蟲(chóng)爬取大量數(shù)據(jù)的時(shí)候客叉,一般我們都會(huì)把程序掛在服務(wù)器上運(yùn)行诵竭,然后就可以去干別的事情了景描。但是,我們還是有必要定時(shí)看一下程序運(yùn)行情況的秀撇。雖然我們可以通過(guò) log 信息來(lái)監(jiān)控程序運(yùn)行情況超棺,但這往往不夠直觀。所以呵燕,今天我就講講如何使用 Mysql 和 Grafana 監(jiān)控爬蟲(chóng)程序的運(yùn)行狀況棠绘,并可視化。
1. Grafana 簡(jiǎn)介
Grafana 是一個(gè)數(shù)據(jù)可視化工具再扭,它并不收集數(shù)據(jù)氧苍,但是可以從數(shù)據(jù)源(例如 Graphite、Mysql泛范、InfluxDB等)中獲取數(shù)據(jù)并可視化让虐。
2. 運(yùn)行 Grafana
Grafana 安裝教程可以去網(wǎng)上搜,不多說(shuō)罢荡。這里說(shuō)的是另一種替代方法:使用已經(jīng)安裝好 Grafana 的 Docker 鏡像(效果也是一樣的)赡突。如果不了解 Docker 的話,可以看下教程 Docker — 從入門(mén)到實(shí)踐
在這里区赵,我們需要先安裝好 Docker惭缰,并學(xué)會(huì)一些 Docker 基本命令,例如拉取鏡像笼才,容器的創(chuàng)建漱受,容器的運(yùn)行停止,鏡像和容器的刪除等等骡送。
安裝并運(yùn)行 Docker 之后:
在 Docker hub 搜索一下包含 Grafana 的鏡像昂羡,還是出現(xiàn)挺多個(gè)的。這里我選擇了 kamon/grafana_graphite
在服務(wù)器上拉取鏡像
docker pull kamon/grafana_graphite
- 使用該鏡像創(chuàng)建容器摔踱,并在后臺(tái)運(yùn)行
docker run \
-d \
-p 80:80 \
-p 81:81 \
-p 2003:2003 \
-p 8125:8125/udp\
-p 8126:8126\
--name=grafana_graphite \
kamon/grafana_graphite
到這里虐先,我們就得到了一個(gè)已經(jīng)安裝了 Grafana 的容器,根本就不用我們手動(dòng)安裝了O(∩_∩)O 哈哈~
- 在瀏覽器中打開(kāi) http://your_server_ip:80/昌渤,登錄(初始用戶名和密碼都是 admin)赴穗,我們就可以看到 Grafana 的控制臺(tái)了憔四,還是挺酷炫的膀息!
3. 編寫(xiě)爬蟲(chóng)程序并運(yùn)行
略。(在這里了赵,要將爬取到的 item 儲(chǔ)存起來(lái)潜支,例如插入 mysql 數(shù)據(jù)庫(kù))
4. 編寫(xiě)監(jiān)控的腳本并運(yùn)行
這里,我們要每隔一定時(shí)間查詢爬取總量柿汛,并計(jì)算爬取速度冗酿。下面是一個(gè)例子:
代碼分為兩部分埠对,首先是在我們存放 item 的數(shù)據(jù)庫(kù)建立兩個(gè)表,每個(gè)表有兩個(gè)字段裁替,一個(gè)是查詢時(shí)間项玛,另一個(gè)是 item_total / item_min
。
import pymysql as mdb
import time
# 存放爬取數(shù)據(jù)的數(shù)據(jù)庫(kù)(這里我把統(tǒng)計(jì)的數(shù)據(jù)弱判,存入了爬取數(shù)據(jù)所在的數(shù)據(jù)庫(kù))
DB_NAME = 'db_name'
TABLE_NAME1 = 'item_per_min'
TABLE_NAME2 = 'item_total'
host = 'your_server_ip'
user = 'your_user_name'
passwd = 'your_pwd'
# 爬取的 item 存放的表
item_table = 'item_table'
def create_table():
use_db_str = 'use ' + DB_NAME
create_table_str1 = "CREATE TABLE if not exists " + TABLE_NAME1 + """(
`time` datetime NOT NULL,
`speed` int NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;"""
create_table_str2 = "CREATE TABLE if not exists " + TABLE_NAME2 + """(
`time` datetime NOT NULL,
`total` int NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;"""
# 數(shù)據(jù)庫(kù)連接
conn = mdb.connect(host, user, passwd)
cursor = conn.cursor()
try:
cursor.execute(use_db_str)
cursor.execute(create_table_str1)
cursor.execute(create_table_str2)
conn.commit()
except Exception as e:
print(e)
代碼第二部分是主函數(shù)襟沮,每隔一分鐘查詢 items 數(shù),并計(jì)算爬取速度昌腰,將得到的數(shù)據(jù)儲(chǔ)存起來(lái):
if __name__ == '__main__':
# 創(chuàng)建表
create_table()
conn = mdb.connect(host, user, passwd, DB_NAME)
cursor = conn.cursor()
before_item = 0
while True:
try:
cursor.execute('SELECT count(*) FROM %s', item_table )
result = cursor.fetchone()
current_item = result[0]
print(current_item)
# 過(guò)去一分鐘爬取量
cursor.execute('insert into %s values (now(), %s)' % (TABLE_NAME1, current_item - before_item))
# 爬取總量
cursor.execute('insert into %s values (now(), %s)' % (TABLE_NAME2, current_item))
conn.commit()
before_item = current_item
except Exception as e:
print(e)
time.sleep(60)
監(jiān)控腳本寫(xiě)完后开伏,就可以掛在服務(wù)器后臺(tái)運(yùn)行了
5. Grafana 配置
- 配置數(shù)據(jù)源,這里命名為
monitor_crawler
- 新建 Dashboard,然后點(diǎn)擊 Graph 圖標(biāo)創(chuàng)建圖,接著點(diǎn)擊
Panel Title
->Edit
- 選擇我們剛才創(chuàng)建的數(shù)據(jù)源
monitor_crawler
- 按照 Grafana 提供的模板填寫(xiě) sql 語(yǔ)句胧辽,這里查詢了
item_per_min
表
SELECT
UNIX_TIMESTAMP(time) as time_sec,
speed as value,
'items_min' as metric
FROM item_per_min
(注意我們選擇的是 Time series
)
- 可以選擇繪圖模式房资,一般是選
Lines
6. 成果展示
(其實(shí) Grafana 還有很多很酷炫的設(shè)置,大家有興趣可以去探索一下J哒恪)
總結(jié)
在安裝好各種環(huán)境之后,Mysql + Grafana 監(jiān)控爬蟲(chóng)程序的步驟:
- 編寫(xiě)爬蟲(chóng)程序
- 編寫(xiě)監(jiān)控腳本,將爬取速度和爬取總量定時(shí)存進(jìn) Mysql 數(shù)據(jù)庫(kù)
- Grafana 新建數(shù)據(jù)源大审,連接對(duì)應(yīng)的 Mysql 數(shù)據(jù)庫(kù)
- 創(chuàng)建新的 Dashboard,并在里面創(chuàng)建圖表座哩,圖表數(shù)據(jù)源選擇我們上一步新建的數(shù)據(jù)源