目錄
    Add a header to begin generating the table of contents

    Python 搜尋 WHOIS 資料?網域 Domain 資料不難找

    Python 搜尋 WHOIS 資料?網域 Domain 資料不難找
    Share on facebook
    Share on twitter
    Share on linkedin
    Share on whatsapp
    目錄
      Add a header to begin generating the table of contents

      目的

      這次我們希望透過 Python 來獲取網域註冊的資料,從而提醒我們作網域註冊續訂並監測網站的健康。

      網域註冊與續訂

      如果您有自己的網域(Domain),那麼您對網域註冊應該不太陌生。

      簡單而言,每一個網域都在互聯網名稱與數字地址分配機構(ICANN)裡存有網域註冊的資料。其中一個最令我們感興趣的,是我們註冊的網域何時需要續訂(Renew)。

      每個網域的註冊期為 1 至 10 年。如果我們未能在網域註冊到期(Expiration)前續訂,那麼我們或會失去這個網域,不能繼續使用。

      有關網域的詳情可以按此參考:註冊人常見問題解答:域名到期與續訂

      我是廣告 ^o^

      使用到的 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 幫緊您!

      我是廣告 ^o^
      !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」等的編碼。

      我是廣告 ^o^

      定義 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)代表日期差。

      我是廣告 ^o^
      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 的知識,並了解有關網域註冊的資料!

      我是廣告 ^o^

      人氣文章

      快讓我學更多

      small_c_popup.png
      想學習 Python 嗎?
      快來訂閱我們的電子報!