利用python批量检查网站的可用性


Posted in Python onSeptember 09, 2016

前言

随着站点的增多,管理复杂性也上来了,俗话说:人多了不好带,我发现站点多了也不好管,因为这些站点里有重要的也有不重要的,重要核心的站点当然就管理的多一些,像一些万年都不出一次问题的,慢慢就被自己都淡忘了,冷不丁那天出个问题,还的手忙脚乱的去紧急处理,所以规范的去管理这些站点是很有必要的,今天我们就做第一步,不管大站小站,先统一把监控做起来,先不说业务情况,最起码那个站点不能访问了,要第一时间报出来,别等着业务方给你反馈,就显得我们不够专业了,那接下来我们看看如果用python实现多网站的可用性监控,脚本如下:

#!/usr/bin/env python
 
 
import pickle, os, sys, logging
from httplib import HTTPConnection, socket
from smtplib import SMTP
 
def email_alert(message, status):
 fromaddr = 'xxx@163.com'
 toaddrs = 'xxxx@qq.com'
 
 server = SMTP('smtp.163.com:25')
 server.starttls()
 server.login('xxxxx', 'xxxx')
 server.sendmail(fromaddr, toaddrs, 'Subject: %s\r\n%s' % (status, message))
 server.quit()
 
def get_site_status(url):
 response = get_response(url)
 try:
  if getattr(response, 'status') == 200:
   return 'up'
 except AttributeError:
  pass
 return 'down'
  
def get_response(url):
 try:
  conn = HTTPConnection(url)
  conn.request('HEAD', '/')
  return conn.getresponse()
 except socket.error:
  return None
 except:
  logging.error('Bad URL:', url)
  exit(1)
  
def get_headers(url):
 response = get_response(url)
 try:
  return getattr(response, 'getheaders')()
 except AttributeError:
  return 'Headers unavailable'
 
def compare_site_status(prev_results):
 
 def is_status_changed(url):
  status = get_site_status(url)
  friendly_status = '%s is %s' % (url, status)
  print friendly_status
  if url in prev_results and prev_results[url] != status:
   logging.warning(status)
   email_alert(str(get_headers(url)), friendly_status)
  prev_results[url] = status
 
 return is_status_changed
 
def is_internet_reachable():
 if get_site_status('www.baidu.com') == 'down' and get_site_status('www.sohu.com') == 'down':
  return False
 return True
 
def load_old_results(file_path):
 pickledata = {}
 if os.path.isfile(file_path):
  picklefile = open(file_path, 'rb')
  pickledata = pickle.load(picklefile)
  picklefile.close()
 return pickledata
 
def store_results(file_path, data):
 output = open(file_path, 'wb')
 pickle.dump(data, output)
 output.close()
 
def main(urls):
 logging.basicConfig(level=logging.WARNING, filename='checksites.log', 
   format='%(asctime)s %(levelname)s: %(message)s', 
   datefmt='%Y-%m-%d %H:%M:%S')
 
 pickle_file = 'data.pkl'
 pickledata = load_old_results(pickle_file)
 print pickledata
  
 if is_internet_reachable():
  status_checker = compare_site_status(pickledata)
  map(status_checker, urls)
 else:
  logging.error('Either the world ended or we are not connected to the net.')
  
 store_results(pickle_file, pickledata)
 
if __name__ == '__main__':
 main(sys.argv[1:])

脚本核心点解释:

1、getattr()是python的内置函数,接收一个对象,可以根据对象属性返回对象的值。

2、compare_site_status()函数是返回的是一个内部定义的函数。

3、map() ,需要2个参数,一个是函数,一个是序列,功能就是将序列中的每个元素应用函数方法。

总结

以上就是这篇文章的全部内容,有需要的朋友们可以参考借鉴。

Python 相关文章推荐
Python引用(import)文件夹下的py文件的方法
Aug 26 Python
Python 编码处理-str与Unicode的区别
Sep 06 Python
浅谈Python类的__getitem__和__setitem__特殊方法
Dec 25 Python
Python学习之用pygal画世界地图实例
Dec 07 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
Jan 30 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
Mar 05 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
May 21 Python
Python快速查找list中相同部分的方法
Jun 27 Python
Python numpy.array()生成相同元素数组的示例
Nov 12 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
Mar 30 Python
Python实现代码统计工具
Sep 19 Python
Python监听剪切板实现方法代码实例
Nov 11 Python
Python如何判断数独是否合法
Sep 08 #Python
python框架django基础指南
Sep 08 #Python
python中星号变量的几种特殊用法
Sep 07 #Python
Python 实现 贪吃蛇大作战 代码分享
Sep 07 #Python
python 转换 Javascript %u 字符串为python unicode的代码
Sep 06 #Python
Python 编码处理-str与Unicode的区别
Sep 06 #Python
Python如何获取系统iops示例代码
Sep 06 #Python
You might like
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
改进的IP计数器
2006/10/09 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
PHP简单遍历对象示例
2016/09/28 PHP
PHP生成随机密码4种方法及性能对比
2020/12/11 PHP
JQuery困惑—包装集 DOM节点
2009/10/16 Javascript
利用jQuery 实现GridView异步排序、分页的代码
2010/02/06 Javascript
JS,Jquery获取select,dropdownlist,checkbox下拉列表框的值(示例代码)
2014/01/11 Javascript
js 模式窗口(模式对话框和非模式对话框)的使用介绍
2014/07/17 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
一分钟理解js闭包
2016/05/04 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
2016/11/29 Javascript
webpack配置的最佳实践分享
2017/04/21 Javascript
Vue.js2.0中的变化小结
2017/10/24 Javascript
JavaScript中EventLoop介绍
2018/01/22 Javascript
Vue中多个元素、组件的过渡及列表过渡的方法示例
2019/02/13 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
JavaScript面向对象程序设计中对象的定义和继承详解
2019/07/29 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
小程序实现简单语音聊天的示例代码
2020/07/24 Javascript
[02:42]完美大师赛主赛事淘汰赛第三日观众采访
2017/11/25 DOTA
打印出python 当前全局变量和入口参数的所有属性
2009/07/01 Python
Python3操作SQL Server数据库(实例讲解)
2017/10/21 Python
python程序变成软件的实操方法
2019/06/24 Python
python Event事件、进程池与线程池、协程解析
2019/10/25 Python
python爬虫爬取笔趣网小说网站过程图解
2019/11/18 Python
Pytorch中index_select() 函数的实现理解
2019/11/19 Python
python做接口测试的必要性
2019/11/20 Python
印度尼西亚最好的小工具在线商店:Erafone.com
2019/03/26 全球购物
企业为何需要商业计划书
2013/12/26 职场文书
2014年最新个人对照检查材料范文
2014/09/25 职场文书
酒会邀请函
2015/01/31 职场文书
自主招生专家推荐信
2015/03/26 职场文书
sql server 累计求和实现代码
2022/02/28 SQL Server
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript