gpt4 book ai didi

Python 异步反向 DNS 查询

转载 作者:太空宇宙 更新时间:2023-11-03 15:13:11 28 4
gpt4 key购买 nike

我希望在短时间内进行大量的反向 DNS 查找。我目前已经使用 socket.gethostbyaddr 和 concurrent.futures 线程池实现了异步查找,但仍然没有看到所需的性能。例如,脚本在 2500 个 IP 地址上完成大约需要 22 分钟。

我想知道是否有更快的方法来做到这一点,而无需求助于 adns-python 之类的东西。我找到了这个 http://blog.schmichael.com/2007/09/18/a-lesson-on-python-dns-and-threads/这提供了一些额外的背景。

代码片段:

ips = [...]
with concurrent.futures.ThreadPoolExecutor(max_workers = 16) as pool:
list(pool.map(get_hostname_from_ip, ips))
def get_hostname_from_ip(ip):
try:
return socket.gethostbyaddr(ip)[0]
except:
return ""

我认为部分问题是许多 IP 地址未解析和超时。我试过:

socket.setdefaulttimeout(2.0)

但是好像没有效果。

最佳答案

我发现我的主要问题是 IP 无法解析,因此套接字不遵守其设置的超时并在 30 秒后失败。参见 Python 2.6 urlib2 timeout issue .

adns-python 是不行的,因为它不支持 IPv6(没有补丁)。

四处搜索后我发现了这个:Reverse DNS Lookups with dnspython并在我的代码中实现了类似的版本(他的代码还使用了可选的线程池并实现了超时)。

最后,我将 dnspython 与 concurrent.futures 线程池一起用于异步反向 DNS 查找(参见 Python: Reverse DNS Lookup in a shared hostingDnspython: Setting query timeout/lifetime)。超时为 1 秒,这将 2500 个 IP 地址的运行时间从大约 22 分钟减少到大约 16 秒。巨大的差异可能归因于 Global Interpreter Lock在套接字上和 30 秒超时。

代码片段:

import concurrent.futures
from dns import resolver, reversename
dns_resolver = resolver.Resolver()
dns_resolver.timeout = 1
dns_resolver.lifetime = 1
ips = [...]
results = []

with concurrent.futures.ThreadPoolExecutor(max_workers = 16) as pool:
results = list(pool.map(get_hostname_from_ip, ips))

def get_hostname_from_ip(ip):
try:
reverse_name = reversename.from_address(ip)
return dns_resolver.query(reverse_name, "PTR")[0].to_text()[:-1]
except:
return ""

关于Python 异步反向 DNS 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24093888/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com