利用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中sets模块的用法实例
Sep 30 Python
Python socket C/S结构的聊天室应用实现
Nov 30 Python
Python的__builtin__模块中的一些要点知识
May 02 Python
Python检测字符串中是否包含某字符集合中的字符
May 21 Python
Python基于DES算法加密解密实例
Jun 03 Python
Python切片操作实例分析
Mar 16 Python
python爬取cnvd漏洞库信息的实例
Feb 14 Python
Python 脚本实现淘宝准点秒杀功能
Nov 13 Python
解决django model修改添加字段报错的问题
Nov 18 Python
pytorch:model.train和model.eval用法及区别详解
Feb 20 Python
Python结合Window计划任务监测邮件的示例代码
Aug 05 Python
Pycharm配置autopep8实现流程解析
Nov 28 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
虫族 Zerg 热键控制
2020/03/14 星际争霸
PHP语法速查表
2006/12/06 PHP
php实现的百度搜索某地天气的小偷代码
2014/04/23 PHP
php准确计算复活节日期的方法
2015/04/18 PHP
Laravel 数据库加密及数据库表前缀配置方法
2019/10/10 PHP
网络图片延迟加载实现代码 超越jquery控件
2010/03/27 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
2011/10/31 Javascript
JS等比例缩小图片尺寸的实例
2013/02/27 Javascript
jQuery源码分析之jQuery中的循环技巧详解
2014/09/06 Javascript
jQuery 实现自动填充邮箱功能(带下拉提示)
2014/10/14 Javascript
JS继承用法实例分析
2015/02/05 Javascript
浅谈regExp的test方法取得的值变化的原因及处理方法
2017/03/01 Javascript
js如何获取网页所有图片
2017/05/12 Javascript
vue2.0学习之axios的封装与vuex介绍
2018/05/28 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
微信小程序遍历Echarts图表实现多个饼图
2019/04/25 Javascript
使用React代码动态生成栅格布局的方法
2020/05/24 Javascript
Element Notification通知的实现示例
2020/07/27 Javascript
Python打包文件夹的方法小结(zip,tar,tar.gz等)
2016/09/18 Python
python用户管理系统
2018/03/13 Python
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
python pandas中DataFrame类型数据操作函数的方法
2018/04/08 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
python3.7 的新特性详解
2019/07/25 Python
Python assert语句的简单使用示例
2019/07/28 Python
Python创建数字列表的示例
2019/11/28 Python
Python3 实现爬取网站下所有URL方式
2020/01/16 Python
关于Tensorflow使用CPU报错的解决方式
2020/02/05 Python
JupyterNotebook 输出窗口的显示效果调整实现
2020/09/22 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
HTML5之语义标签介绍
2016/07/07 HTML / CSS
详解如何解决H5开发使用wx.hideMenuItems无效果不生效
2021/01/20 HTML / CSS
四年的个人工作自我评价
2013/12/10 职场文书
课外科技活动总结
2014/08/27 职场文书
如何判断pytorch是否支持GPU加速
2021/06/01 Python