Время прочтения: 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. Этот прокси-ротатор справится с большим объемом информации и с сайтами, защищенными от роботов.