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. Вам нужно знать, как с ним работать, чтобы вы могли правильно конфигурировать их работу.
Несмотря на все преимущества, использование прокси-серверов может иметь и недостатки. Например, это может привести к снижению скорости соединения, так как запросы проходят через дополнительное звено. Кроме того, некоторые сайты могут блокировать доступ с известных прокси-серверов. Поэтому при использовании прокси всегда нужно учитывать как его преимущества, так и потенциальные ограничения.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