本文目錄一覽:
Python獲取url中域名及從域名中提取ip的方法
這種方法為從urlparse模塊中通過urlparse方法提取url通過hostname屬性獲取當前url的域名。
此方法是通過urllib模塊中splittype方法先從url中獲取到proto協議及rest結果,然後通過splithost從rest中獲取到host及rest結果,此時host為域名。(rest被分割了兩次)如下圖:
此方法為從sokcet模塊中獲取到gethostbyname方法將域名傳遞進去就能解析出域名的ip。
此方法為通過nslookup獲取域名的ip。
以上從域名中提取ip會不準確,需要設置DNS伺服器,這樣解析域名就準確了。
dnspython模塊使用(解析域名)
import sys
import socket
import dns.resolver
print ‘Argument List:’, str(sys.argv)
site = sys.argv[1]
dns_server = sys.argv[2]
# Basic CNAME query the host’s DNS
for rdata in dns.resolver.query(site, ‘CNAME’) :
print rdata.target
# Basic A query the host’s DNS
for rdata in dns.resolver.query(site, ‘A’) :
print rdata.address
###下邊是制定dns解析的伺服器設置
# Setting an specific DNS Server
resolver = dns.resolver.Resolver()
resolver.nameservers = [socket.gethostbyname(dns_server)]
# Basic CNAME query with the specific DNS server
answer = resolver.query(site, ‘CNAME’);
for rdata in answer :
print rdata.target
# Basic A query with the specific DNS server
answer = resolver.query(site, ‘A’);
for rdata in answer :
print rdata.address
To run:(命令執行)
python dnsdig.py 8.8.8.8
請教一個關於 Python Requests 設置 DNS 的問題
說實話只要和 Web 相關的強烈建議先去看看 HTTP 協議的相關書籍或者 RFC。
域名在 Client 的作用是通過 DNS 解析到 Server 的 IP,但是請求需要在 Host 頭中帶上域名,實際請求還是發送到 IP 的。
舉個例子:
GET /foo.php HTTP/1.1
Host: example.com
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
基於這個過程有兩種方法來解決:
第一:基於系統環境解決。
修改本地 Host、指定 DNS
第二:自己構造請求。
這種方法需要可以自定義請求的 Host 頭,並且需要自己處理解析這塊。可以選擇硬編碼 IP 或者還是採用第一種方法實現。
可以先使用硬編碼 IP 的方式來嘗試一下,剩下的就是要確認使用的請求庫能否支持自定義 Host 頭了。
如果想進一步解決硬編碼 IP 的問題,那麼就需要一個 DNS 的庫來獲得正確的解析記錄,再來發起請求。
剩下的問題就可能出在 HTTPS 上,因為證書校驗是需要靠域名校驗的,client 處理的方式細節不同通過 IP 發起請求可能會出現證書校驗錯誤,粗暴的方法就是無視證書錯誤。
原創文章,作者:WHHII,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/316966.html