Существуют разные ситуации применения прокси-серверов, но чаще всего прокси требуются в IT-проектах, особенно при написании своих парсеров и при создании комплексных web-приложений или сервисов. В данном материале мы расскажем о том, как использовать прокси с pip. Можно ли настроить прокси для конкретных коннектов или на уровне глобальных переменных среды и как это сделать (с предметными инструкциями). А ещё приведём список наиболее распространённых ошибок и методы диагностики проблем работы pip через прокси.
Если максимально кратко, то pip — это штатный менеджер пакетов в среде программирования Python. У него есть альтернативы: conda (для окружения Anaconda), poetry, pipenv (объединяет виртуальное окружение virtualenv и менеджер pip), buildout (ранее был популярен для работы с масштабными проектами на Python).
Технически pip решает следующие задачи:
Прокси-серверы — это узлы-посредники. Они нужны для разных задач:
Если максимально кратко, то прокси — это средство для организации альтернативных маршрутов в Интернете и управления потоками данных.
Прокси бывают разных типов и видов: прозрачные и анонимные, с ротацией (backconnect-схема) и без, HTTP/HTTPS, SOCKS, SSH и т.п. (по поддерживаемым протоколам), резидентные, мобильные и серверные (по типу выходных адресов), кеширующие, со сжатием и т.п. У каждого типа прокси своя сфера применения и особенности подключения.
Например, для работы в паре с парсерами логичнее всего использовать ротируемые HTTP или SOCKS-прокси на базе мобильных или домашних IP (резидентные прокси). Для корпоративных задач по управлению трафиком могут подойти серверные прокси.
Осталось объяснить как связаны между собой менеджер пакетов Python и прокси. Выше мы упомянули, что pip скачивает библиотеки и код из репозитория PyPI. Но такой подход может быть неудобен в ряде случаев, например, когда:
И чтобы перенаправить трафик в нужную точку, нужны прокси. К слову, прокси-сервер здесь может выполнять ряд дополнительных задач, например, кеширование статического контента (в том числе файлов с Python-скриптами), проверка на вирусы и опасный контент, сжатие (для экономии трафика и ускорения скачивания).
Итого, обходится сразу несколько проблем: повышается безопасность, облегчается контроль трафика и запросов, открывается доступ к управлению содержимым.
Менеджер пакетов pip может подключаться к прокси разными способами: посредством специального синтаксиса команд, с задействованием переменных окружения или виртуальных сред, а также с использованием конфигурационных файлов.
Ниже рассмотрим каждый из вариантов подключения прокси к pip в подробностях.
Стандартный синтаксис pip выглядит следующим образом:
pip install <название пакета>
Если вы не добавляли pip в переменные окружения, то нужно обратиться напрямую к исполняемому файлу. Например, в Windows это будет выглядеть примерно так:
cd "C:\Program Files\Python313\Scripts\"
./pip.exe install <название пакета>
Путь установки pip может отличаться. В нашем случае установка осуществлялась в общий для всех каталог «Program Files», а версия Python — 3.13.
Если вызов Python добавлен в переменные среды, а pip нет, то команда может выглядеть так:
python -m pip install <название пакета>
Вместо команды «install» могут быть и другие: download (только для загрузки указанного пакета), uninstall (для удаление пакетов), freeze (для «заморозки» пакетов), list (для получения списков уже установленных пакетов), search (для поиска пакетов) и т.д.
Обратите внимание: для апдейта нет отдельной команды, но есть флаг параметра «install»:
pip install --upgrade <название пакета>
Прокси тоже определяются на уровне специального флага к команде pip install (--proxy). Полная команда будет выглядеть так:
pip install --proxy http://123.455.234.345:3088 <имя пакета>
Данные коннекта нужно заменить на свои (IP-адрес и номер порта).
Если обращение к прокси осуществляется на основе домена, то строка подключения pip к прокси будет выглядеть так:
pip install --proxy http://proxy-url.com:3088 <имя пакета>
Многие ротируемые прокси требуют обязательной авторизации за защиты подключений. Подключение прокси к pip в этом случае будет выглядеть так:
pip install --proxy http://proxy_user:PASSWRD@123.455.234.345:3088 <имя пакета>
Можно заметить, что конструкция поменялась не сильно. Добавились только параметры аутентификации.
Естественно, вместо указанных нами значений нужно подставить актуальные данные (те, что вам предоставил ваш прокси-сервис).
Лучшие прокси-серверы для доступа к ценным данным со всего мира.
Если вы не хотите каждый раз прописывать параметры прокси на уровне синтаксиса pip, можно попробовать указать условия подключения в конфигурационных файлах скрипта или добавить их в переменные среды.
Сейчас расскажем о каждом подходе по-отдельности.
Утилита pip может иметь свои конфигурационные файлы. И они не всегда хранятся централизованно. Чтобы не писать свои конфиги вслепую, лучше всего узнать у pip, где конкретно он ищет информацию.
Для этого введите команду:
pip config -v list
В Windows файлы будут подхватываться из каталогов:
Конкретно в вашем случае путь установки Python может отличаться, поэтому путь «C:\Program Files\Python313» будет другим.
Открывайте нужный вам файл и добавляйте в него строки:
[global]
proxy = http://proxy_user:PASSWRD@123.455.234.345:3088
(с вашими актуальными данными подключения)
Если файла не существует, просто создайте его: правой кнопкой мыши в папке, пункт «Создать», в выпадающем меню «Текстовый документ». После создания переименуйте его и смените расширение. Должно получиться «pip.ini».
В Linux или в MacOS файлы конфигурации будут иметь расширение .conf, а располагаться будут в других каталогах.
Для Linux-дистрибутивов (в большинстве случаев):
Для MacOS:
Наибольший приоритет отдаётся записям, которые определяются на самом последнем уровне:
В Windows переменные можно задать через специальный интерфейс. Вбейте в поиске системы «Environment variables» или откройте свойства системы и кликните на кнопке «Переменные среды».
Создайте новые переменные:
Если прокси без авторизации, то формат записи будет примерно таким:
http://123.455.234.345:3088 или http://proxy-domain.com:3008
Номер порта, адрес, логин и пароль нужно указать актуальные (у нас несуществующие значения, они используются только для примера).
Обратите внимание: HTTP_PROXY и HTTPS_PROXY — это две разные переменные, и определять их нужно обе.
Через переменные среды вы создаёте общие прокси для Python (для всей среды выполнения скриптов).
Вместо графического режима можно задействовать командную строку.
Для Windows
set HTTP_PROXY=http://proxy_user:PASSWRD@123.455.234.345:3088
set HTTPS_PROXY=https://proxy_user:PASSWRD@123.455.234.345:3088
Для Linux
export http_proxy=http://proxy_user:PASSWRD@123.455.234.345:3088
export https_proxy=https://proxy_user:PASSWRD@123.455.234.345:3088
Если вы хотите задать список исключений, то сайты, для которых не нужно включать прокси, следует перечислить в переменной no_proxy. Например:
set NO_PROXY=example.com,site123.org,127.0.0.1
Удаление происходит командой unset (в Linux):
unset HTTP_PROXY
В Windows проще установить «пустой» прокси:
set HTTP_PROXY=
Или можно выполнить общий сброс прокси с правами администратора:
netsh winhttp reset proxy
Относительно недавно Python представил CLI-интерфейс для управления настройками менеджера PIP.
Вы можете определять глобальные и пользовательские настройки, а также настройки виртуального окружения напрямую из командной строки. Синтаксис не привязывается к платформе.
Вот будет выглядеть команда для установки прокси на глобальном уровне:
pip config set global.proxy http://proxy.host:1234
или
pip config set global.proxy http://login:pass@proxy.host:1234
(если используется авторизация с логином и паролем)
Вот так определяются настройки на уровне пользователя:
pip config set user.proxy http://login:pass@proxy.host:1234
А вот так для уровня «site» (переменные окружения):
pip config set site.proxy http://login:pass@proxy.host:1234
Переменную среды можно установить или изменить внутри Python-скриптов следующим образом:
PIP_PROXY = http://login:pass@proxy.host:1234
Это будет полный аналог команды «pip --proxy http://login:pass@proxy.host:1234».
Не забудьте указать актуальные значения для подключения к своему прокси.
Если вам нужно установить пакет через pip с прокси только для конкретного виртуального окружения, можно использовать такой синтаксис:
C:\Users\<YOUR_NAME>\myvenv\Scripts\pip install --proxy=http://proxy-user:passwd@proxy_address:1234 virtualenv
То есть вам нужно обратиться напрямую к установщику pip, который лежит в созданном вами виртуальном окружении.
Если прямой путь не срабатывает, сначала перейдите в нужный каталог окружения:
cd “C:\Users\<YOUR_NAME>\myvenv\Scripts\pip”
./pip.exe install --proxy=http://proxy-user:passwd@proxy_address:1234 <имя пакета>
Плюс всегда можно настроить общие переменные для текущего виртуального окружения. Это делается через переменные HTTP_PROXY и HTTPS_PROXY (разбирали их выше):
Одни из самых сложных ошибок настройки: прокси прописаны в разных конфигах, для разных пользователей и на разном уровне доступа (глобально, для переменных сред и т.п.). Найти что и где задано бывает достаточно трудно.
В крупных корпоративных сетях вообще может задействоваться механизм централизованной настройки прокси с NTLM-аутентификацией (он же используется в прокси-серверах NTLMAPS и CNTLM).
Неправильные конфиги легко лечатся прямым прописанием параметров прокси при вызове pip из командной строки. Они имеют наивысший приоритет.
Но мало определить только адрес и порт прокси. Ошибки могут возникать и из-за других опций конфигурации.
Редко, но вполне реалистично. Чтобы убедиться в его работоспособности, подключитесь к нему напрямую (без прокси) или через другой (заведомо работоспособный) прокси.
Как минимум нужно проверить, что прокси доступен и работает (+вы могли ошибиться при вводе логина/пароля). Это можно сделать с помощью утилит curl или wget из консоли (рассмотрим ниже).
А ещё следует переопределить опцию стандартного таймаута (на случай, если он уже установлен в каком-то из конфигов слишком коротким, системная предустановка — 15 секунд):
pip install --proxy http://123.455.234.345:3088 --timeout=60 <имя пакета>
В нашем примере мы установили тайм-аут в 60 секунд.
Если прокси доступен, но ошибку выдаёт только при обращении из вашего python-скрипта, то с большой вероятностью проблема кроется в наличии спецсимволов в имени пользователя или в пароле.
Спецсимволы нужно перекодировать. Например:
Самый правильный подход — добавить сертификаты безопасности (через опцию --cert=/путь/до/сертификата/cert.pem). Ошибка обычно возникает, если вы обращаетесь к стороннему индексу пакетов, а при авторизации задействуется дефолтный SSL (для pypi.org). Естественно, сертификат будет отображаться как невалидный. Чтобы убрать ошибку, вам нужно скачать и установить SSL для выбранного индекса пакетов.
Но если у вас нет SSL в наличии, то и добавить ничего вы не сможете.
«Костыльное» решение — объявить адрес хоста, который приводит к появлению ошибки, доверенным. За это отвечает флаг --trusted-host:
pip install --trusted-host your-index.org --proxy http://123.455.234.345:3088 <имя пакета>
Самый простой вариант — обратиться к сайту через утилиту curl и вывести все предупреждения и информацию в консоль:
curl -I https://pypi.org --proxy http://proxy-user:passwd@proxyserver.com:3038
В Windows утилиту, возможно, придётся скачать и установить вручную (официальный сайт curl). Выполнение скрипта будет немного сложнее. Сначала нужно распаковать программу в каталог, а затем переключиться в него:
cd "C:\путь\до\curl\bin\"
curl.exe -I https://pypi.org --proxy http://proxy-user:passwd@proxyserver.com:3038
WGET нет в Windows, поэтому его придётся качать и устанавливать отдельно.
Синтаксис для обращения к сайтам через прокси выглядит следующим образом:
wget https://pypi.org -e use_proxy=yes -e http_proxy=proxy-user:passwd@proxyserver.com:3038
Либо прокси нужно определять на уровне переменных среды (смотри выше) и обращаться к сайтам без дополнительных опций:
wget https://pypi.org
Стандартная отладка менеджера пакетов pip настраивается через параметр -v. Чем больше «v», тем выше детализация лога:
Мобильные IP-адреса обеспечивают максимальную гибкость и бесперебойную связь.
Параметры подключения к прокси, в особенности логин и пароль, вполне можно отнести к конфиденциальной информации. В связи с этим, хранение данных о pip прокси вместе с кодом скриптов нельзя назвать безопасным. Одно дело, когда код пишет и обслуживает всего один разработчик (например, если это фан-проект или индивидуальная разработка для собственных нужд), а другое — большой коллектив и разрозненные скрипты.
В связи с этим мы рекомендуем определять данные подключения к прокси на уровне переменных среды или на уровне конфигов (ini/config файлы).
Но тогда возникает другая проблема: чем больше прокси у вас будет использоваться в проекте, тем сложнее ими будет управлять.
Тут есть элегантное, но платное решение — прокси-сервис с ротируемыми адресами. Вам достаточно создать отдельный прокси-фильтр (или порт), выдать данные для подключения к нему сотруднику, и в дальнейшем управлять параметрами выбора выходных адресов через удобный личный кабинет. Ненужные фильтры или порты легко отключаются и удаляются, например, если сотрудник уволен или прокси для данного сервиса больше не требуется.
Pip — мощное встроенное решение для управления Python-библиотеками. Этот менеджер пакетов из коробки умеет работать через прокси, что добавляет ему гибкости и функциональности.
Подключение pip к прокси можно выполнить с помощью специального синтаксиса команд в консоли, а также с задействованием переменных среды и конфигурационных файлов. Специально для pip предоставляется консольная утилита настройки — pip config.
Но мало настроить pip, нужны ещё качественные прокси. Вы можете подобрать надёжные ротируемые резидентные, мобильные и серверные прокси у нас. Froxy — это 10+ млн. IP из 200+ стран с таргетингом до города и оператора связи. Расчёт на основе потребляемого трафика.