Причины возникновения
Почему же сервер блокирует доступ к данным? В процессе веб-скрапинга ошибка 403 возникает из-за механизмов защиты сайтов от несанкционированного доступа или злоупотребления ресурсами. Давайте подробнее рассмотрим причины появления данной ошибки и способы их решения.
Ограничение по IP-адресу: сайты могут ограничить доступ по IP-адресу. Если с одного IP-адреса поступает слишком много запросов, сервер может заблокировать его для предотвращения перегрузок и защиты от возможных атак.
Headless-режим: использование безголового браузера в инструментах автоматизации, таких как Selenium, также может привести к ошибкам. Некоторые веб-сайты способны распознавать, что запросы исходят из браузера в headless режиме, где отсутствует взаимодействие с пользователем (например, клики, прокрутка страницы). Это может указывать на автоматизированный доступ, который сайты могут расценивать как потенциально подозрительную активность. Но если всё же вам нужен этот режим, настройте браузер так, чтобы он имитировал реальный браузер с графическим интерфейсом.
Отсутствие необходимых заголовков и cookies. Некоторые сайты требуют наличия определенных cookies или сессий для доступа к контенту.
Некорректный User-Agent: многие сайты проверяют заголовок User-Agent с информацией о браузере и устройстве. Если не указать этот заголовок, указать неверно или не менять его в процессе масштабных запросов, сервер может отказать в доступе.
Как обойти ошибку 403 при веб-скрапинге
Для того, чтобы сбор данных выполнялся без сбоев, рассмотрим несколько эффективных методов предотвращения блокировки доступа к нужным ресурсам:
- Использование качественных прокси-серверов: периодическое изменение IP-адреса помогает избежать блокировок. Важно использовать надёжные прокси, чтобы избежать попадания в чёрные списки.
- Избегание слишком частых запросов: уменьшение частоты запросов и введение задержек между ними может помочь избежать блокировки. Если вы используете Python для вашего скрапера, библиотека time поможет установить задержки между запросами:
import time
time.sleep(5) # задержка в 5 секунд между запросами
- Имитация реального браузера. Для этого можно применить различные опции, например, как это можно реализовать в Selenium:
from selenium import webdriver
options = webdriver.ChromeOptions()
# Не добавляем параметр --headless, если нужен запуск графического браузера
options.add_argument("--headless")
# Эмуляция размера экрана
options.add_argument("window-size=1920,1080")
# Этот флаг помогает скрыть признаки автоматизации.
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)
driver.get("https://example.com")
- Если сайт требует аутентификации, важно корректно сохранять и использовать cookies. С помощью библиотеки requests можно передавать cookies вместе с запросами:
import requests
session = requests.Session()
response = session.get('https://example.com')
# использование cookies при последующих запросах
response2 = session.get('https://example.com/another-page')
- Установка правильных User-Agent: использование реалистичных User-Agent может помочь обойти блокировку. Лучше всего использовать те, что применяют популярные браузеры (например, Chrome, Firefox):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"
}
- Также можно использовать ротацию User-Agent с помощью Python-библиотеки random. Для этого нужно заранее создать отдельный список User-Agent различных браузеров и периодически обновлять его.
Пример кода для выбора случайного User-Agent из заранее созданного списка при помощи random:
import random
import requests
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.6533.122 Safari/537.3",
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/56.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15",
]
random_user_agent = random.choice(user_agents)
headers = {
"User-Agent": random_user_agent
}
response = requests.get("https://example.com", headers=headers)
print(f"Статус-код: {response.status_code}")
print(f"Используемый User-agent: {random_user_agent}")
Помимо смены User-Agent, данная библиотека позволяет также использовать случайные IP-адреса для каждого запроса из пула прокси-серверов, добавлять случайные задержки между запросами и ротировать другие элементы для имитации поведения различных пользователей и устройств.