Есть довольно старый ответ на
стэковерфлоу. requests под капотом использует urllib3, а та содержит функцию
urllib3.util.connection.create_connection()
, ответственную за установку TCP соединения. Соответственно, можно попробовать подменить эту функцию на свою реализацию, и использовать пакет dnspython для запросов.
from urllib3.util import connection
import dns.resolver
def your_dns_resolver(hostname: str) -> str:
"""Получает на вход доменное имя, возвращает IP адрес в виде строки."""
resolver = dns.resolver.Resolver(configure=False)
resolver.nameservers = ["8.8.8.8"] # список используемых DNS серверов.
answer = resolver.resolve(hostname, "A") # A-запись для IPv4 адреса, AAAA-запись для IPv6 адреса
if len(answer) == 0:
raise Exception("No A record found")
return str(answer[0])
_orig_create_connection = connection.create_connection
def patched_create_connection(address, *args, **kwargs):
"""Wrap urllib3's create_connection to resolve the name elsewhere"""
host, port = address # оригинальный адрес для запроса
hostname = your_dns_resolver(host) # сами определяем IP по имени
return _orig_create_connection((hostname, port), *args, **kwargs) # дёргаем оригинальную функцию, чтобы создать соединение
connection.create_connection = patched_create_connection
Код не проверял, это скорее концепт чем готовый инструмент.