Полное руководство по кодам ошибок прокси-сервера (включая решения)

Коды состояния HTTP: почему вы их получаете и как с ними бороться
3 min read
Proxy Error Codes blog image

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

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

Коды ошибок прокси-сервера

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

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

Коды 3xx: перенаправление

Для перенаправления используется код состояния HTTP 3xx, указывающий на то, что пользовательскому агенту необходимо предпринять дополнительные шаги для выполнения запроса. Обычно этот код подразумевает, что вы перенаправляетесь на новый URL-адрес из-за редакционных изменений или реструктуризации веб-сайта.

Когда речь идет о веб-скрейпинге, вам приходится иметь дело с этими перенаправлениями, чтобы обеспечить точный и эффективный сбор данных.

301: перемещено навсегда

Если вы получили сообщение об ошибке 301 , значит, искомый ресурс был перемещен навсегда. Это часто происходит, когда веб-сайт подвергается обновлениям, таким как редизайн или реорганизация контента.

Если вы столкнулись с этой ошибкой, ваш скрейпер должен перенести свои URL-ссылки в новое местоположение, вытекающее из заголовков ответа:

response_data = requests.get('http://example.com/old-page')
if response_data.status_code == 301:
    new_redirect_url = response_data.headers['Location']
    response_data = requests.get(new_redirect_url)

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

301: Moved Permanently

302: найдено (временное перенаправление)

Код состояния 302 Found означает, что ресурс, к которому вы пытаетесь получить доступ, временно перенаправлен на другой URL-адрес. В этом случае изменение не является постоянным, и предполагается, что исходный URL-адрес в какой-то момент снова станет жизнеспособным. Это часто происходит, когда веб-сайт проходит техническое обслуживание.

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

Ошибка 302 Found

304: не изменено

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

Если ваш скрейпер обращается к уже загруженной странице, заголовки запроса, такие как If-Modified-Since или If-None-Match, можно использовать для проверки того, что контент не изменился:

import requests

# Correct header format and Python syntax
headers = {'If-Modified-Since': 'Sat, Oct 29 2024 19:43:31 GMT'}

# Making a GET request to the server with the headers
response = requests.get('http://example.com/page', headers=headers)

# Checking if the status code returned is 304
if response.status_code == 304:
    print("Content has not changed.")

В этом коде вы начинаете с проверки того, является ли код ответа ошибкой 304. Если это так, то выводится ответ «Контент сообщения не изменился», и вам не нужно ничего делать:

Ошибка 304: Not Modified

307: временное перенаправление

Временное перенаправление (код состояния 307) говорит о том, что ресурс, к которому вы пытаетесь получить доступ, временно размещен по другому URL-адресу. В этом случае тот же метод HTTP и тело исходного запроса можно повторно использовать с перенаправленным URL-адресом. Это отличается от 302, где перенаправленный URL-адрес может использовать другой метод и тело:

response = requests.post('http://examples.com/submit-form', data={'key': 'value'} )
if response.status_code == 307:
    response = requests.post(response.headers['Location'], data={'key': 'value'})

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

307: Temporary Redirect

Коды 4xx: ошибки на стороне клиента

Ошибки на стороне клиента обозначаются диапазоном кодов состояния HTTP 4xx и обычно возникают из-за проблемы с запросом клиента. Часто эти ошибки приводят к исправлению параметров запроса или улучшению работы механизмов аутентификации.

400: неверный запрос

Ошибка 400: Bad Request означает, что сервер не смог понять запрос. При веб-скрейпинге это обычно происходит, когда заголовок запроса написан неправильно или в нем отсутствуют части.

Например, если вы непреднамеренно отправите информацию в неправильном формате (скажем, отправив текст вместо JSON), сервер не сможет обработать запрос, и он будет отклонен. Чтобы решить эту проблему, необходимо тщательно выполнить проверку и убедиться, что синтаксис запроса соответствует ожиданиям сервера.

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

400: Bad Request

401: несанкционированный доступ

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

401: Unauthorized

403: доступ запрещен

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

403: Forbidden

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

404: не найдено

Если сервер не может найти запрашиваемый ресурс, он возвращает ошибку 404: Not Found .
Это часто происходит, когда URL-адреса, используемые при веб-скрейпинге, изменены или повреждены, например, когда страница продукта удалена или ее URL-адрес изменен без перенаправления или обновлений.

Чтобы решить эту проблему, проверьте URL-адреса в сценарии скрейпинга и обновите их по мере необходимости, чтобы они соответствовали текущей структуре веб-сайта:

404: Not Found

В коде всегда рекомендуется обрабатывать ошибки 404 .

Если вы используете Python, но сервер не нашел ресурс, вы можете проинструктировать код передать следующий блок кода, чтобы код не останавливался при возникновении этой ошибки:

import requests

# List of URLs to fetch
urls = [
    "http://example.com/nonexistentpage.html",  # This should result in 404
    "http://example.com"  # This should succeed
]

