利用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生成pdf文件的方法
Aug 04 Python
Python的Django框架中的select_related函数对QuerySet 查询的优化
Apr 01 Python
Python脚本实现格式化css文件
Apr 08 Python
Python实现字典按照value进行排序的方法分析
Dec 23 Python
Python动刷新抢12306火车票的代码(附源码)
Jan 24 Python
Django Web开发中django-debug-toolbar的配置以及使用
May 06 Python
python 获取页面表格数据存放到csv中的方法
Dec 26 Python
python 通过可变参数计算n个数的乘积方法
Jun 13 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
Aug 15 Python
python对常见数据类型的遍历解析
Aug 27 Python
Java如何基于wsimport调用wcf接口
Jun 17 Python
python not运算符的实例用法
Jun 30 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 eval()函数定义和用法
2016/06/21 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
javascript中对对层的控制
2006/12/29 Javascript
javascritp实现input输入框相关限制用法
2007/06/29 Javascript
直接生成打开窗口代码,不必下载
2008/05/14 Javascript
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
使用jquery hover事件实现表格的隔行换色功能示例
2013/09/03 Javascript
jQuery实现可收缩展开的级联菜单实例代码
2013/11/27 Javascript
7个JS基础知识总结
2014/03/05 Javascript
js 动态修改css文件用到了cssRule
2014/08/20 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
2016/10/31 Javascript
JS类的定义与使用方法深入探索
2016/11/26 Javascript
详解百度百科目录导航树小插件
2017/01/08 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
vue 引入公共css文件的简单方法(推荐)
2018/01/20 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
[00:34]DOTA2上海特级锦标赛 Spirit战队宣传片
2016/03/04 DOTA
跟老齐学Python之玩转字符串(2)
2014/09/14 Python
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
Python关于excel和shp的使用在matplotlib
2019/01/03 Python
anaconda如何查看并管理python环境
2019/07/05 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
Django 后台带有字典的列表数据与页面js交互实例
2020/04/03 Python
Python dict的常用方法示例代码
2020/06/23 Python
Python存储读取HDF5文件代码解析
2020/11/25 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
css3 中translate和transition的使用方法
2020/03/26 HTML / CSS
HTML5 背景的显示区域实现
2020/07/09 HTML / CSS
荷兰皇家航空公司中国官网:KLM中国
2017/12/13 全球购物
寄语学生的话
2014/04/10 职场文书
公司门卫岗位职责
2015/04/13 职场文书
Java新手教程之ArrayList的基本使用
2021/06/20 Java/Android
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers