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的返回值來進行判斷,這個在開通已經說過了,就不在重復了,其它部分也很好理解,如有不明白的可以給我留言。