利用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迭代和迭代器详解
Nov 10 Python
python安装oracle扩展及数据库连接方法
Feb 21 Python
python验证码识别的示例代码
Sep 21 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
Feb 03 Python
python3.X 抓取火车票信息【修正版】
Jun 19 Python
python退出命令是什么?详解python退出方法
Dec 10 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
Jan 19 Python
浅谈Pycharm最有必要改的几个默认设置项
Feb 14 Python
Python使用qrcode二维码库生成二维码方法详解
Feb 17 Python
使用Python第三方库pygame写个贪吃蛇小游戏
Mar 06 Python
详解tensorflow之过拟合问题实战
Nov 01 Python
python3实现Dijkstra算法最短路径的实现
May 12 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
基于mysql的bbs设计(二)
2006/10/09 PHP
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
神盾加密解密教程(二)PHP 神盾解密
2014/06/08 PHP
PHP编写daemon process 实例详解
2016/11/13 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
2008/12/25 Javascript
javascript 设置某DIV区域内的checkbox复选框
2009/11/30 Javascript
jQuery 性能优化手册 推荐
2010/02/23 Javascript
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
js调用AJAX时Get和post的乱码解决方法
2013/06/04 Javascript
HTML页面滚动时获取离页面顶部的距离2种实现方法
2013/09/05 Javascript
Nodejs+express+html5 实现拖拽上传
2014/08/08 NodeJs
JavaScript中检查对象property的存在性方法介绍
2014/12/30 Javascript
详解AngularJS ui-sref的简单使用
2017/04/24 Javascript
vue中将网页打印成pdf实例代码
2017/06/15 Javascript
vue实现跳转接口push 转场动画示例
2019/11/01 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
2020/01/21 Javascript
JS异步宏队列微队列原理详解
2020/09/09 Javascript
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
python基础教程之缩进介绍
2014/08/29 Python
python图片验证码生成代码
2016/07/02 Python
详解如何使用Python编写vim插件
2017/11/28 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
pandas中ix的使用详细讲解
2020/03/09 Python
Pandas DataFrame求差集的示例代码
2020/12/13 Python
html5视频常用API接口的实战示例
2020/03/20 HTML / CSS
牵手50香港:专为黄金岁月的单身人士而设的交友网站
2020/08/14 全球购物
垃圾回收的优点和原理
2014/05/16 面试题
小学防溺水制度
2014/01/29 职场文书
简历的自我评价范文
2014/02/04 职场文书
企业精细化管理实施方案
2014/03/23 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
财政局党的群众路线教育实践活动整改方案
2014/09/21 职场文书
如何用Navicat操作MySQL
2021/05/12 MySQL
用python修改excel表某一列内容的操作方法
2021/06/11 Python