利用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的Django框架中的select_related函数对QuerySet 查询的优化
Apr 01 Python
Python的面向对象编程方式学习笔记
Jul 12 Python
Python可变参数用法实例分析
Apr 02 Python
Python内置函数delattr的具体用法
Nov 23 Python
python 删除指定时间间隔之前的文件实例
Apr 24 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
May 11 Python
python3.x实现base64加密和解密
Mar 28 Python
解决Django连接db遇到的问题
Aug 29 Python
python实现大学人员管理系统
Oct 25 Python
关于TensorFlow新旧版本函数接口变化详解
Feb 10 Python
如何使用Python调整图像大小
Sep 26 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
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
咖啡知识 咖啡养豆要养多久 排气又是什么
2021/03/06 新手入门
php获取网页上所有链接的方法
2015/04/03 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
js取float型小数点后两位数的方法
2014/01/18 Javascript
js判断某个方法是否存在实例代码
2015/01/10 Javascript
使用Chrome浏览器调试AngularJS应用的方法
2015/06/18 Javascript
jquery仅用6行代码实现滑动门效果
2015/09/07 Javascript
JS+Canvas绘制时钟效果
2020/08/20 Javascript
浅谈angularjs module返回对象的坑(推荐)
2016/10/21 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
微信小程序使用modal组件弹出对话框功能示例
2017/11/29 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
2017/12/15 Javascript
用最少的JS代码写出贪吃蛇游戏
2018/01/12 Javascript
关于jquery中attr()和prop()方法的区别
2018/05/28 jQuery
nodejs同步调用获取mysql数据时遇到的大坑
2019/03/02 NodeJs
详解如何在vue+element-ui的项目中封装dialog组件
2020/12/11 Vue.js
[02:28]DOTA2英雄基础教程 灰烬之灵
2013/12/19 DOTA
python读写ini文件示例(python读写文件)
2014/03/25 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
Python面向对象之继承原理与用法案例分析
2019/12/31 Python
Python matplotlib可视化实例解析
2020/06/01 Python
Python创建临时文件和文件夹
2020/08/05 Python
html5 canvas实现圆形时钟代码分享
2013/12/25 HTML / CSS
印度网上药店:1mg
2017/10/13 全球购物
如何用Lucene索引数据库
2016/02/23 面试题
夜不归宿检讨书
2014/02/25 职场文书
请假条标准格式规范
2014/04/10 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
简单租房协议书
2014/10/21 职场文书
服务明星事迹材料
2014/12/29 职场文书
公司奖励通知
2015/04/21 职场文书
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
2021/07/26 Java/Android
Spring Boot项目传参校验的最佳实践指南
2022/04/05 Java/Android