ПРОКСИ ДЛЯ ЗАМЕНЫ IP-АДРЕСА
В своей статье «Извлечение всех ссылок вэб-сайта с помощью 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. Этот прокси-ротатор справится с большим объемом информации и с сайтами, защищенными от роботов.