JavaRush /Курсы /Модуль 1: Python Core /Используем Proxy

Используем Proxy

Модуль 1: Python Core
13 уровень , 5 лекция
Открыта

6.1 Зачем вам прокси?

Сейчас такое время, когда в каждой стране свой собственный интернет. Теперь под запрет попадают не отдельные пользователи, а целые сайты, домены, приложения и даже страны. Нехорошо. Но если вы программист, то это не проблема — в интернете полно прокси-серверов...

Прокси-сервер (или просто прокси) — это промежуточный сервер, который выполняет роль посредника между клиентом (например, вашим компьютером) и сервером, к которому вы пытаетесь получить доступ. Прокси-сервер принимает запросы от клиента, пересылает их к целевому серверу, получает ответы и отправляет их обратно клиенту.

У каждого крупного продукта есть как минимум несколько прокси-серверов, которые выполняют различные полезные функции. Например, такие:

  • Анонимизация: Прокси-сервер может скрыть настоящий IP-адрес клиента, предоставляя анонимный доступ к интернет-ресурсам. IP-адрес — это уникальный идентификатор устройства в сети, и его скрытие помогает сохранить конфиденциальность пользователя.
  • Кэширование: Прокси-сервер может кэшировать часто запрашиваемые ресурсы, что ускоряет доступ к ним и уменьшает нагрузку на сетевые ресурсы. Например, если много пользователей запрашивают одну и ту же веб-страницу, прокси-сервер может сохранить её копию и отдавать её напрямую, не обращаясь каждый раз к исходному серверу.
  • Фильтрация контента: Прокси-сервер может блокировать доступ к определённым веб-сайтам или типам контента, обеспечивая контроль и безопасность.
  • Обход ограничений доступа: Прокси-сервер может помочь обойти региональные ограничения доступа к контенту, предоставляя доступ к ресурсам, заблокированным в определённых географических областях.
  • Логирование и мониторинг: Прокси-сервер может вести журнал всех запросов и ответов, что позволяет отслеживать и анализировать сетевой трафик.

Принцип работы прокси-сервера

  • Клиент отправляет запрос: Клиентское устройство (например, компьютер или смартфон) отправляет запрос на прокси-сервер.
  • Прокси-сервер обрабатывает запрос: Прокси-сервер получает запрос, может изменить его (например, добавить или удалить заголовки) и пересылает его на целевой сервер.
  • Целевой сервер отвечает: Целевой сервер обрабатывает запрос и отправляет ответ на прокси-сервер.
  • Прокси-сервер возвращает ответ клиенту: Прокси-сервер получает ответ от целевого сервера, может кэшировать его для последующего использования и пересылает его клиенту.

Преимущества использования прокси-сервера

  • Улучшение безопасности: Прокси-сервер может скрывать внутренние сети от внешнего мира, уменьшая риск атак.
  • Ускорение доступа: Кэширование часто запрашиваемых ресурсов снижает время доступа к ним.
  • Контроль доступа: Прокси-сервер может ограничивать доступ к определённым сайтам или типам контента, обеспечивая контроль над использованием сети.
  • Снижение нагрузки на сеть: За счёт кэширования и фильтрации трафика прокси-серверы могут уменьшить общий объём передаваемых данных и нагрузку на сеть.

Многие серверные программы ради безопасности не имеют прямого доступа в интернет. Вместо этого они обращаются к нему через прокси, а у него уже есть список разрешённых сайтов и ресурсов. Так что и ваши программы должны уметь работать с прокси.

Несмотря на все преимущества, использование прокси-серверов может иметь и недостатки. Например, это может привести к снижению скорости соединения, так как запросы проходят через дополнительное звено. Кроме того, некоторые сайты могут блокировать доступ с известных прокси-серверов.

6.2 Прокси и модуль requests

Библиотека requests поддерживает использование прокси-серверов через параметр proxies.

HTTP (Hypertext Transfer Protocol) и HTTPS (HTTP Secure) — это протоколы передачи данных в интернете. HTTPS — это защищённая версия HTTP. Для них могут использоваться разные прокси-серверы, так как они могут требовать разной обработки из-за особенностей шифрования HTTPS.

Пример использования HTTP-прокси

В качестве прокси обычно передают не один прокси, а целый список. Это очень удобно, если некоторые из прокси будут забанены или недоступны.

Пример вызова функции requests.get() с передачей запроса через proxy.


import requests

# URL-адрес, к которому выполняется запрос
url = 'http://httpbin.org/ip'
            
# Настройки прокси-сервера
proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080', }
            
# Отправка GET-запроса через прокси
response = requests.get(url, proxies=proxies)
            
print(response.json())
        

http-запросы пойдут через первый прокси-сервер, а https — через второй.

Пример использования прокси с аутентификацией

Многие прокси-серверы требуют сначала пройти аутентификацию, а потом уже дают возможность ими пользоваться. Нам на помощь придёт интересная штука…

Когда URL только придумали, то в стандарт URL заложили, что в нём можно передать сразу логин и пароль к ресурсу. Выглядит это так:


http://user:password@domain/path

Поэтому если прокси-сервер требует аутентификации, можно включить учётные данные в URL.

Пример:


import requests

# URL-адрес, к которому выполняется запрос
url = 'http://httpbin.org/ip'
            
