python - 从完整域名中查找国家

标签 python dns

我正在编写一个脚本来分析域名列表中的国家(例如 third.second.first)。数据集很旧,许多完全限定的域名无法通过 python 中的 socket.gethostbyname(domain_str) 找到。以下是我提出的一些替代方案:

  1. 检索 second.first 的 ip 如果 third.second.first 的 ip 找不到然后找那个ip的国家
    • 这似乎不是一个好主意,因为 dns A 记录可以将子域映射到与其主域不同的 ip。
  2. 检测域名的国家代码。例如如果是..jp,就是来自日本

我的问题是:

  • 第一种方法可以接受吗?
  • 是否有其他方法可以检索域名的国家信息?

谢谢。

最佳答案

我建议使用 geolite2 模块:

https://pypi.python.org/pypi/maxminddb-geolite2

所以你可以这样做:

#!/usr/bin/python

import socket
from geolite2 import geolite2

def origin(ip, domain_str, result):
    print("{0} [{1}]: {2}".format(domain_str.strip(), ip, result))

def getip(domain_str):
    ip = socket.gethostbyname(domain_str.strip())
    reader = geolite2.reader()      
    output = reader.get(ip)
    result = output['country']['iso_code']
    origin(ip, domain_str, result)

with open("/path/to/hostnames.txt", "r") as ins:
    for domain_str in ins:
        try:
            getip(domain_str)
        except socket.error as msg:
            print("{0} [could not resolve]".format(domain_str.strip())) 
            if len(domain_str) > 2:
                subdomain = domain_str.split('.', 1)[1]
                try:
                    getip(subdomain)
                except:
                    continue

geolite2.close()

输出:

bing.com [204.79.197.200]: US
dd15-028.compuserve.com [could not resolve]
compuserve.com [149.174.98.149]: US
google.com [172.217.11.78]: US

关于python - 从完整域名中查找国家,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45108293/

相关文章:

python - 如何从我的数据框列中删除 u-unicode 字符,该列是由字典组成的字符串?

python - 来自原始 tcp 数据包的实时视频

python - Dask 在 read_csv 上加载和应用函数

linux - Debian DNS Jessie - 辅助服务器的子域

c# - 解析IP失败

python - 使用 PIL 查找图像中透明区域的位置

python - 从 Shapefile 获取邻接矩阵

Java - 通过名称 DNS (?) 获取 IP 地址

c# - 跨域事件目录组成员

ssl - 无法使用 nginx 配置 certbot 以接受 https