перейти к содержанию

403 Forbidden: проклятие веб-скребков (и как этого избежать)

Если вы когда-либо пытались получить данные с веб-сайтов, вы почти наверняка в какой-то момент сталкивались с ужасной ошибкой «403 Forbidden». Этот код состояния HTTP указывает, что сервер понял ваш запрос, но отказывается его выполнить. Другими словами, у вас нет разрешения на доступ к запрошенному вами ресурсу.

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

Но не отчаивайтесь! Хотя ошибки 403 могут вызывать разочарование, они не являются непреодолимыми. Используя правильные методы, можно избежать появления ошибок 403 и обеспечить бесперебойную работу веб-скребка. В этом руководстве мы углубимся в причины ошибок 403 и рассмотрим стратегии их предотвращения. Давайте начнем!

Почему веб-скрейперы сталкиваются с ошибками 403

Есть несколько основных причин, по которым парсер может получить ответ 403 Forbidden от веб-сайта:

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

  2. Отсутствует аутентификация: Многие веб-сайты требуют той или иной формы аутентификации, например входа в систему с использованием имени пользователя и пароля, для доступа к определенным страницам. Если ваш веб-скребок не предоставляет необходимые учетные данные для аутентификации, он, скорее всего, получит ответ 403.

  3. Обнаружение ботов: веб-сайты часто используют различные методы для обнаружения и блокировки трафика, который исходит от ботов или парсеров. Если сайт считает, что ваш парсер — это автоматизированный инструмент, а не пользователь-человек, он может ответить ошибкой 403.

  4. Антиботовые системы: Некоторые веб-сайты используют специальные решения для защиты от ботов, такие как Cloudflare, Imperva или PerimeterX, для защиты от парсинга и других автоматических угроз. Эти системы анализируют структуру трафика и блокируют запросы, которые кажутся подозрительными, часто возвращая ошибки 403.

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

Обеспечение аутентификации

Если веб-сайт требует входа в систему для доступа к содержимому, которое вы хотите очистить, вам необходимо включить аутентификацию в процесс очистки веб-страниц. Обычно это включает в себя два этапа:

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

  2. Программный вход в систему: используйте библиотеку вроде Requests Python или Axios Node.js, чтобы отправить запрос на вход, имитирующий тот, который вы наблюдали. Собирайте все файлы cookie, которые возвращает сайт, поскольку они часто содержат токены сеанса, необходимые для аутентификации последующих запросов. Включите эти файлы cookie в заголовки запросов на очистку веб-страниц, чтобы поддерживать действительный сеанс входа в систему.

Вот пример программного входа на сайт с использованием Python и Requests:

import requests

# Start a new session
session = requests.Session() 

# Send a POST request to the login URL with the necessary credentials
login_data = {
    ‘username‘: ‘my_username‘,
    ‘password‘: ‘my_password‘,
}
response = session.post(‘https://example.com/login‘, data=login_data)

# The session now contains the cookies needed to authenticate future requests
response = session.get(‘https://example.com/restricted_page‘)

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

Техники скрытности

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

Некоторые ключевые методы скрытности включают в себя:

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

  • Ротация IP-адресов: Отправка большого количества запросов с одного IP-адреса — еще один тревожный сигнал для систем обнаружения ботов. Используйте прокси-сервис для маршрутизации запросов через различные IP-адреса. Для достижения наилучших результатов выберите провайдера, который предлагает большой пул домашних IP-адресов.

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

  • Обработка CAPTCHA: Некоторые веб-сайты вводят CAPTCHA при подозрении на активность ботов. Веб-скрейперам может быть сложно решить автоматически CAPTCHA. Если вы сталкиваетесь с ними часто, возможно, вам придется воспользоваться службой решения CAPTCHA, в которой для выполнения задач от имени вашего парсера привлекаются люди.

Вот пример более скрытного запроса на Python с использованием случайного пользовательского агента и задержек:

import requests
import random
import time

# List of user agent strings
user_agents = [    
    ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36‘,
    ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36‘,
    ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36‘,  
]

# Randomize user agent 
headers = {‘User-Agent‘: random.choice(user_agents)}

# Introduce a random delay of 1-5 seconds
time.sleep(random.randint(1, 5))

# Send the request
response = requests.get(‘https://example.com‘, headers=headers)

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

Необнаружимая автоматизация

Для максимально скрытного парсинга веб-страниц вы можете использовать инструмент полной автоматизации браузера, такой как Puppeteer или Playwright. Эти инструменты программно запускают настоящий браузер (Chrome или Firefox), позволяя вам взаимодействовать с веб-сайтами так, что их очень трудно отличить от реальных пользователей-людей.

Инструменты автоматизации браузера можно настроить для максимальной скрытности. Например, вы можете настроить их на блокировку кода снятия отпечатков пальцев JavaScript, маскировку явных признаков автоматизации в объектах Navigator и рандомизацию размеров области просмотра. Управляя настоящим браузером, вы также получаете автоматическую обработку файлов cookie, заголовков, перенаправлений и других аспектов HTTP, с которыми базовые библиотеки веб-скрапинга не справляются за вас.

Недостатком автоматизации браузера является то, что она требует больше ресурсов и медленнее, чем отправка простых HTTP-запросов с помощью такой библиотеки, как Requests или Axios. Однако компромисс в производительности может оказаться оправданным для сайтов, которые особенно агрессивно блокируют парсеры.

Вот базовый пример использования Puppeteer в Node.js для посещения страницы в Chrome без заголовка:

const puppeteer = require(‘puppeteer‘);

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // Configure the browser for stealth (omitted for brevity)

  await page.goto(‘https://example.com‘);

  // Scrape data from the page...

  await browser.close();
})();

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

Заключение

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

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

Если постоянно меняющаяся задача избежать ошибок 403 и других мер по борьбе с парсингом кажется сложной, вы можете рассмотреть возможность использования готового API для парсинга веб-страниц, а не создавать и поддерживать собственную инфраструктуру парсинга. Такие сервисы, как ScrapingBee и ScraperAPI, предлагают проверенные в бою парсеры со встроенным механизмом предотвращения ошибок 403, который может существенно сэкономить время на разработку.

Независимо от того, решите ли вы запустить собственный веб-скребок или использовать готовое решение, важно не допустить, чтобы ошибки 403 помешали вам получить необходимые данные. Проявив немного настойчивости и подходящие инструменты в вашем наборе, вы сможете обеспечить работоспособность веб-парсера, несмотря на любые меры противодействия ботам. Приятного скрежетания!

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *