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

Код статуса 503: враг веб-скребка (и как его победить)

Если вы проводили какое-то время в Интернете, вы, несомненно, сталкивались с ужасной ошибкой «503 Служба недоступна». Для обычного пользователя Интернета это незначительное раздражение. Но для парсеров это может стать серьезным препятствием на пути сбора необходимых им данных.

По данным Pingdom, ошибки 503 — это второй по распространенности код статуса 5xx, на который приходится почти 25% всех ответов об ошибках сервера. А в опросе более 1,000 разработчиков 38% заявили, что устранение неполадок и устранение 503 ошибок было одной из самых неприятных частей их работы.

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

Деконструкция ошибки 503: обзор

Прежде чем говорить о том, как избежать ошибок 503, важно понять, что они на самом деле означают.

Код состояния 503 — это код состояния ответа HTTP, указывающий, что сервер временно не может обработать запрос. Обычно это происходит из-за того, что сервер перегружен или отключен на техническое обслуживание.

Официально описание кода состояния 503 — «Услуга недоступна». Вы часто увидите это на страницах ошибок вместе с такими сообщениями, как:

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

Важно отметить, что ошибка 503 означает, что сам сервер работает нормально, но по какой-то причине он не может обработать текущий запрос. Это отличается от других ошибок 5xx, которые указывают на реальный сбой сервера:

Код состоянияФамилияОписание
500Внутренняя ошибка сервераОбщая ошибка, указывающая на непредвиденное состояние на сервере.
501Не реализованоСервер не поддерживает функционал для выполнения запроса
502Bad GatewayСервер, действующий как прокси/шлюз, получил неверный ответ от источника.
503Служба недоступнаСервер перегружен или отключен на техническое обслуживание
504Gateway TimeoutСервер шлюза не получил вовремя ответ от исходного сервера

Как видите, ошибки 503 попадают в серую зону. Сервер сам по себе не сломан, просто в данный момент он не может ответить. Это ключевое различие, к которому мы вернемся позже.

Анализ причин ошибок 503

Так что же на самом деле заставляет сервер возвращать ошибку 503? Есть несколько распространенных сценариев:

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

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

  3. Защита от DDoS-атак
    Когда веб-сайт подвергается атаке распределенного отказа в обслуживании (DDoS), он может активировать правила экстренного ограничения или блокировки скорости для защиты от вредоносного трафика. Это может привести к тому, что законные запросы попадут под перекрестный огонь и будут отклонены с ошибкой 503.

  4. Блокирует брандмауэр веб-приложений
    Многие веб-сайты маршрутизируют запросы через брандмауэр веб-приложений (WAF) для защиты от распространенных атак, таких как SQL-инъекция и межсайтовый скриптинг. Если запрос выглядит подозрительным, WAF может заблокировать его и вернуть ошибку 503.

  5. Антибот-сервис CAPTCHA
    Некоторые веб-сайты используют CAPTCHA и другие тесты «запрос-ответ», чтобы попытаться отфильтровать ботов, маскирующихся под людей. Они могут попасть в ловушку автоматизированных веб-скраперов, что приведет к ошибке 503.

Согласно отчету Imperva о плохих ботах за 2022 год, 27.7% всего трафика веб-сайтов поступает от ботов, а 30.2% этого трафика ботов является вредоносным. Неудивительно, что больше сайтов, чем когда-либо, подвергаются жестким мерам, к огорчению парсеров.

Определение основной причины вашей ошибки 503

Когда ваш парсер начнет возвращать только ошибки 503, не паникуйте. Первый шаг – выявить основную причину. Есть две основные возможности:

  1. Сайт полностью недоступен или недоступен для всех
  2. Веб-сайт доступен, но ваш конкретный парсер заблокирован.

Чтобы узнать, с каким сценарием вы имеете дело, попробуйте перейти по URL-адресу, который возвращает ошибку 503, в обычном веб-браузере или через прокси-сервер в другом географическом регионе. Если вы можете нормально зайти на сайт, это означает, что ошибки 503 относятся к вашему парсинговому IP-адресу.

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

  • DownDetector отслеживает проблемы на популярных веб-сайтах, о которых сообщают пользователи.
  • UptimeRobot и Pingdom будут отслеживать URL-адреса из нескольких мест по всему миру.
  • IsItDownRightNow и CurrentDown обеспечивают быструю проверку статуса.

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

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

Проверенная в бою тактика, позволяющая избежать ошибки 503

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

  1. Замедлите свой бросок
    Самая распространенная причина, по которой веб-сайты блокируют парсеры, заключается в том, что они слишком быстро делают слишком много запросов. Забивать сайт быстрее, чем любой человек сможет его просмотреть, крайне подозрительно. Ваша первая линия защиты должна заключаться в том, чтобы ограничить работу парсеров, чтобы они запрашивали только одну страницу максимум каждые 10–15 секунд. Также рассмотрите возможность добавления случайных задержек между запросами, чтобы время выглядело более органично.

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

  3. Сливайтесь с людьми
    Все в запросах вашего парсера должно имитировать действия обычного пользователя в обычном браузере. Это означает установку общего заголовка User-Agent, который соответствует типичным посетителям веб-сайта. Это также означает включение обычных заголовков, таких как Accept-Language и Referer. Обязательно установите банку файлов cookie для хранения и отправки обратно любых файлов cookie, которые выдает сайт.

  4. Обходите распространенные ловушки ботов
    Избегайте шаблонов сканирования, которые крайне неэффективны для человека, но распространены для ботов, например, быстрое сканирование каждой ссылки на каждой странице. Вместо этого организуйте парсеры вокруг центральной очереди целевых страниц. Соблюдайте правила файла robots.txt, которые предписывают ботам с хорошим поведением держаться подальше. И не пролистывайте одни и те же страницы снова и снова.