# Настройки прокси-сервера с аутентификацией
proxies = { 'http': 'http://user:password@10.10.1.10:3128',
    'https': 'http://user:password@10.10.1.10:1080', }
            
# Отправка GET-запроса через прокси
response = requests.get(url, proxies=proxies)
            
print(response.json())
        

Я не видел, чтобы на практике этим пользовались, но если вы будете поднимать свой тестовый прокси-сервер, то почему бы и нет.

Однако стоит отметить, что передача логина и пароля в URL может быть небезопасной, так как URL может сохраняться в истории браузера или логах сервера. В реальных приложениях следует использовать более безопасные методы аутентификации.

Важно помнить о безопасном хранении учетных данных для прокси-серверов в реальных приложениях. Никогда не храните пароли в открытом виде в коде или конфигурационных файлах. Вместо этого используйте переменные окружения или защищенные хранилища секретов.

6.3 Прокси и http.client

Для работы с прокси-серверами в модуле http.client необходимо настроить соединение и заголовки запроса вручную.

Вам нужно просто указать host и порт при создании соединения.

Пример:


# Настройки прокси-сервера
proxy_host = '10.10.1.10'
proxy_port = 3128
            
# Создание соединения с прокси-сервером
conn = http.client.HTTPConnection(proxy_host, proxy_port)
        

Затем нужно установить туннель с прокси-сервером, и только потом отправить ему запрос:


dest_url = 'httpbin.org'
dest_path = '/ip'
            
# Формирование и отправка запроса
conn.set_tunnel(dest_url)
conn.request('GET', dest_path)
        

Чтобы проверить, работает ли прокси-сервер корректно, можно сравнить свой IP-адрес до и после использования прокси. Для этого можно использовать сервисы, показывающие ваш текущий IP-адрес, например, httpbin.org/ip.

Всё очень «просто». Полный пример использования HTTP-прокси с http.client будет выглядеть так:


import http.client

# Настройки прокси-сервера
proxy_host = '10.10.1.10'
proxy_port = 3128
dest_url = 'httpbin.org'
dest_path = '/ip'
            
# Создание соединения с прокси-сервером
conn = http.client.HTTPConnection(proxy_host, proxy_port)
            
# Формирование и отправка запроса
conn.set_tunnel(dest_url)
conn.request('GET', dest_path)
            
# Получение ответа
response = conn.getresponse()
print(response.status, response.reason)
print(response.read().decode('utf-8'))
            
# Закрытие соединения
conn.close()
        

Что сказать? Использование модуля requests будет, конечно, попроще. Но! Многие модули и фреймворки используют под капотом именно низкоуровневый http.client. Вам нужно знать, как с ним работать, чтобы вы могли правильно конфигурировать их работу.

Несмотря на все преимущества, использование прокси-серверов может иметь и недостатки. Например, это может привести к снижению скорости соединения, так как запросы проходят через дополнительное звено. Кроме того, некоторые сайты могут блокировать доступ с известных прокси-серверов. Поэтому при использовании прокси всегда нужно учитывать как его преимущества, так и потенциальные ограничения.

2
Задача
Модуль 1: Python Core, 13 уровень, 5 лекция
Недоступна
Использование прокси-сервера с модулем requests
Использование прокси-сервера с модулем requests
2
Задача
Модуль 1: Python Core, 13 уровень, 5 лекция
Недоступна
Использование прокси-сервера с модулем http.client
Использование прокси-сервера с модулем http.client
Комментарии (7)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Дима Белый Уровень 25
4 марта 2026
интересново
Анатолий Уровень 63
9 февраля 2026
❤️
Anonymous #6466042 Уровень 64
8 февраля 2026
В мой изначальный код, который я делал по примеру, валидатор попросил добавить заголовок 'Headers' в set_tunnel, но оказывается усугубил ситуацию. Как это было: import http.client proxy_host = '10.10.1.10' proxy_port = 3128 dest_url = 'bin.org' dest_path = '/ip' conn = http.client.HTTPConnection(proxy_host, proxy_port) conn.set_tunnel(headers = {'Host':dest_url}) conn.request('GET', dest_path) response = conn.getresponse() print(response.status, response.reason) print(response.read().decode('utf-8')) conn.close() В итоге Чат-ГПТ исправил мой не рабочий код (который валидатор, кстати, принял) и он заработал. Итог: import http.client proxy_host = '10.10.1.10' proxy_port = 3128 dest_url = 'bin.org' dest_path = '/ip' conn = http.client.HTTPConnection(proxy_host, proxy_port) conn.set_tunnel(dest_url, 80) conn.request('GET', dest_path) response = conn.getresponse() print(response.status, response.reason) print(response.read().decode('utf-8')) conn.close() Вопрос: за что я заплатил 7 тыс. р.? 😕
Степан Уровень 29
9 февраля 2026
Согласен абсолютно. Что за чепуха, не первый раз замечаю что рабочий исправный код ему не подходит, только тупое ломаное условие
Slevin Уровень 59
11 июля 2025
Зачем вообще существует валидатор, который видя строку

import http.client
Пишет, что требование "Программа должна импортировать библиотеку http.client для выполнения HTTP-запросов." не выполнено. ?
Grzegorz Strachow Уровень 8
4 апреля 2025
было бы супер, если бы вы настроили какой-то прокси сервер для учебных упражнений
UnknownReboot Уровень 30
15 апреля 2025
И мы бы сразу начали смотреть ютуб через него )))