使用Python指令碼進行網域名稱解析

2022-04-29 12:27:12 字數 2601 閱讀 2073

因為在研究爬蟲,所以也了解了下網域名稱解析。要提高爬蟲的效率,就需要提高網域名稱解析的效率。我將爬蟲記錄下的網域名稱作為待解析的網域名稱來測試各網域名稱解析方法的效率。我嘗試以下四種方法:1. 單執行緒依次解析各網域名稱,2. 多執行緒同時解析各網域名稱,3. 執行緒池解析各網域名稱,4. 使用adns庫解析各網域名稱。其中,第四種方法最高效也最安全,推薦大家使用。完整的**請見:

1. 單執行緒依次解析網域名稱

這種方法最直觀。使用乙個迴圈,依次使用socket.getaddrinfo('host',none)來進行解析。這種方法很低效:解析100個網域名稱花費了392s,解析500個網域名稱花費了1695s。這是由於getaddrinfo方法解析單個網域名稱就比較費時間,使用單執行緒阻礙的方法來解析500個網域名稱,自然會耗時較長。

import time

import socket

def readhost(file):

hosts=

...return hosts

def synresolve(fr):

hosts=readhost(fr)

ips={}

for host in hosts:

try:

results=socket.getaddrinfo(host,none)

for result in results:

print host, result[4][0]

ips[result[4][0]]=host

except exception,e:

print e

file.close()

if __name__=='__main__':

start=time.time()

print 'starting at: ',start

synresolve('host')

print 'ending at: ',time.time()-start

2. 多執行緒解析網域名稱

import time

import socket

def readhost(file):

hosts=

...return hosts

class threadclass(threading.thread):

def __init__(self,host):

self.host=host

threading.thread.__init__(self)

def run(self):

global iphost

try:

res=socket.getaddrinfo(self.host,none)

if mutex.acquire(1):

for re in res:

iphost[re[4][0]]=self.host

mutex.release()

except exception, e:

print self.host, e

def multhreadresolve(fr):

start=time.ctime()

print 'starting multhreadresolve at: ',start

hosts=readhost(fr)

threads=

for host in hosts:

t=threadclass(host)

cnthost=len(hosts)

for i in range(cnthost):

threads[i].start()

for i in range(cnthost):

threads[i].join()

print 'ending multhreadresolve at :', time.ctime()

if __name__='__main__':

iphost={}

mutex=threading.lock()

multhreadresolve('host1')

print iphost

3. 利用執行緒池進行網域名稱解析

通過方法2,我們知道在乙個程序中建立過多的執行緒來執行任務,是危險的。自然的,我們就會想到利用有限個執行緒來進行網域名稱解析。比如,用100個執行緒去解析500網域名稱。當乙個執行緒解析完成後,無需關閉,繼續從佇列中取出乙個網域名稱進行解析。如此反覆,直到佇列中為空,所有網域名稱都得到解析為止。使用執行緒池的另乙個好處是省略了新建執行緒和關閉執行緒的時間;如果執行緒執行的任務耗時較短,那麼通過執行緒池節省下來的這筆時間將會是可觀的。可以預計,此法將比方法2耗時更多。

利用執行緒池進行網域名稱解析的**較方法2要複雜一些,但也不難理解。**仍舊主要分為兩個部分:一部分為乙個繼承自threading.thread的子類,並通過run()函式這一成員函式來實現每個執行緒所要完成的工作。run()函式中,當乙個執行緒空閒時,就去佇列中取出乙個網域名稱;直到隊列為空,函式的任務也就完成了。另一部分為乙個類,負責將任務分配給乙個新建立的執行緒,並檢查交由run()完成的任務是否都已完成。由於需要進行的管理行為較方法2更多,所以將這些管理行為整合在一起,弄成了乙個類。因為乙個執行緒需要進行多次網域名稱解析工作,所以需要將這些待解析的網域名稱進行排隊。隊伍的容量是有限的,只有當隊未滿時才能將網域名稱加入佇列等待執行緒將其取走並進行解析。由於**較長,我就把它放在這裡了。

使用DDNS指令碼對阿里雲網域名稱進行動態網域名稱解析

之前用bitwarden rs的docker容器 nginx反向 並設定了https,把bitwarden伺服器部署到了自己的電腦上,在校園網中提供服務 只要我的手機連上學校的wifi,就可以訪問到我電腦上的bitwarden服務。但是我遇到了乙個麻煩的問題,就是電腦在校園網的ip偶爾會發生變化,每...

使用Crypto庫進行Python加密解密

pycrypto,pycrytodome和crypto是乙個東西,crypto在python上面的名字是pycrypto它是乙個第三方庫,但是已經停止更新三年了,所以不建議安裝這個庫 pycryptodome是pycrypto的延伸版本,用法和pycrypto 是一模一樣的 所以只需要安裝pycry...

使用python指令碼進行UPD資料回放

回放資料指令碼 from scapy.all import from scapy.utils import rdpcap pkts rdpcap flume1.pcap for pkt in pkts pkt ether dst 00 50 56 36 5d ef pkt ether src 00 ...