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

发布时间:2019-09-07 07:56:38编辑:auto阅读(2626)

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

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    import urllib2
    from urllib2 import URLError
    
    result_url=[]
    count=0
    not_200=0
    f=open("img1.txt","r")
    img_not_200=open("img_not_200.txt","w+")
    
    for line in f:
        count+=1
        print "on scanning ",count
        try:
        	response=urllib2.urlopen(line)
        except URLError, e:
        	if hasattr(e,'reason'): #stands for URLError
        		print "can not reach a server,writing..."
        		result_url.append(line)
        		not_200+=1
        		img_not_200.write(line)
        		print "write url success!"
        	elif hasattr(e,'code'): #stands for HTTPError
        		print "find http error, writing..."
        		result_url.append(line)
        		not_200+=1
        		img_not_200.write(line)
        		print "write url success!"
        	else: #stands for unknown error
        		print "unknown error, writing..."
        		result_url.append(line)
        		not_200+=1
        		img_not_200.write(line)
        		print "write url success!"
        else:
        	#print "url is reachable!"
        	#else 中不用再判断 response.code 是否等于200,若没有抛出异常,肯定返回200,直接关闭即可
        	response.close()
        finally:
        	pass
    
    print "scanning over,total",count,"; did not response 200:",not_200
    f.close()
    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,否则的话,你懂的。。

关键字