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编写抓取网页和只抓网页图片的脚本
Aug 20 Python
Python中内置数据类型list,tuple,dict,set的区别和用法
Dec 14 Python
python实现二叉树的遍历
Dec 11 Python
python将文本中的空格替换为换行的方法
Mar 19 Python
使用Python将Mysql的查询数据导出到文件的方法
Feb 25 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
Apr 15 Python
python中时间、日期、时间戳的转换的实现方法
Jul 06 Python
python hash每次调用结果不同的原因
Nov 21 Python
python groupby 函数 as_index详解
Dec 16 Python
pytorch中的inference使用实例
Feb 20 Python
python/golang 删除链表中的元素
Sep 14 Python
python中yield的用法详解
Jan 13 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防注入类实例
2014/12/05 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
php mysql 封装类实例代码
2016/09/18 PHP
PHP递归遍历指定文件夹内的文件实现方法
2016/11/15 PHP
用JS实现一个页面多个css样式实现
2008/05/29 Javascript
javascript定时保存表单数据的代码
2011/03/17 Javascript
jQuery之网页换肤实现代码
2011/04/30 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
Nodejs如何复制文件
2016/03/09 NodeJs
15款最好的Bootstrap在线编辑器
2016/08/03 Javascript
Angular 2父子组件之间共享服务通信的实现
2017/07/04 Javascript
JavaScrip关于创建常量的知识点
2017/12/07 Javascript
详解js的视频和音频采集
2018/08/09 Javascript
使用JQuery自动完成插件Auto Complete详解
2019/06/18 jQuery
JS监听组合按键思路及实现过程
2020/04/17 Javascript
vue页面引入three.js实现3d动画场景操作
2020/08/10 Javascript
JavaScript 实现继承的几种方式
2021/02/19 Javascript
Python编程中的反模式实例分析
2014/12/08 Python
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
python开发之基于thread线程搜索本地文件的方法
2015/11/11 Python
Python实现选择排序
2017/06/04 Python
Python中logging实例讲解
2019/01/17 Python
使用Python将Mysql的查询数据导出到文件的方法
2019/02/25 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
2021/03/04 Python
HTML5公共页面提取作为公用代码的方法
2020/06/30 HTML / CSS
伊莱克斯阿根廷网上商店:Tienda Electrolux
2021/03/08 全球购物
教师应聘个人求职信
2013/12/10 职场文书
婚礼证婚人证婚词
2014/01/13 职场文书
安全生产工作汇报
2014/10/28 职场文书
餐馆开业致辞
2015/08/01 职场文书
初一语文教学反思
2016/03/03 职场文书
Laravel中获取IP的真实地理位置
2021/04/01 PHP
解决Python保存文件名太长OSError: [Errno 36] File name too long
2022/05/11 Python