目的
這次我們希望透過 Python 來獲取網域註冊的資料,從而提醒我們作網域註冊續訂並監測網站的健康。
網域註冊與續訂
如果您有自己的網域(Domain),那麼您對網域註冊應該不太陌生。
簡單而言,每一個網域都在互聯網名稱與數字地址分配機構(ICANN)裡存有網域註冊的資料。其中一個最令我們感興趣的,是我們註冊的網域何時需要續訂(Renew)。
每個網域的註冊期為 1 至 10 年。如果我們未能在網域註冊到期(Expiration)前續訂,那麼我們或會失去這個網域,不能繼續使用。
有關網域的詳情可以按此參考:註冊人常見問題解答:域名到期與續訂
使用到的 Library:python-whois
我們今次特別使用到 python-whois 這一個 Python Library。這個 Library 簡單而言是一個存取 ICANN 數據庫的幫手。
如果您曾經留意過網域註冊資料,您或者會知道這個瀏覽網域資料的工具:https://lookup.icann.org/。python-whois 就是一個存取這個工具數據的 Python Library。
在 ICANN 的 Lookup 工具中,我們可以輸入任意的網域。這次我們查詢有關 pythonviz.com 的資料,並按一下 「Lookup」鍵。
查詢回傳的資料重點是 Nameservers、Registry Expiration 、Registrar Information。
回傳資料 | 內容 |
---|---|
Nameservers | 代表您的 DNS 紀錄提供者。通常是您的網域註冊商(Registrar),但使用 CDN 的朋友會設定成例如 Cloudflare 等的地址。 |
Registry Expiration | 這是我們最感興趣的項目,代表這個網域註冊何時過期。如果我們過了 Expiration 還沒續期,那麼我們將失去這個網域。 |
Registrar Information | 代表您的網域註冊商,他們代理我們的網域註冊。我們需要向他們申請網域續約。 |
第一步:匯入所需 Library
我們教學會使用到 Google Colab Notebook,是一個免安裝、在瀏覽器上使用的 Python 編程工具。詳情可以看看我們這篇教學:新手 1/3:5 分鐘免安裝學習 Python?Google Colab Notebook 幫緊您!
!pip install python-whois import whois import pandas as pd from datetime import datetime import requests from pprint import pprint
我們這次會使用到 python-whois、pandas、datetime、requests 和 pprint。由於 Google Colab 的預設環境沒有 python-whois,我們先使用 pip 安裝。
第二步:單一網域註冊查詢
print('網域回傳:',requests.get('https://pythonviz.com').status_code,'\n\n') print('ICANN 註冊資料:') pprint(whois.whois('pythonviz.com'),width=1)
我們先來學習一下網域註冊的資料回傳。
Python 代碼 | 回傳 |
---|---|
requests.get().status_code | 這個回傳是一個整數(int),代表網站的 HTML Request 輸出的編碼。通常 200 代表網站健康,404、502 等編碼代表找不到網站。我們使用這個來測試網站是否健康,還是有問題。 |
whois.whois() | 這個回傳一個字典(dictionary),代表 ICANN 查詢的網域註冊資料。留意我們重點需要 expiration_date、registrar 的資料。 |
第三步:多個網域查詢
定義一個列表
domains = [ 'pythonviz.com', 'porkbun.com' ]
首先我們定義 domains 這一個列表,方便我們之後直接加入新的網域便可以使用。
定義 domainStatus 功能
def domainStatus(domain): code = requests.get('https://' + domain).status_code if code == 200: state = '🟢' else: state = '🔴' return state + ' ' + str(code)
我們再定義一個自訂功能(Function),用以識別 HTML Request 輸出的編碼。
如果網站是健康的,我們回傳「🟢 200」,否則回傳「🔴 404」等的編碼。
定義 getWHOISData 功能
def getWHOISData(domains:list): w = [whois.whois(d) for d in domains] df = pd.DataFrame.from_records(w) df['live'] = datetime.now() - df['creation_date'] df['remaining'] = df['expiration_date'] - datetime.now() for x in ['live','remaining']: df[x] = df[x].astype('timedelta64[D]').astype(int) df['expiration_date'] = df['expiration_date'].dt.strftime('%Y-%m-%d') df = df[['domain_name','registrar','live','expiration_date','remaining']] df.columns = ['Domain','Registrar','Live Since','Expiration','Remaining'] df['Status'] = df.apply(lambda x: domainStatus(x['Domain']), axis=1) df.sort_values(by=['Remaining'],inplace=True) return df print(getWHOISData(domains))
最後我們定義 getWHOISData 這一個自訂功能,回傳一個 pandas dataframe。
我們重點介紹以下的編程要點:
w = [whois.whois(d) for d in domains]
這是一個 List Comprehension,輸出一個列表,含有每個網域的 ICANN WHOIS 數據,以字典(dictionary)的形式出現。
有關 List Comprehension 的介紹可以到這裡看看:List Comprehension: Python 的 For Loop 怎樣使用?
df['live'] = datetime.now() - df['creation_date'] df['remaining'] = df['expiration_date'] - datetime.now() for x in ['live','remaining']: df[x] = df[x].astype('timedelta64[D]').astype(int)
「live」和「remaining」這兩個 Column 是一個時間差(Time Delta)的數據。我們只需要時間差的日期,所以我們先將數據轉為日期差(timedelta64[D]),然後轉換成整數(int)代表日期差。
df['Status'] = df.apply(lambda x: domainStatus(x['Domain']), axis=1)
最後我們把 HTML Request 回傳的輸出的編碼(例如「🟢 200」)加入到 pandas dataframe 裡。
我們使用 pandas apply 的功能,將每一行(row)都加入 Status 的資料。有關 pandas apply 詳情可以瀏覽這裡:如何使用 pandas 的 apply?Dataframe 加入新 Column?Python 數據整合處理!
教學完整代碼
最後送給大家這篇教學的 Google Colab 完整代碼。如果您不懂得使用免安裝又好用的 Google Colab Notebook,記得閱讀這篇教學了:新手 1/3:5 分鐘免安裝學習 Python?Google Colab Notebook 幫緊您!
結語
希望以上的教學讓您學到更多 Python 的知識,並了解有關網域註冊的資料!