for url in urls:
    try:
        response = requests.get(url)
        if response.status_code == 404:
            print(f"Error 404: URL not found: {url}")
            # Continue to the next URL in the list
            continue
        print(f"Successfully retrieved data from {url}")
        print(response.text[:200])  # Print the first 200 characters of the response content
    except requests.exceptions.RequestException as e:
        print(f"An error occurred while fetching {url}: {e}")
        continue  # Continue to the next URL even if a request exception occurs

print("Finished processing all URLs.")

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

407: требуется аутентификация через прокси-сервер

Ошибка 407: Proxy Authentication Required возникает, когда клиенту необходимо аутентифицироваться на прокси-сервере для продолжения запроса. Эта ошибка обычно возникает во время веб-скрейпинга, когда прокси-серверу требуется аутентификация. Это отличается от ошибки 401 , когда для доступа к данным, связанным с целевым веб-сайтом, требуется аутентификация.

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

407 Proxy Authentication Required

408: тайм-аут запроса

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

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

408: Request Timeout

429: слишком много запросов

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

Убедитесь, что вы соблюдаете ограничения скорости API целевого веб-сайта и применяете некоторые передовые методы скрейпинга, такие как отсрочка запросов, чтобы предотвратить эту проблему и сохранить доступ к необходимым ресурсам:

429: Too Many Requests

Коды 5xx: проблемы на стороне сервера

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

500: внутренняя ошибка сервера

 500: Internal Server Errorа — это общий ответ, информирующий вас о том, что на сервере возникла какая-то нештатная ситуация, которая не позволила ему выполнить конкретный запрос. Причина заключается не в ошибке клиента, а в том, что проблема находится внутри самого сервера.

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

500: Internal Server Error

501: не реализовано

Ошибка 501: Not Implemented возникает, когда серверу не удается распознать метод запроса или выполнить этот метод. Поскольку вы обычно заранее тестируете методы своего поискового робота, эта ошибка редко возникает при веб-скрейпинге, но она может возникнуть, если вы используете нетипичные методы HTTP.

Например, если ваш скрейпер настроен на использование методов, которые не поддерживаются сервером (скажем, PUT или DELETE), и эти методы необходимы для ваших функций веб-скрейпинга, вы получите ошибку 501 . Чтобы предотвратить это, убедитесь, что если ваши сценарии скрейпинга используют методы HTTP; эти методы необходимы везде:

501: Not Implemented

502: неисправный шлюз

Ошибка 502: Bad Gateway означает, что, несмотря на выполнение функций шлюза или прокси-сервера, сервер получил ненадлежащий ответ от целевого сервера и к нему осуществляется доступ для выполнения запроса. Это указывает на то, что возникла проблема со связью с промежуточными серверами.

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

502: Bad Gateway

503: услуга недоступна

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

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

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

503: Service Unavailable

504: время ожидания шлюза

Ошибка 504: Gateway Timeout возникает, когда серверу, выполняющему роль шлюза или прокси-сервера, не удается вовремя получить ответ от вышестоящего сервера. Эта ошибка связана с тайм-аутом и является разновидностью ошибки 502 .

Когда дело доходит до веб-скрейпинга, эта ошибка часто возникает, когда целевой сервер отвечает вашему прокси-серверу слишком медленно (то есть ответ занимает более 120 секунд). Для решения этой проблемы вы можете настроить параметры тайм-аута вашего скрейпера, чтобы увеличить время ожидания или проверить работоспособность и скорость реакции вашего прокси-сервера:

504: Gateway Timeout

505: версия HTTP не поддерживается

Ошибка 505: HTTP Version Not Supported возникает, когда сервер не распознает версию протокола HTTP, указанную в запросе. Это редкость при веб-скрейпинге, но может произойти, если целевой сервер настроен на поддержку только определенных версий протокола HTTP. Например, если ваши запросы на скрейпинг поступают со слишком поздней или слишком старой версией, сервер их не примет.

Чтобы избежать этой ошибки, убедитесь, что в заголовках HTTP-запроса указана версия, приемлемая для целевого сервера, скорее всего HTTP/1.1 или HTTP/2, которые поддерживаются чаще всего:

505: PHP Version Not Supported

Быстрые советы по предотвращению распространенных ошибок прокси-сервера

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

Повторение запроса

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

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

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

def requests_retry_session(
    retries=3,
    backoff_factor=0.3,
    status_forcelist=(500, 502, 503, 504),
    session=None,
):
    session = session or requests.Session()
    retry = Retry(
        total=retries,
        read=retries,
        connect=retries,
        backoff_factor=backoff_factor,
        status_forcelist=status_forcelist,
    )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    return session

s = requests_retry_session()
try:
    response = s.get('http://example.com', proxies={"http": "http://proxy_address:port"})
    print(response.text)
except requests.exceptions.HTTPError as e:
    print('HTTPError:', e)

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

Проверка настроек прокси-сервера

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

Обращение к документации и поддержке

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

Заключение

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

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

Кредитная карта не требуется