利用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字典简介以及用法详解
Nov 15 Python
python 按照固定长度分割字符串的方法小结
Apr 30 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
Jun 20 Python
Python面向对象之类和对象属性的增删改查操作示例
Dec 14 Python
对python读取CT医学图像的实例详解
Jan 24 Python
Python jieba库用法及实例解析
Nov 04 Python
windows下python安装pip方法详解
Feb 10 Python
Django实现列表页商品数据返回教程
Apr 03 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
Apr 03 Python
基于Python+QT的gui程序开发实现
Jul 03 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
Sep 01 Python
selenium如何定位span元素的实现
Jan 13 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函数extension_loaded()用法实例
2015/01/19 PHP
php中define用法实例
2015/07/30 PHP
我整理的PHP 7.0主要新特性
2016/01/07 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
Javascript学习笔记二 之 变量
2010/12/15 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
JavaScript分析、压缩工具JavaScript Analyser
2014/12/31 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
2016/05/09 Javascript
老生常谈javascript变量的命名规范和注释
2016/09/29 Javascript
一个简单的node.js界面实现方法
2018/06/01 Javascript
Vue使用.sync 实现父子组件的双向绑定数据问题
2019/04/04 Javascript
一百行JS代码实现一个校验工具
2019/04/30 Javascript
vue中引入mxGraph的步骤详解
2019/05/17 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
python脚本和网页有何区别
2020/07/02 Python
pandas参数设置的实用小技巧
2020/08/23 Python
python 获取字典键值对的实现
2020/11/12 Python
Html5内唤醒百度、高德APP的实现示例
2019/05/20 HTML / CSS
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
英国打印机墨盒销售网站:Ink Factory
2019/10/07 全球购物
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
KOHLER科勒美国官网:国际著名卫浴橱柜领先品牌
2020/06/27 全球购物
迟到检讨书900字
2014/01/14 职场文书
省优秀教师事迹材料
2014/01/30 职场文书
土木工程师职业规划范文
2014/03/07 职场文书
读书活动实施方案
2014/03/10 职场文书
社保代办委托书怎么写
2014/10/06 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
教师读书活动心得体会
2016/01/14 职场文书
golang import自定义包方式
2021/04/29 Golang
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android
三种方式清除vue路由跳转router-link的历史记录
2022/04/10 Vue.js