爬虫版网络质量图

作为一个规模还比较小的互联网公司的苦逼运维,时不时地会遇到各地的网络质量问题。虽然有 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 坐标信息,有时监测点只有省份信息而没有具体城市等问题。其实都是小问题,但是却要花了相对较多的时间。

初步的结果大概就是这个样子:

看起来还行!