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
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Slevin Уровень 64
11 июля 2025
Зачем вообще существует валидатор, который видя строку

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