Я пишу программу на Python для получения IP-адреса сайта с помощью модуля сокета.Здесь у меня есть список диктов с n количеством сайтов и номерами.
Вот некоторые примеры данных:
data_list = [{'website': 'www.google.com', 'n': 'n1'}, {'website': 'www.yahoo.com', 'n': 'n2'}, {'website': 'www.bing.com', 'n': 'n3'}, {'website': 'www.stackoverflow.com', 'n': 'n4'}, {'website': 'www.smackcoders.com', 'n': 'n5'}, {'website': 'www.zoho.com', 'n': 'n6'}, {'website': 'www.quora.com', 'n': 'n7'}, {'website': 'www.elastic.co', 'n': 'n8'}, {'website': 'www.google.com', 'n': 'n9'}, {'website': 'www.yahoo.com', 'n': 'n10'}, {'website': 'www.bing.com', 'n': 'n11'}, {'website': 'www.stackoverflow.com', 'n': 'n12'}, {'website': 'www.smackcoders.com', 'n': 'n13'}, {'website': 'www.zoho.com', 'n': 'n14'}, {'website': 'www.quora.com', 'n': 'n15'}, {'website': 'www.elastic.co', 'n': 'n16'}, {'website': 'www.google.com', 'n': 'n17'}, {'website': 'www.yahoo.com', 'n': 'n18'}, {'website': 'www.bing.com', 'n': 'n19'}, {'website': 'www.stackoverflow.com', 'n': 'n20'}]
Вот моя программа:
import socket
import time
data_list = [{'website': 'www.google.com', 'n': 'n1'}, {'website': 'www.yahoo.com', 'n': 'n2'}, {'website': 'www.bing.com', 'n': 'n3'}, {'website': 'www.stackoverflow.com', 'n': 'n4'}, {'website': 'www.smackcoders.com', 'n': 'n5'}, {'website': 'www.zoho.com', 'n': 'n6'}, {'website': 'www.quora.com', 'n': 'n7'}, {'website': 'www.elastic.co', 'n': 'n8'}, {'website': 'www.google.com', 'n': 'n9'}, {'website': 'www.yahoo.com', 'n': 'n10'}, {'website': 'www.bing.com', 'n': 'n11'}, {'website': 'www.stackoverflow.com', 'n': 'n12'}, {'website': 'www.smackcoders.com', 'n': 'n13'}, {'website': 'www.zoho.com', 'n': 'n14'}, {'website': 'www.quora.com', 'n': 'n15'}, {'website': 'www.elastic.co', 'n': 'n16'}, {'website': 'www.google.com', 'n': 'n17'}, {'website': 'www.yahoo.com', 'n': 'n18'}, {'website': 'www.bing.com', 'n': 'n19'}, {'website': 'www.stackoverflow.com', 'n': 'n20'}]
field = "website"
action = "append"
max_retry = 1
hit_cache_size = 10
cache = []
d1 = []
for data in data_list:
temp={}
for item in data:
if item ==field:
if data[item]!="Not available":
try:
ad=socket.gethostbyname(data[item])
if len(cache)<hit_cache_size:
cache.append({data[item]:ad})
else:
cache=[]
if action=="replace":
temp[item]=ad
elif action=="append":
temp[item]=str([data[item],ad])
except:
count=0
while(True):
try:
ad=socket.gethostbyname(data[item])
except:
count+=1
if count==max_retry:
if action=="replace":
temp[item]="Unknown"
elif action=="append":
temp[item]=str([data[item],"Unknown"])
break
else:
continue
else:
temp[item]="Not available"
else:
temp[item]=data[item]
temp['timestamp']=time.ctime()
d1.append(temp)
print(d1)
Здесь d
может иметь миллионы веб-сайтов.Из-за этого мой код занимает больше времени.поэтому я создал кеш для хранения websites
с их ip
. Размер кеша определен в hit_cache_size
.Если в списке появляется тот же адрес веб-сайта, вместо проверки с использованием модуля сокета, он должен сначала проверить кэш.Если адрес веб-сайта есть, он должен получить IP-адрес оттуда и сохранить его.Я попробовал несколько способов, создавая массивы.Даже если это займет некоторое время.Как сделать это возможным .....