標籤:網路編程 python 網頁解析 網域名稱服務 (DNS)
Whois簡介
whois(讀作“Who is”,非縮寫)是用來查詢網域名稱的IP以及所有者等資訊的傳輸協議。簡單說,whois就是一個用來查詢網域名稱是否已經被註冊,以及註冊網域名稱的詳細資料的資料庫(如網域名稱所有人、網域名稱註冊商)。通過whois來實現對網域名稱資訊的查詢。早期的whois查詢多以命令列介面存在,但是現在出現了一些網頁介面簡化的線上查詢工具,可以一次向不同的資料庫查詢。網頁介面的查詢工具仍然依賴whois協議向伺服器發送查詢請求,命令列介面的工具仍然被系統管理員廣泛使用。whois通常使用TCP協議43連接埠。每個網域名稱/IP的whois資訊由對應的管理機構儲存。
不同網域名稱尾碼的whois資訊需要到不同的whois資料庫查詢。如.com的whois資料庫和.edu的就不同。目前國內提供WHOIS查詢服務的網站有萬網、站長之家的等。每個網域名稱或IP的WHOIS資訊由對應的管理機構儲存,例如,以.com結尾的網域名稱的WHOIS資訊由.com網域名稱電訊廠商VeriSign管理,中國國家頂級網域名稱.cn網域名稱由CNNIC管理[1] 。
WHOIS服務是一個線上的“請求/響應”式服務。WHOIS Server運行在後台監聽43連接埠,當Internet使用者搜尋一個網域名稱(或主機、連絡人等其他資訊)時,WHOIS Server首先建立一個與Client的TCP串連,然後接收使用者請求的資訊並據此查詢後台網域名稱資料庫。如果資料庫中存在相應的記錄,它會將相關資訊如所有者、管理資訊以及技術聯絡資訊等,反饋給Client。待Server輸出結束,Client關閉串連,至此,一個查詢過程結束。
有些註冊商,對國際網域名稱的whois資訊是屏蔽的,如果要查詢只能聯絡對應的註冊商。這種保護機制是防止有人惡意利用這種whois資訊的連絡方式,暴露客戶的隱私資訊。
使用python擷取網站網域名稱資訊
下面的例子將使用站長之家的whois,結合網頁爬蟲的使用,來擷取whois資訊。
#!/usr/bin/python# -*- coding: utf-8 -*-'''this code is to get whois info by http://whois.chinaz.com/Created on 2015-05-13version: 0.1@author: zhang'''import osfrom urllib2 import Request, urlopen, URLError, HTTPErrorfrom bs4 import BeautifulSoupimport chardetimport socketsocket.setdefaulttimeout(30) class get_whois: def __init__(self,url): self.url = url def getDomainInfo(self): domain='http://whois.chinaz.com/'+self.url req = Request(domain) try: response = urlopen(req) except URLError , e : if isinstance(e.reason, socket.timeout): print 'socket timeout' print "network meets some problems: " print "Reason: ",e.reason else: if response != None: the_page = response.read() char = chardet.detect(the_page) #解碼為unicode the_page.decode(char['encoding'],'ignore') soup = BeautifulSoup(the_page) #<div class="div_whois"> #因為http://whois.chinaz.com/返回的資訊 #包含在 <div class="div_whois">標籤中,直接擷取 domain = soup.find('div',id="whoisinfo") domain = unicode(domain) return domainif __name__ == "__main__": domain = ['baidu.com'] test = get_whois(domain[0]) info = test.getDomainInfo() print info
執行後,info的內容為:
<div class="div_whois" id="whoisinfo">註冊商:MARKMONITOR INC.<br/>網域名稱伺服器:whois.markmonitor.com<br/>DNS伺服器:DNS.BAIDU.COM<br/>DNS伺服器:NS2.BAIDU.COM<br/>DNS伺服器:NS3.BAIDU.COM<br/>DNS伺服器:NS4.BAIDU.COM<br/>DNS伺服器:NS7.BAIDU.COM<br/>網域名稱狀態:電訊廠商設定了客戶禁止刪除保護 http://www.icann.org/epp#電訊廠商設定了客戶禁止刪除保護<br/>網域名稱狀態:電訊廠商設定了客戶禁止轉移保護 http://www.icann.org/epp#電訊廠商設定了客戶禁止轉移保護<br/>網域名稱狀態:電訊廠商設定了客戶禁止修改保護 http://www.icann.org/epp#電訊廠商設定了客戶禁止修改保護<br/>網域名稱狀態:網域名稱伺服器上禁止刪除保護 http://www.icann.org/epp#網域名稱伺服器上禁止刪除保護<br/>網域名稱狀態:網域名稱伺服器上禁止轉移保護 http://www.icann.org/epp#網域名稱伺服器上禁止轉移保護<br/>網域名稱狀態:網域名稱伺服器上禁止修改保護 http://www.icann.org/epp#網域名稱伺服器上禁止修改保護<br/>更新時間:2013年10月14日<br/>建立時間:1999年10月11日<br/>到期時間:2015年10月11日<br/>連絡人:: zhiyong duan<br/><br/></div>
因為免費的原因,擷取的資訊並不全面,且有許多資訊被服務商封閉
擷取相應資訊後,可以對其進一步的進行解析,例如,結合python中的re模組,對時間資訊進行提取等。
在以上例子中使用了python的兩個工具包,分別是Beautifulsoup 是用Python寫的一個HTML/XML的解析器,它可以很好的處理不規範標記並產生剖析樹(parse tree)。 它提供簡單又常用的導航(navigating),搜尋以及修改剖析樹的操作。它可以大大節省你的編程時間。
另外一個是chardet,用來實現字串/檔案編碼檢測。
在執行代碼時,要確保程式可以找到這兩個工具包。具體的見參考檔案中的源包相關URL
參考文獻:
http://baike.baidu.com/link?url=2eMXzLsFeJFyKxD6117bmL1L6Ka-bFP-SAxK0zF30VagwYD8StCLPnoEf9rDdjj_8metwL1QpcF2XImNDoUvLK
http://whois.chinaz.com/
http://www.crummy.com/software/BeautifulSoup/bs4/doc/
https://pypi.python.org/pypi/chardet
Python網路編程小例子:使用python擷取網站網域名稱資訊