Python:如何通过主机名获取IP地址(实用指南)

Python:从主机名获取IP地址

本文是《Python:从主机名获取IP地址》系列文章的第1部分(共1部分)。

使用Python的socket模块可以从主机名获取IP地址。

socket模块是Python核心库的一部分,因此我们无需单独安装它。

使用Python Socket模块从主机名获取IP地址

Python socket模块的gethostbyname()函数接收主机名作为参数,并以字符串格式返回对应的IP地址。

在Python解释器中,这里有一个简单的例子,可以用来查找一些网站的IP地址。

# python3.7
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 16:52:21) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> import socket
>>> socket.gethostbyname('scdev.com')
'45.79.77.230'
>>> socket.gethostbyname('google.com')
'172.217.166.110'
>>> 

注意:如果网站位于负载均衡器后面或在云端运行,进行IP地址查找可能会得到不同的结果。

例如,尝试在google.comfacebook.com上运行上述命令。如果您与我不在相同的地理位置(印度),很可能会得到不同的IP地址作为输出。

用Python脚本查找网站的IP地址

让我们来看一个例子,在此例中我们要求用户输入一个网站地址,然后打印出它的IP地址。

import socket

hostname = input("Please enter website address:\n")

# IP lookup from hostname
print(f'The {hostname} IP Address is {socket.gethostbyname(hostname)}')
Python从主机名获取IP地址

这里有另一个示例,将主机名作为命令行参数传递给脚本。脚本将找到IP地址并打印出来。

import socket
import sys

# 这里没有进行错误处理,请谅解
hostname = sys.argv[1]

# 从主机名查找IP
print(f'The {hostname} IP Address is {socket.gethostbyname(hostname)}')

输出:

# python3.7 ip_address.py facebook.com
The facebook.com IP Address is 157.240.23.35

socket.gethostbyname()的错误场景

如果主机名无法解析为有效的IP地址,则会引发socket.gaierror错误。我们可以使用try-except块在程序中捕获此错误。

这是加入针对无效主机名异常处理的更新脚本。

import socket
import sys

hostname = sys.argv[1]

# 从主机名查找IP
try:
    ip = socket.gethostbyname(hostname)
    print(f'The {hostname} IP Address is {ip}')
except socket.gaierror as e:
    print(f'Invalid hostname, error raised is {e}')

结果:

# python3.7 ip_address.py jasjdkks.com               
Invalid hostname, error raised is [Errno 8] nodename nor servname provided, or not known
#

参考:Socket模块API文档

bannerAds