2016年最长的假期也过了,这周连上7天班,之前还觉得挺恐怖,没想到这周真是要忙死的节凑,还真没觉得多漫长,一晃明天就周五了,干运维的就是突发的事情多,冷不丁的不知道哪里就冒出个问题,就够搞半天的,最近领导有一批站点,需要检测这些站点是否重定向到了其它url上,因为站点太多,这种事就只能通过脚本来实现了,当然我还是用个人最喜欢的request模块来完成这个任务,基本原理就是判断站点返回的status_code,如果是3XX,就认为是重定向了,当然还有其它情况,比如访问超时,域名解析错误,网络错误等,也要做基本的判断,最起码要能报出来,需要检测的站点放到了一个文件里,因为站点收集的格式不统一,就做了简单的判断,如果不是以http开通的,就加上http,拼接成完整的url,整个脚本如下:
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 |
#!/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的返回值来进行判断,这个在开通已经说过了,就不在重复了,其它部分也很好理解,如有不明白的可以给我留言。