Ich sage euch: man muß noch Chaos in sich haben, um einen tanzenden Stern gebären zu können (“Also sprach Zarathustra”, Friedrich Nietzsche)
Как в Python использовать прокси для подмены IP‑адресов
Прокси‑сервер — это приложение, которое действует как посредник запросов между клиентом, который хочет скрыть свой родной IP‑адрес, и сервером назначения, с которого клиент запрашивает определенную услугу (HTTP, SSL и т. д.).
При использовании прокси‑сервера на пути прямого подключения к серверу назначения стоит прокси‑сервер, куда и направляется запрос всего, что хотите получить, где он анализируется, передаётся серверу назначения, далее выполняется, а результат выполнения сервером назначения возвращается клиенту по схеме взятой из Википедии и показанной ниже:
Что-бы избежать блокировки своего IP‑адреса веб‑сервером назначения при парсинге частенько приходится используют несколько прокси. Ещё у прокси‑серверов есть ряд других достоинств, в том числе обход фильтров и цензуры, скрытие своего реального IP‑адреса и т. д., и т. п.
Здесь вы узнаете, как использовать Python для прокси‑подключения с помощью библиотеки request, кроме того, я буду использовать библиотеку stem, которая является библиотекой контроллера Python для Tor. Установим их из своего терминала (в Windows cmd):
pip3 install bs4 requests stem
Использование бесплатных прокси
Во-первых, есть несколько веб‑сайтов, которые предлагают список бесплатных прокси. Вот вам функция для автоматического получения подобного списка:
import requests
import random
from bs4 import BeautifulSoup as bs
def get_free_proxies():
url = "https://free-proxy-list.net/"
# получаем ответ HTTP и создаем объект soup
soup = bs(requests.get(url).content, "html.parser")
proxies = []
for row in soup.find("table", attrs={"id": "proxylisttable"}).find_all("tr")[1:]:
tds = row.find_all("td")
try:
ip = tds[0].text.strip()
port = tds[1].text.strip()
host = f"{ip}:{port}"
proxies.append(host)
except IndexError:
continue
return proxies
free_proxies = get_free_proxies()
print(f'Обнаружено бесплатных прокси - {len(free_proxies)}:')
for i in range(len(free_proxies)):
print(f"{i+1}) {free_proxies[i]}")
Однако, когда вы попытаетесь использовать сервера из списка, большинства из них вылетит по тайм-ауту. На самом деле, подобные списки недолговечны и большинство полученных прокси перестанут работать ещё до того, как вы дочитаете эту статью (поэтому, в реальной жизни приходится применять указанную выше функцию каждый раз, когда понадобятся новые прокси-серверы).
Следующая функция принимает список прокси и создает сеанс запросов, который случайным образом выбирает один из переданных прокси:
Проверим отправив запрос на веб‑сайт, который возвращает наш IP‑адрес:
for i in range(5):
s = get_session(proxies)
try:
print("Страница запроса с IP:", s.get("http://icanhazip.com", timeout=1.5).text.strip())
except Exception as e:
continue
Вот мой результат:
Страница запроса с IP: 45.64.134.198
Страница запроса с IP: 141.0.70.211
Страница запроса с IP: 94.250.248.230
Страница запроса с IP: 46.173.219.2
Страница запроса с IP: 201.55.164.177
Как видите, это некоторые IP‑адреса рабочих прокси-серверов, а не наш реальный IP‑адрес (попробуйте посетить этот веб‑сайт в своем браузере, и вы увидите свой реальный IP‑адрес).
Бесплатные прокси, как правило, умирают очень быстро, в основном за дни или даже за часы, и часто умирают до того, как закончится наш проект. Чтобы предотвратить такую ситуацию для крупномасштабных проектов по извлечению данных, нужно использовать прокси премиум-класса. Существует множество провайдеров, которые меняют IP‑адреса за вас. Одно из хорошо известных решений — Crawlera. Мы поговорим об этом подробнее в последнем разделе этой статьи.
Использование Tor в качестве прокси
Для смены IP‑адресов можно использовать сеть Tor:
import requests
from stem.control import Controller
from stem import Signal
def get_tor_session():
# инициализировать сеанс запросов
session = requests.Session()
# установка прокси для http и https на localhost: 9050
# для этого требуется запущенная служба Tor на вашем компьютере и прослушивание порта 9050 (по умолчанию)
session.proxies = {"http": "socks5://localhost:9050", "https": "socks5://localhost:9050"}
return session
def renew_connection():
with Controller.from_port(port=9051) as c:
c.authenticate()
# отправить сигнал NEWNYM для установления нового чистого соединения через сеть Tor
c.signal(Signal.NEWNYM)
if __name__ == "__main__":
s = get_tor_session()
ip = s.get("http://icanhazip.com").text
print("IP:", ip)
renew_connection()
s = get_tor_session()
ip = s.get("http://icanhazip.com").text
print("IP:", ip)
Таким образом, будет создан сеанс с IP‑адресом Tor и сделан HTTP‑запрос. Затем обновим соединение, отправив сигнал NEWNYM (который сообщает Tor установить новое чистое соединение), чтобы изменить IP‑адрес и сделать еще один запрос, вот результат:
IP: 185.220.101.49
IP: 109.70.100.21
Великолепно! Однако, когда вы попробуете парсить в сети Tor, то скоро поймете, что в подавляющем большинстве случаев скорость оставляет желать лучшего. Поэтому перейдем к более продуктивному методу.
Использование Crawlera
Crawlera от Scrapinghub позволяет сканировать быстро и надежно, сервис по‑умному управляет подключением прокси‑серверов в одном сеансе и, если вас забанят, то он это автоматически обнаружит и изменит за вас IP‑адрес.
Crawlera — это интеллектуальная прокси‑сеть, специально разработанная для парсинга и сканирования веб‑страниц. Его задача ясна: облегчить жизнь парсера, помогает получать успешные запросы и извлекать данные в любом масштабе с любого веб‑сайта с помощью любого инструмента для парсинга.
Благодаря простому API запрос, который делается при парсинге, будет перенаправляться через пул высококачественных прокси. При необходимости он автоматически создаёт задержки между запросами и удаляет/добавляет IP‑адреса для решения различных проблем сканирования.
Вот как можно использовать Crawlera с библиотекой requests в Python:
После регистрации вы получите ключ API, котором подставите в качестве значения для proxy_auth.
Итак, вот что происходит с Crawlera:
Вы отправляете HTTP‑запрос, используя API единой конечной точки.
Он автоматически выбирает, подменяет, ограничивает и заносит в черный список IP‑адреса для получения целевых данных.
Он обрабатывает заголовки запросов и поддерживает сеансы. В результате ваш запрос для конечной точки всегда будет успешным.
Заключение
Существует несколько типов прокси, включая бесплатные прокси, анонимные прокси, элитные прокси. Если ваша цель использования прокси — не дать веб‑сайтам блокировать ваши парсеры, то элитные прокси — оптимальный выбор, для веб‑сайта вы станете похожи на обычного пользователя, который вообще не знает, что такое прокси.
Более того, дополнительная анти-мера очистки — это использование ротационных пользовательских агентов, в которых вы каждый раз отправляете изменяющийся поддельный заголовок, говоря, что вы обычный браузер.
Наконец, Crawlera экономит ваше время и энергию, автоматически управляя прокси-серверами, а также предоставляет 14-дневную бесплатную пробную версию, так что вы можете просто попробовать ее без какого-либо риска. Если вам нужно прокси-решение, то настоятельно рекомендую вам попробовать Crawlera.