Ошибки прокси в Python: почему найденные в поиске строки не совпадают с вашими
Главная сложность с питоновскими ошибками прокси не в них самих, а в том, что половина найденных в поиске ответов написана под версии библиотек пятилетней давности. Строки изменились, баги починили, а советы остались. Ниже — что ваша версия говорит на самом деле.
Строка изменилась
Самая вставляемая в поиск строка — «Cannot connect to proxy.» — принадлежит urllib3 первой версии. Во второй её нет вовсе: там сообщение собирается иначе и звучит как «Unable to connect to proxy», без точки в конце. Если вы ищете по старой строке и ничего не находите в своём стектрейсе, дело не в вас.
# Проверено на urllib3 2.7.0, requests 2.34.2, aiohttp 3.14.3, httpx 0.28.1
#
# БЫЛО (urllib3 1.x) СТАЛО (urllib3 2.x)
"Cannot connect to proxy." "Unable to connect to proxy"
<- без точки в конце
#
# ПОДСКАЗКА ПРО HTTP/HTTPS
". Your proxy appears to only use HTTP and not HTTPS, try changing your
proxy URL to be HTTP."
С 1.26.10 добавляется, только если схема прокси — https.
До 1.26.10 добавлялась по совпадению текста ошибки TLS, то есть и там,
где прокси был в порядке. Отсюда живучий миф.
#
# SOCKS БЕЗ ЗАВИСИМОСТИ
requests -> InvalidSchema, а не ProxyError. Ставится: pip install requests[socks]
httpx -> другая библиотека: pip install httpx[socks]Миф про подсказку HTTP и HTTPS
Дальше по популярности идёт подсказка «Your proxy appears to only use HTTP and not HTTPS». Про неё широко известно, что она врёт: приписывается по совпадению текста ошибки TLS и вылезает даже когда с прокси всё в порядке. Это было правдой ровно в двух версиях — 1.26.8 и 1.26.9.
В 1.26.10 добавили проверку схемы: теперь подсказка появляется, только если вы действительно обращаетесь к прокси по https. Соответствующее обращение в трекере закрыто ещё в 2022 году. Так что если подсказку видите вы — с большой вероятностью она права, и стоит посмотреть на схему в строке подключения, а не считать её ложной по инерции.
Как читать вложенные исключения
Исключения здесь вложены в несколько слоёв, и информативен внутренний, а не внешний. Снаружи обычно ProxyError из requests, под ним MaxRetryError из urllib3, под ним ProxyError уже из urllib3, а в самой глубине — исходная ошибка сокета. Правило простое: читайте трассировку с конца, потому что именно там написано, что произошло на самом деле — отказ соединения, таймаут или ошибка TLS.
SOCKS падает не тем исключением
Если в requests указать socks5-прокси без установленной зависимости, придёт не ProxyError, а InvalidSchema — то есть библиотека сообщает, что не понимает схему, а не что прокси недоступен. Отсюда поиски проблем в прокси там, где не хватает пакета. Ставится это как requests[socks]; у httpx для того же нужна другая библиотека, и её ставят как httpx[socks].
Отдельно: неработающий SOCKS-прокси в requests приходит как ConnectionError, а не как ProxyError. То есть по классу исключения отличить «нет зависимости», «прокси мёртв» и «прокси отказал» нельзя — нужен текст.
Два устаревших утверждения про асинхронные клиенты
Первое: «aiohttp не поддерживает HTTPS-прокси». Поддерживает, начиная с Python 3.11 — ограничение было не в самой библиотеке, а в асинхронном транспорте. В документации до сих пор попадается фраза про недоступность TLS внутри TLS, и она устарела.
Второе: «в httpx используйте proxies=». Этот параметр не просто устарел, а удалён в версии 0.28.0 — код с ним падает с TypeError. Актуальное имя параметра — proxy. Заодно полезно знать, что httpx поднимает исключение при отказе авторизации только для https-целей, где используется CONNECT; для http-целей вы получите обычный ответ с кодом 407.
И то, что не изменилось: aiohttp по умолчанию игнорирует переменные окружения с адресом прокси. Чтобы он их читал, нужен trust_env. Это не баг и не регресс, а поведение по умолчанию с давних версий — но оно исправно порождает вопрос «почему мой HTTP_PROXY не работает».
Как не попасть на это снова
Практика, которая экономит часы: при поиске по тексту ошибки смотрите на дату ответа и на версию, для которой он написан, а сомнительное утверждение проверяйте в исходниках своей установленной версии. Библиотеки лежат прямо в окружении, и поиск по строке ошибки находит и место, где она возникает, и условие, при котором она добавляется.
Если ошибка всё-таки в прокси
Отделить проблему клиента от проблемы прокси помогает проверка одной командой — и наши бесплатные инструменты. Ротационные IPv6 — от 650 ₽ за 50 потоков.
Смотреть тарифыПрокси под эту задачу
Проверить нашими инструментами
Читайте также
- Как подключить прокси в Python: requests, Scrapy и SeleniumРабочие примеры для трёх самых частых случаев, разница между socks5 и socks5h и почему в браузере удобнее авторизация по IP.
- Ошибка 407 Proxy Authentication Required: почему прокси не пускает парсер407 возвращает прокси, а не целевой сайт. Пять причин по частоте, проверка одной командой и что делать, если софт умеет только ip:port.
- Ошибки прокси в Chrome: что означает каждый код и чем −111 отличается от −130ERR_TUNNEL_CONNECTION_FAILED и ERR_PROXY_CONNECTION_FAILED звучат одинаково, а означают разные стадии. Таблица кодов, сверенная с исходниками, и разбор того, что Chrome делает при отказе прокси.
