//
Ошибка 403 и другие проблемы при веб-скрапинге: почему возникают и как избежать?
Веб-скрапинг

Ошибка 403 и другие проблемы при веб-скрапинге: почему возникают и как избежать? 

Веб-скрапинг — процесс, который позволяет автоматизировать сбор данных с различных источников. Однако часто так бывает, что при попытке получить доступ к информации скрапер может столкнуться с различными препятствиями, одним из которых является распространённая ошибка 403 Forbidden. Эта ошибка указывает на то, что сервер заблокировал доступ к запрашиваемому ресурсу. Чтобы эффективно заниматься веб-скрапингом, важно понимать причины её возникновения и знать методы её обхода. В этой статье мы рассмотрим, что такое ошибка 403, почему она возникает, какие стратегии помогут её обойти, а также разберём другие ограничения при сборе данных и способы их решения. 

Начните сейчас и автоматизируйте решение hCaptcha

Причины возникновения

Почему же сервер блокирует доступ к данным? В процессе веб-скрапинга ошибка 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 при последующих запросах

 

# Отправка второго запроса с теми же 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.6533.122 Safari/537.36"

}

Также можно использовать ротацию User-Agent с помощью Python-библиотеки random. Для этого нужно заранее создать отдельный список User-Agent различных браузеров и периодически обновлять его. 

Пример кода для выбора случайного User-Agent из заранее созданного списка при помощи random

import random

import requests

 

# Список User-Agent

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",

]

 

# Выбор случайного User-Agent

random_user_agent = random.choice(user_agents)

 

headers = {

    "User-Agent": random_user_agent

}

 

# Пример запроса с использованием случайного User-Agent

response = requests.get("https://example.com", headers=headers)

 

# Вывод статус-кода ответа и используемого User-Agent

print(f"Статус-код: {response.status_code}")

print(f"Используемый User-agent: {random_user_agent}")

Помимо смены User-Agent, данная библиотека позволяет также использовать случайные IP-адреса для каждого запроса из пула прокси-серверов, добавлять случайные задержки между запросами и ротировать другие элементы для имитации поведения различных пользователей и устройств. 

 

Какие ещё бывают трудности при веб-скрапинге? 

Помимо ошибки 403, скраперы часто сталкиваются и с другими ошибками: 

  • 401 Unauthorized: доступ запрещён без учётных данных. Решение — использование аутентификации с логином и паролем.
  • 500 Internal Server Error: проблема на стороне сервера. Решение — повторить запрос позже или сообщить администратору.
  • 429 Too Many Requests: слишком много запросов. Решение — уменьшение частоты запросов, использование прокси.
  • Запутанная HTML-структура: при веб-скрапинге можно столкнуться с обфусцированным HTML-кодом, где классы, идентификаторы и другие элементы имеют непонятные или динамически генерируемые имена. Решение — использование устойчивых XPath или CSS селекторов, поиск элементов по текстовому содержанию, а также специальных библиотек, например, lxml, для парсинга и обработки HTML. В сложных случаях можно применять TensorFlow или PyTorch для создания моделей машинного обучения, которые способны распознавать паттерны и классифицировать обфусцированные элементы на основе большого объёма данных. Важно понимать, как именно сайт обфусцирует данные, чтобы адаптировать стратегии скрапинга соответствующим образом.

Ещё одно распространённое препятствие – это капча, система защиты сайтов, которая часто появляется по схожим причинам. Но не стоит беспокоиться, ведь есть множество сервисов, которые помогают эффективно обходить такие ограничения, и одним из лучших является CapMonster Cloud. Этот удобный облачный инструмент предоставляет API для автоматического решения капч, что значительно облегчает работу. Вот шаги для интеграции CapMonster Cloud в ваш скрапер-код на Python:

  • Регистрация и получение API-ключа. Для использования CapMonster Cloud вам необходимо зарегистрироваться в сервисе и получить API-ключ для аутентификации запросов к сервису.
  • Установка необходимых библиотек. CapMonster Cloud имеет собственные библиотеки для разных языков. Рассмотрим подключение официальной библиотеки для языка Python: 

pip install capmonstercloudclient

С помощью этой библиотеки можно легко составить задачу, отправить её  на сервер и получить ответ: 

import asyncio

from capmonstercloudclient import CapMonsterClient, ClientOptions

from capmonstercloudclient.requests import RecaptchaV2ProxylessRequest

 

async def solve_captcha(api_key, page_url, site_key):

    client_options = ClientOptions(api_key=api_key)

    cap_monster_client = CapMonsterClient(options=client_options)

 

    recaptcha2request = RecaptchaV2ProxylessRequest(websiteUrl=page_url, websiteKey=site_key)

    responses = await cap_monster_client.solve_captcha(recaptcha2request)

    return responses['gRecaptchaResponse']

 

async def main():

    api_key = 'YOUR_CAPMONSTER_API_KEY'

    page_url = 'https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=low'

    site_key = '6Lcf7CMUAAAAAKzapHq7Hu32FmtLHipEUWDFAQPY'

 

    captcha_response = await solve_captcha(api_key, page_url, site_key)

    print("Решение капчи:", captcha_response)

 

if __name__ == "__main__":

    asyncio.run(main())

Полезные ссылки 

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

Веб-скрапинг отлично справляется даже с самыми большими объёмами данных, но частые ошибки могут усложнить процесс. Понимание причин ошибок, таких как 403, и применение правильных методов обхода — настройка User-Agent, использование прокси и сервисов для капчи — сделает вашу работу эффективнее. Следуя проверенным методам, вы уменьшите риск блокировок и упростите сбор данных, а внимательный подход к задаче не только упростит работу, но и обеспечит положительный опыт взаимодействия с веб-ресурсами. 

NB: Напоминаем, что продукт используется для автоматизации тестирования на ваших собственных сайтах и на сайтах, к которым у вас есть доступ на законных основаниях.