【发布时间】:2019-09-13 10:07:51
【问题描述】:
我正在编写一个 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 并保存。我通过创建数组尝试了一些方法。尽管这需要一些时间。如何让它成为可能......
【问题讨论】:
-
我会开始使用不同的变量名而不是
i、j等等,这真的很难阅读。使用富有表现力的变量名称,那么这里的人将有机会更快地回答,如果您将代码传递给其他程序员也是如此。 -
更改了代码中的变量,使其更易于阅读......
-
为什么将缓存大小限制为 10 个元素,为什么要在达到 10 个元素时重置缓存?
-
这只是一个示例代码。实际上,缓存大小将是 5000 或更多。这是临时缓存。达到一定限制后会被重置。我只想检查缓存而不是套接字模块以快速处理它。但我不知道实现它的方法。
标签: python python-3.x sockets caching ip-address