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 urlin prev_resultsand 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编写一个基于终端的实现翻译的脚本
Apr 24 Python
python中的字典使用分享
Jul 31 Python
python入门教程之识别验证码
Mar 04 Python
Python实现通过文件路径获取文件hash值的方法
Apr 29 Python
python中 chr unichr ord函数的实例详解
Aug 06 Python
django之session与分页(实例讲解)
Nov 13 Python
Python使用base64模块进行二进制数据编码详解
Jan 11 Python
Python实现多属性排序的方法
Dec 05 Python
Django中使用 Closure Table 储存无限分级数据
Jun 06 Python
基于python traceback实现异常的获取与处理
Dec 13 Python
python中用Scrapy实现定时爬虫的实例讲解
Jan 18 Python
详解matplotlib绘图样式(style)初探
Feb 03 Python
利用python批量检查网站的可用性
Sep 09 #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
You might like
十天学会php之第四天
2006/10/09 PHP
优化PHP代码的53条建议
2008/03/27 PHP
php 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
checkbox 多选框 联动实现代码
2008/10/22 Javascript
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
2015/09/27 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
jQuery中的100个技巧汇总
2016/12/15 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
原生js封装运动框架的示例讲解
2017/10/01 Javascript
javascript修改浏览器title方法 JS动态修改浏览器标题
2017/11/30 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
Node.js中的cluster模块深入解读
2018/06/11 Javascript
基于node简单实现RSA加解密的方法步骤
2019/03/21 Javascript
layui富文本编辑器前端无法取值的解决方法
2019/09/18 Javascript
vue.js的状态管理vuex中store的使用详解
2019/11/08 Javascript
vue中解决拖拽改变存在iframe的div大小时卡顿问题
2020/07/22 Javascript
python常见数制转换实例分析
2015/05/09 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
2016/01/20 Python
Django-xadmin+rule对象级权限的实现方式
2020/03/30 Python
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
eBay法国购物网站:eBay.fr
2017/10/21 全球购物
Raffaello Network西班牙:意大利拉斐尔时尚购物网
2019/03/12 全球购物
Zalando Lounge瑞士:时尚与生活方式购物俱乐部
2020/03/12 全球购物
Whistles官网:英国女装品牌
2020/08/14 全球购物
毕业生个人求职的自我评价
2013/10/28 职场文书
少先队学雷锋活动月总结
2014/03/09 职场文书
租房合同协议书
2014/04/09 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
树转促学习心得体会
2014/09/10 职场文书
岁月神偷观后感
2015/06/11 职场文书
Nginx禁止ip访问或非法域名访问
2022/04/07 Servers