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中文问题解决方法(总结了多位前人经验,初学者必看)
Mar 13 Python
用Python实现web端用户登录和注册功能的教程
Apr 30 Python
Python回文字符串及回文数字判定功能示例
Mar 20 Python
pandas 两列时间相减换算为秒的方法
Apr 20 Python
老生常谈python中的重载
Nov 11 Python
解决Python pandas plot输出图形中显示中文乱码问题
Dec 12 Python
使用Python检测文章抄袭及去重算法原理解析
Jun 14 Python
Win10+GPU版Pytorch1.1安装的安装步骤
Sep 27 Python
解决Django no such table: django_session的问题
Apr 07 Python
python之随机数函数的实现示例
Dec 30 Python
Python 实现RSA加解密文本文件
Dec 30 Python
PyCharm 解决找不到新打开项目的窗口问题
Jan 15 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生成带有雪花背景的验证码
2008/09/28 PHP
解析php中static,const与define的使用区别
2013/06/18 PHP
PHP正则验证Email的方法
2015/06/15 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
javascript实现的多个层切换效果通用函数实例
2015/07/06 Javascript
Javascript验证方法大全
2015/09/21 Javascript
jquery遍历json对象集合详解
2016/05/18 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
vue之nextTick全面解析
2017/05/17 Javascript
详解nodejs实现本地上传图片并预览功能(express4.0+)
2017/06/28 NodeJs
使用Node.js实现RESTful API的示例
2017/08/01 Javascript
js实现手机web图片左右滑动效果
2017/12/29 Javascript
bootstrap下拉框动态赋值方法
2018/08/10 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
Vue+Spring Boot简单用户登录(附Demo)
2020/11/12 Javascript
[01:55]《走出家门看比赛》——DOTA2 2015国际邀请赛同城线下观战
2015/07/18 DOTA
Python中Django框架利用url来控制登录的方法
2015/07/25 Python
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
Python中列表list以及list与数组array的相互转换实现方法
2017/09/22 Python
Python tornado队列示例-一个并发web爬虫代码分享
2018/01/09 Python
python解压TAR文件至指定文件夹的实例
2019/06/10 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
python的mysql数据库建立表与插入数据操作示例
2019/09/30 Python
浅析python内置模块collections
2019/11/15 Python
利用python实现凯撒密码加解密功能
2020/03/31 Python
H5 meta小结(前端必看篇)
2016/08/24 HTML / CSS
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
美国派对用品及装饰品网上商店:Shindigz
2016/07/30 全球购物
美国殿堂级滑板、冲浪、滑雪服装品牌:Volcom(钻石)
2017/04/20 全球购物
经典演讲稿汇总
2014/05/19 职场文书
小学班主任经验交流材料
2014/12/16 职场文书