利用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 远程统计文件代码分享
May 14 Python
Python基于smtplib实现异步发送邮件服务
May 28 Python
python调用fortran模块
Apr 08 Python
Python画柱状统计图操作示例【基于matplotlib库】
Jul 04 Python
对Python实现累加函数的方法详解
Jan 23 Python
python操作日志的封装方法(两种方法)
May 23 Python
Django 批量插入数据的实现方法
Jan 12 Python
python 项目目录结构设置
Feb 14 Python
详解python环境安装selenium和手动下载安装selenium的方法
Mar 17 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
Apr 23 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
Jun 29 Python
Django windows使用Apache实现部署流程解析
Oct 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
js Html结构转字符串形式显示代码
2011/11/15 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
jQuery中removeAttr()方法用法实例
2015/01/05 Javascript
Node.js文件操作方法汇总
2016/03/22 Javascript
BootStrap智能表单实战系列(三)分块表单配置详解
2016/06/13 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
深入nodejs中流(stream)的理解
2017/03/27 NodeJs
Vue表单验证插件的制作过程
2017/04/01 Javascript
微信小程序页面开发注意事项整理
2017/05/18 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
jQuery中库的引用方法
2018/01/06 jQuery
vue-lazyload图片延迟加载插件的实例讲解
2018/02/09 Javascript
vue forEach循环数组拿到自己想要的数据方法
2018/09/21 Javascript
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
[01:05:36]VP vs TNC Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
python网络编程学习笔记(四):域名系统
2014/06/09 Python
Python logging管理不同级别log打印和存储实例
2018/01/19 Python
python 自定义异常和异常捕捉的方法
2018/10/18 Python
Python 控制终端输出文字的实例
2019/07/12 Python
Python实现仿射密码的思路详解
2020/04/23 Python
Python从MySQL数据库中面抽取试题,生成试卷
2021/01/14 Python
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
高品质和独特的产品世界:Creations and Collections
2018/01/07 全球购物
香港家用健身器材、运动器材及健康美容仪器专门店:FitBoxx
2019/12/05 全球购物
Java软件工程师综合面试题笔试题
2013/09/08 面试题
大学自主招生自荐信
2013/12/16 职场文书
优秀毕业生求职信范文
2014/01/02 职场文书
运动会入场词200字
2014/02/15 职场文书
弘扬雷锋精神演讲稿
2014/05/10 职场文书
法律讲堂观后感
2015/06/11 职场文书
2016猴年春节慰问信
2015/11/30 职场文书
你有一份《诚信考试承诺书》待领取
2019/11/13 职场文书
JS Canvas接口和动画效果大全
2021/04/29 Javascript
MySQL删除和插入数据很慢的问题解决
2021/06/03 MySQL
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
2021/10/16 Python