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 相关文章推荐
python3.0 字典key排序
Dec 24 Python
极简的Python入门指引
Apr 01 Python
Python列表切片用法示例
Apr 19 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
Oct 13 Python
Win8下python3.5.1安装教程
Jul 29 Python
Tensorflow分类器项目自定义数据读入的实现
Feb 05 Python
win8.1安装Python 2.7版环境图文详解
Jul 01 Python
python自带tkinter库实现棋盘覆盖图形界面
Jul 17 Python
Python 批量刷博客园访问量脚本过程解析
Aug 30 Python
Python3实现配置文件差异对比脚本
Nov 18 Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 Python
Python实现粒子群算法的示例
Feb 14 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使用pack处理二进制文件的方法
2014/07/03 PHP
javascript 图片上传预览-兼容标准
2009/06/01 Javascript
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
关于JavaScript的面向对象和继承有利新手学习
2013/01/11 Javascript
js history对象简单实现返回和前进
2013/10/30 Javascript
用于deeplink的js方法(判断手机是否安装app)
2014/04/02 Javascript
AngularJS内置指令
2015/02/04 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
详解javascript中原始数据类型Null和Undefined
2015/12/17 Javascript
JavaScript模版引擎的基本实现方法浅析
2016/02/15 Javascript
js拖拽的原型声明和用法总结
2016/04/04 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
JavaScript表单验证的两种实现方法
2017/02/11 Javascript
jQuery中的on与bind绑定事件区别实例详解
2017/02/28 Javascript
jquery实现异步加载图片(懒加载图片一种方式)
2017/04/24 jQuery
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
Django使用多数据库的方法
2017/09/06 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
layerUI下的绑定事件实例代码
2018/08/17 Javascript
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
2019/09/25 Javascript
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
2020/05/25 Javascript
Openlayers实现扩散的动态点(水纹效果)
2020/08/17 Javascript
python有证书的加密解密实现方法
2014/11/19 Python
Python中的类与对象之描述符详解
2015/03/27 Python
python实现学生管理系统
2018/01/11 Python
dataframe设置两个条件取值的实例
2018/04/12 Python
使用Python处理Excel表格的简单方法
2018/06/07 Python
3种python调用其他脚本的方法
2020/01/06 Python
python字典key不能是可以是啥类型
2020/08/04 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
2021/02/20 Python
新加坡最受追捧的体验平台:Hapz
2018/01/01 全球购物
日本亚马逊官方网站:Amazon.co.jp
2020/04/14 全球购物
幼儿园户外活动总结
2014/07/04 职场文书
少先队入队仪式主持词
2015/07/04 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书