爬虫版网络质量图
作为一个规模还比较小的互联网公司的苦逼运维,时不时地会遇到各地的网络质量问题。虽然有 Zabbix 等 ping loss 监控等,但大概率也只能反映出 Zabbix Server 与被监控机器之间网络问题,而业务可是全国各地都有用户访问的。
之前在某个 QQ 群里看到过合作公司有个比较高大上的网络质量监控图,能够监控到全国各地到某地的网络丢包情况:
(具体可见:http://www.ywjt.org/index.php/archives/920)
经常是丢出类似上面这个图来,质问机房:“XX机房,网络又丢包了”,然后机房就赶紧跟进处理,让我们甚是羡慕。好想弄一个来着。
据说数据是他们全国各地几十个自建机房相互 ping 汇总得来的。但我们只有零星几个机房,有些机房还都在同一个城市,数据太少了不好看,也不够准确,怎么办呢?
只好自己爬了。
网上的多地 ping 工具 网上这些网络工具各有优劣,找个容易爬的可不容易。因为嫌麻烦,直接上了大杀器 Selenium / PhantomJS。
大概就下面这样子。
driver.get(URL)
nav2 = wait.until(EC.presence_of_element_located((By.ID, 'nav2')))
nav2.click()
text = driver.find_element_by_xpath('//*[@id="url"]')
text.send_keys(ip)
btn = driver.find_element_by_xpath('//*[@id="su"]')
btn.click()
_ = wait.until(EC.presence_of_element_located((By.ID, 'chinamap_time')))
time.sleep(wait_seconds)
tbl = driver.find_element_by_xpath('//*[@id="tblSort"]')
li = [i for i in tbl.text.split('\n') if i and i.endswith('32B')]
sleep 是因为一般这种测速页面都需要等到所有监控点完成任务,我设置了 60s。
我设置了每五分钟爬一次,爬出来数据,每个监测点的格式
{
'province': '浙江',
'trace_point': '常州市电信',
'timestamp': '1539251302',
'ISP': '电信',
'recv': '10',
'send': '10',
'drop': '0',
'source_ip': 'xx.xx.xx.xx',
'min_time': '28.716ms',
'avg_time': '28.804ms',
'max_time': '28.903ms'
}
最好被检测的 IP 随机抽一个,不要一直都是用同一个 IP,容易被发现 (捂脸)。
接下来就该撸个页面了,机(lan)智(duo)如我当然是拿来主义了。
https://github.com/gongxufan/echarts-migration
修改起来并不难,主要修改两点:
map.js 里面的 geoCoord,需要改为各监测点的 geo 坐标值,比如:
geoCoord: {
'广州市': [113.5107, 23.2196],
'衡阳市': [112.4121, 26.7902],
'安康市': [109.1162, 32.7722],
'成都市': [103.9526, 30.7617],
'大庆市': [124.7717, 46.4282],
'鄂州市': [114.7302, 30.4102],
'西安市': [109.1162, 34.2004],
'昆明市': [102.9199, 25.4663],
'长春市': [125.8154, 44.2584],
'淮安市': [118.927, 33.4039],
'湛江市': [110.3577, 20.9894],
'拉萨市': [91.1865, 30.1465],
}
js/data.js 填上所有的监测点名称以及最大时延值,如:
data: [
{name: '衡阳市',value: 22},
{name: '安康市',value: 33},
{name: '成都市',value: 29},
{name: '大庆市',value: 55},
{name: '鄂州市',value: 23},
{name: '西安市',value: 35},
{name: '鄂州市',value: 23},
{name: '昆明市',value: 40},
{name: '长春市',value: 60},
{name: '淮安市',value: 43},
{name: '湛江市',value: 10},
{name: '拉萨市',value: 88}
]
剩下就是找到全国所有城市的 geo 坐标信息,有时监测点只有省份信息而没有具体城市等问题。其实都是小问题,但是却要花了相对较多的时间。
初步的结果大概就是这个样子:
看起来还行!