利用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实现QQ游戏大家来找茬辅助工具
Sep 14 Python
在Django的模型中添加自定义方法的示例
Jul 21 Python
python通过getopt模块如何获取执行的命令参数详解
Dec 29 Python
Python设计模式之命令模式原理与用法实例分析
Jan 11 Python
对Python函数设计规范详解
Jul 19 Python
在OpenCV里使用Camshift算法的实现
Nov 22 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
Feb 26 Python
Python计算信息熵实例
Jun 18 Python
记录一下scrapy中settings的一些配置小结
Sep 28 Python
python3访问字典里的值实例方法
Nov 18 Python
Django-simple-captcha验证码包使用方法详解
Nov 28 Python
Python+DeOldify实现老照片上色功能
Jun 21 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
PHP使用Session遇到的一个Permission denied Notice解决办法
2014/07/30 PHP
PHP中Http协议post请求参数
2015/11/02 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
PHP输出Excel PHPExcel的方法
2018/07/26 PHP
PHP根据key删除数组中指定的元素
2019/02/28 PHP
js 匿名调用实现代码
2009/06/19 Javascript
JavaScript 学习笔记(十六) js事件
2010/02/01 Javascript
jquery判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
2010/10/15 Javascript
为jQuery.Treeview添加右键菜单的实现代码
2010/10/22 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
JQuery fileupload插件实现文件上传功能
2016/03/18 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
JavaScript实现二叉树定义、遍历及查找的方法详解
2017/12/20 Javascript
atom-design(Vue.js移动端组件库)手势组件使用教程
2019/05/16 Javascript
Python中的引用和拷贝浅析
2014/11/22 Python
Python进阶之尾递归的用法实例
2018/01/31 Python
python批量替换多文件字符串问题详解
2018/04/22 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
python3结合openpyxl库实现excel操作的实例代码
2018/09/11 Python
python爬取微信公众号文章的方法
2019/02/26 Python
python的range和linspace使用详解
2019/11/27 Python
Python之Class&Object用法详解
2019/12/25 Python
Anaconda+Pycharm环境下的PyTorch配置方法
2020/03/13 Python
Lombok插件安装(IDEA)及配置jar包使用详解
2020/11/04 Python
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
AmazeUI 手机版页面的顶部导航条Header与侧边导航栏offCanvas的示例代码
2020/08/19 HTML / CSS
阿迪达斯英国官方网站:adidas英国
2019/08/13 全球购物
大客户销售经理职责
2013/12/04 职场文书
会计专业大学生职业生涯规划范文
2014/01/11 职场文书
大学生个人求职口试自我评价
2014/02/16 职场文书
会计专业自荐书
2014/07/08 职场文书
党员反对四风问题思想汇报
2014/09/12 职场文书
药品开票员岗位职责
2015/04/15 职场文书
车间安全生产管理制度
2015/08/06 职场文书
python index() 与 rindex() 方法的使用示例详解
2022/12/24 Python