Python实现的检测web服务器健康状况的小程序

python urllib如何获取http状态码

f=urllib.urlopen("xxxxxx")

print f.getcode() #这就是获取返回的状态码 404 200等

python 服务器状态探测3种方法


1、 关键字分析 
import os 
#https网站加-k
cmd = ''' (curl --no-keepalive --connect-timeout 18 --stderr - '''+urls[i]+''' | grep '''+urls[i+1]+''' >/dev/null) && echo 'ok' '''
os.popen3(cmd) 

2、 http head状态测试
import urllib2
 try:
       urllib2.urlopen(urls[i],context=context)
  except Exception, e:
... 

3、端口探测
import os 
cmd="nmap -sT -n -p 80,3389 --max-rtt-timeout 1 --max-scan-delay 1ms --host-timeout 2 " + server
(si, so, se) = os.popen3(cmd) 
t=so.readlines() 

if line.find('80')>=0 and line.find('open')>=0:
...  

Python中获取网页状态码的两个方法

第一种是用urllib模块,下面是例示代码:

复制代码 代码如下:

import urllib
status=urllib.urlopen("http://www.jb51.net").code
print status

第二章是用requests模块,下面是例示代码:

复制代码 代码如下:

import requests
code=requests.get("http://www.jb51.net").status_code
print code



对web服务器做健康检查,一般我们都是用curl库(不管是php,perl的还是shell的),大致的方法一致:

代码如下:

curl -I -s www.qq.com  |head -1|awk '{ health = $2=="200"?"server is ok":"server is bad"}END{print health}'
server is ok

说白了这些方式都是封装了curl库的,另外还有一些关于http的模块,例如perl的LWP,python的httplib,urllib或者urllib2 也可以去实现,今天就走的比较低级一些,就使用socket方式来进行一次检测:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/env python
#coding=utf8
  
"""
使用socket方式来检查服务器的监控状况
"""
  
from optparse import OptionParser
  
import socket
  
import sys
  
import re
  
from StringIO import StringIO
  
class check_server:
   """
   该类主要是利用socket建立一个连接以后,发送一个http请求,然后根据返回的状态码,判断主机的健康状况
   """
   def __init__( self ,address,port,resource):
     self .address = address
     self .port = port
     self .resource = resource
  
  
   def check( self ):
     """
     该方法也是该类的主要方法,包括构建请求资源,解析返回结果等
     """
     if not self .resource.startswith( '/' ):
       self .resource = '/' + self .resource
  
     request = "GET %s HTTP/1.1\r\nHost:%s\r\n\r\n" % ( self .resource, self .address)
  
     #建立一个socket连接
  
     s = socket.socket()
     #设置连接超时时间
     s.settimeout( 10 )
  
     print "现在开始对 %s 上的 %s 端口连接......" % ( self .address, self .port)
  
     try :
       s.connect(( self .address, self .port))
       print "连接 %s 上端口 %s 成功" % ( self .address, self .port)
       s.send(request)
       response = s.recv( 100 )
  
     except socket.error,e:
       print "连接%s 上端口 %s 失败 ,原因为:%s" % ( self .address, self .port,e)
       return False
     finally :
       print "关闭连接"
       s.close()
  
  
     line = StringIO(response).readline()
  
     try :
       (http_version,status,messages) = re.split(r '\s+' ,line, 2 )
     except ValueError:
       print "分割响应码失败"
       return False
     print "返回的状态码是%s" % (status)
  
     if status in [ '200' , '301' , '302' ]:
  
       print "服务器的监控状况良好"
     else :
  
       print "乖乖,赶快上线看看,咋回事"
  
  
if __name__ = = '__main__' :
   """
   处理参数
   """
   parser = OptionParser()
   parser.add_option( "-a" , "--address" ,dest = "address" ,default = 'localhost' , help = "要检查主机的地址或者主机名" )
   parser.add_option( '-p' , '--port' ,dest = "port" , type = int ,default = 80 , help = "要检查主机的端口" )
   parser.add_option( '-r' , '--resource' ,dest = "resource" ,default = "/" , help = "要检查的资源,比如" )
   (options,args) = parser.parse_args()
  
#开始检测鸟
checks = check_server(options.address,options.port,options.resource)
  
checks.check()

看下效果

如对本文有疑问,请提交到交流社区,广大热心网友会为你解答!! 点击进入社区


使用python批量检查url的有效性


因为工作需要,之前用python写了一些批量校验url有效性的小脚本,但并不全面,健壮性较差,现把之整理一下,代码如下:

[python]  view plain  copy
  1. #!/usr/bin/python  
  2. # -*- coding:utf-8 -*-  
  3.   
  4. import urllib2  
  5. from urllib2 import URLError  
  6.   
  7. result_url=[]  
  8. count=0  
  9. not_200=0  
  10. f=open("img1.txt","r")  
  11. img_not_200=open("img_not_200.txt","w+")  
  12.   
  13. for line in f:  
  14.     count+=1  
  15.     print "on scanning ",count  
  16.     try:  
  17.         response=urllib2.urlopen(line)  
  18.     except URLError, e:  
  19.         if hasattr(e,'reason'): #stands for URLError  
  20.             print "can not reach a server,writing..."  
  21.             result_url.append(line)  
  22.             not_200+=1  
  23.             img_not_200.write(line)  
  24.             print "write url success!"  
  25.         elif hasattr(e,'code'): #stands for HTTPError  
  26.             print "find http error, writing..."  
  27.             result_url.append(line)  
  28.             not_200+=1  
  29.             img_not_200.write(line)  
  30.             print "write url success!"  
  31.         else#stands for unknown error  
  32.             print "unknown error, writing..."  
  33.             result_url.append(line)  
  34.             not_200+=1  
  35.             img_not_200.write(line)  
  36.             print "write url success!"  
  37.     else:  
  38.         #print "url is reachable!"  
  39.         #else 中不用再判断 response.code 是否等于200,若没有抛出异常,肯定返回200,直接关闭即可  
  40.         response.close()  
  41.     finally:  
  42.         pass  
  43.   
  44. print "scanning over,total",count,"; did not response 200:",not_200  
  45. f.close()  
  46. img_not_200.close()  

对这段代码解析如下:

如果url有效,则可以正常通过urlopen取到response,并且response.getcode()等于200;

但若url无效,无论是无法找到服务器还是其他http错误,都无法通过urlopen返回response。这个时候,就需要通过返回的错误类型来判断错误到底是url错误还是http错误。上面的程序是通过错误类型所拥有的属性来判断的。如果错误类型有“code”属性,则代表错误是HTTPError;如果属性有“reason”,则代表是URLError错误。

当然,也可以在except中分别指定抛出的错误类型,进而进行不同的处理。所要注意的是,因为HTTPError是URLError的子类,所以必须在第一个except中指定捕获HTTPError,第二个except中指定捕获URLError,否则的话,你懂的。。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值