Python – получить IP-адрес из имени хоста
Модуль сокета Python можно использовать для получения IP-адреса по имени хоста.
Модуль сокета является частью основных библиотек Python, поэтому нам не нужно устанавливать его отдельно.
Модуль сокета Python для получения IP-адреса от имени хоста
Функция gethostbyname()
модуля сокета Python принимает аргумент имени хоста и возвращает 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('journaldev.com')
'45.79.77.230'
>>> socket.gethostbyname('google.com')
'172.217.166.110'
>>>
Примечание. Если веб-сайт находится за балансировщиком нагрузки или работает в облаке, вы можете получить другой результат поиска IP-адреса.
Например, попробуйте запустить приведенную выше команду для facebook.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)}')
Вот еще один пример передачи имени хоста сценарию в качестве аргумента командной строки. Скрипт найдет IP-адрес и распечатает его.
import socket
import sys
# no error handling is done here, excuse me for that
hostname = sys.argv[1]
# IP lookup from hostname
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 lookup from hostname
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
#
Ссылка: документация по API модуля сокетов