Время прочтения: 3 мин.

В своей статье «Извлечение всех ссылок вэб-сайта с помощью Python» я отметил, что сканирование (парсинг) вэб-сайта с помощью кода Python (например, с целью извлечения всех ссылок этого сайта) может привести к тому, что ваш IP-адрес будет заблокирован.

В этой статье предлагаю рассмотреть, один из примеров того, как использовать «бесплатные» прокси-серверы для того, чтобы это избежать блокировки вашего ip-адреса.

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

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

Итак, начнем с установки необходимых библиотек.

pip install bs4 requests

Импортируем библиотеки.

import requests
import random
from bs4 import BeautifulSoup as bs

Далее создаем функцию, с помощью которой получим список бесплатных прокси-серверов, например, с одного из сайтов, который располагает данной информацией.

def get_proxy():
    url = "https://free-proxy-list.net/"
    # формируем объект sp, получив ответ http
    sp = bs(requests.get(url).content, "html.parser")
    proxy = []
    for row in sp.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}"
            proxy.append(host)
        except IndexError:
            continue
    return proxy

Выполним эту функцию и посмотрим на полученный список. Надо заметить, что срок «жизни» этого списка недолгий. И для получения нового списка необходимо будет снова выполнить функцию get_proxy().

get_proxy()
proxy = get_proxy()
print(proxy)

На данном рисунке представлен фрагмент полученного списка.

Другая функция, назовем ее get_session, получив этот список создает сеанс запросов, который случайно выбирет для этого сеанса один из переданных ip-адресов прокси.

def get_session(proxy):
    # создание сеанса запроса
    session = requests.Session()
    # случайный выбор proxy
    proxy_ = random.choice(proxy)
    session.proxy = {"http": proxy_, "https": proxy_}
    return session

Чтобы это проверить, выполним следующий код, который отправит запрос на сайт http://icanhazip.com, возвращающий наш ip-адрес.

for i in range(4):
    q = get_session(proxy)
    try:
        print("Request page with IP:", q.get("http://icanhazip.com", timeout=1.5).text.strip())
    except Exception as e:
        continue

Из полученного результата можем видеть, что это будет не наш фактический ip-адрес, а один из ip-адресов списка proxy.

Request page with IP: 124.158.183.196
Request page with IP: 163.44.153.98
Request page with IP: 191.235.239.84
Request page with IP: 109.200.155.197

Если потребуется использовать прокси-сервер в более длительном процессе парсинга, то можно воспользоваться сервисом, предоставляемым Crawlera. Этот прокси-ротатор справится с большим объемом информации и с сайтами, защищенными от роботов.