Восстановление после неизбежных 503-х

Иногда, даже при соблюдении всех необходимых мер предосторожности, ваш парсер все равно выдает ошибку 503. Возможно, на сайте произошел внезапный всплеск легитимного трафика, или, возможно, некоторые из ваших запросов случайно были перенаправлены через перегруженный сервер.

Если запрос не выполнен, не пытайтесь сразу же повторить его. Множество повторных попыток — это серьезный сигнал для ботов, который, скорее всего, приведет к бану вашего IP-адреса. Вместо этого используйте экспоненциальную отсрочку:

  1. Подождите 1 секунду и повторите попытку.
  2. Если снова не получится, подождите 2 секунды и повторите попытку.
  3. Если снова не получится, подождите 4 секунды и повторите попытку.
  4. Если снова не получится, подождите 8 секунды и повторите попытку.
  5. И так далее, максимум до 5 повторов.

Вот функция Python, которая реализует это:

import time
import random

def retry_with_exp_backoff(func, max_retries=5):
  for n in range(max_retries):
    try:
      return func()
    except Exception:
      if n == max_retries - 1:
        raise
      sleep_seconds = 2 ** n + random.uniform(0, 1)  
      time.sleep(sleep_seconds)

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

Если вы все еще получаете сообщение 503 после 5 повторных попыток, лучше сейчас двигаться дальше и повторить попытку позже. Возможно, перейдите на некоторое время в другой раздел сайта или просто полностью приостановите работу парсера. Не стоит выглядеть слишком настойчивым.

Ядерный вариант: использование безголового браузера

Для веб-сайтов с особенно агрессивной защитой от ботов иногда единственный способ избежать ошибки 503 — это перейти в полный скрытый режим с помощью headless-браузера.

Такие инструменты, как Puppeteer и Playwright, позволяют вам программно управлять настоящим браузером. В отличие от Selenium, они по умолчанию предназначены для автономной работы и имеют дополнительные приемы для эмуляции человеческого поведения:

  • Создание ложных движений и щелчков мышью
  • Рандомизация размера области просмотра и параметров устройства
  • Перехват и изменение запросов/ответов

Это максимальное приближение к тому, чтобы сделать парсер неотличимым от реального пользователя. Обратной стороной является то, что это довольно ресурсоемко по сравнению с отправкой простых запросов. Но для критически важных данных на сайтах, враждебных ботам, компромисс того стоит.

Было бы упущением не признать потенциальные юридические и этические последствия обхода мер противодействия ботам на веб-сайте.

В целом суды постановили, что сбор общедоступной информации не нарушает Закон о компьютерном мошенничестве и злоупотреблениях. В знаковом деле 2019 года HiQ Labs против LinkedIn Апелляционный суд 9-го округа США постановил, что очистка общедоступных профилей LinkedIn не является «несанкционированным доступом», поскольку эти данные не скрываются за входом в систему.

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

Существует также аргумент, что намеренное обход ошибки ограничения скорости 503 для продолжения взлома веб-сайта противоречит социальным нормам Интернета и приводит к пустой трате ресурсов владельца сайта. То, что вы можете, не всегда означает, что вы должны.

Как этичный веб-скребок, вы всегда должны стараться следовать правилам файла robots.txt, соблюдать неявный договор Условий обслуживания сайта и избегать неоправданной нагрузки на их серверы. Иногда лучше попытаться работать напрямую с владельцами сайтов, чтобы получить необходимые данные с помощью одобренных средств, таких как API и дампы данных.

Будущее парсинга веб-страниц и защиты от ботов

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

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

Модели машинного обучения используются обеими сторонами: скраперами для изучения шаблонов посещений людьми и веб-сайтами для изучения шаблонов запросов, подобных ботам. Скорее всего, мы увидим, как эта гонка вооружений в области искусственного интеллекта разгорится: боты будут пытаться имитировать людей, а детекторы ботов попытаются раскрыть их маскировку.

Правовая среда в отношении парсинга веб-страниц также все еще развивается, и остается много открытых вопросов о том, где парсинг переходит грань несанкционированного доступа. Мы обязательно увидим новые решения CFAA, такие как HiQ Labs против LinkedIn, которые, мы надеемся, внесут больше ясности в сообщество веб-парсеров.

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

Ключевые выводы, которые помогут избежать ошибок 503

В этом глубоком обзоре ошибок 503 Service Unavailable мы рассмотрели много вопросов. Вот ключевые моменты, которые следует запомнить:

  1. Ошибка 503 означает, что сервер веб-сайта работает нормально, но в данный момент перегружен или недоступен для обработки вашего запроса.

  2. Прежде чем приступить к дальнейшей диагностике, всегда определяйте, предназначен ли код 503 только для вас или для всего сайта.

  3. Наиболее распространенными причинами ошибок 503 являются слишком большое количество запросов, обслуживание сервера, защита от DDoS, правила брандмауэра веб-приложений и антиботовые CAPTCHA.

  4. Добавление задержек, использование ротации прокси, подмена заголовков запросов, похожих на человеческие, и различные шаблоны сканирования могут помочь сохранить ваш парсер незамеченным.

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

  6. Безголовые браузеры, такие как Puppeteer и Playwright, являются последней линией защиты от самых сложных систем защиты от ботов.

  7. Помните о потенциальной юридической «серой зоне», связанной с обходом ошибки 503 и условий обслуживания.

  8. Гонка технологических вооружений между веб-скраперами и мерами по борьбе с ботами будет только ускоряться.

Следуя этим рекомендациям и проявив некоторую сдержанность и здравый смысл, вы сможете преодолеть ошибку 503 и получить данные, необходимые для работы ваших приложений. Удачного соскребания!

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

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