2016年最长的假期也过了,这周连上7天班,之前还觉得挺恐怖,没想到这周真是要忙死的节凑,还真没觉得多漫长,一晃明天就周五了,干运维的就是突发的事情多,冷不丁的不知道哪里就冒出个问题,就够搞半天的,最近领导有一批站点,需要检测这些站点是否重定向到了其它url上,因为站点太多,这种事就只能通过脚本来实现了,当然我还是用个人最喜欢的request模块来完成这个任务,基本原理就是判断站点返回的status_code,如果是3XX,就认为是重定向了,当然还有其它情况,比如访问超时,域名解析错误,网络错误等,也要做基本的判断,最起码要能报出来,需要检测的站点放到了一个文件里,因为站点收集的格式不统一,就做了简单的判断,如果不是以http开通的,就加上http,拼接成完整的url,整个脚本如下:
#!/usr/bin/env python
import sys
import requests
def check_for_redirects(url):
try:
r = requests.get(url, allow_redirects=False, timeout=0.5)
if 300 <= r.status_code < 400:
return r.headers['location']
else:
return '[no redirect]'
except requests.exceptions.Timeout:
return '[timeout]'
except requests.exceptions.ConnectionError:
return '[connection error]'
def check_domains(urls):
for url in urls:
url_to_check = url if url.startswith('http') else "http://%s" % url
redirect_url = check_for_redirects(url_to_check)
print("%s => %s" % (url_to_check, redirect_url))
if __name__ == '__main__':
fname = 'domains.txt'
try:
fname = sys.argv[1]
except IndexError:
pass
urls = (l.strip() for l in open(fname).readlines())
check_domains(urls)
脚本就定义了2个函数,一个是负责检查结果的返回,一个从文件读取url,主要是根据r.status_code的返回值来进行判断,这个在开通已经说过了,就不在重复了,其它部分也很好理解,如有不明白的可以给我留言。