完整的代理错误代码指南(包括解决方案)

HTTP状态代码:为什么会收到这些代码以及如何应对它们。
2 min read
代理错误代码

在日常的在线数据管理和网络抓取中,遇到错误的代理消息是常见的。这些错误代码是数据传输问题的重要指示器,对于诊断和解决问题至关重要。

本文概述了不同类型的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-永久移动
301-永久移动

302:找到(临时重定向)

302 Found状态代码表示您尝试访问的资源已临时移动到另一个URL。在这种情况下,变化不是永久的,原始URL预计会在某个时候再次可用。这通常发生在网站维护期间。

在网络抓取时,重要的是配置脚本以自动处理重定向,确保存储的URL保持不变。虽然许多HTTP库(如Python requests)自动处理302重定向,但确保此行为与您的抓取目标一致尤为重要,特别是在需要保持原始请求方法时:

302-找到错误
302-找到错误

304:未修改

如果您尝试访问的内容自上次验证请求以来未更新,您将收到304错误。此错误有助于提高网络抓取活动的效率,防止下载不必要的数据。

如果您的抓取工具访问已下载的页面,可以使用请求头(如If-Modified-SinceIf-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。如果是,则打印内容未更改消息,您无需执行任何操作:

307-临时重定向
307-临时重定向

307:临时重定向

临时重定向,状态代码307,表示您尝试访问的资源暂时位于另一个URL。在这种情况下,原始请求的相同HTTP方法和主体可以与重定向的URL一起重用。这与302不同,后者可以使用不同的方法和主体:

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;如果是,则将相同的数据重新发送到响应头中指定的新Location:

307-临时重定向
307-临时重定向

4xx代码:客户端错误

客户端错误由4xx范围的HTTP状态代码表示,通常是由于客户端请求的问题引起的。通常,这些错误会导致请求参数的更正或身份验证机制的操作增强。

400:错误请求

400 Bad Request错误表示服务器无法理解请求。在网络抓取中,这通常发生在请求头未正确编写或缺少部分时。

例如,如果您无意中以错误的格式发送信息(如发送文本而不是JSON),服务器无法处理请求,并且请求被拒绝。为解决此问题,必须仔细执行验证并确保请求语法满足服务器的期望。

在网络抓取中,您需要完成几个步骤以验证您的请求是否满足服务器的期望。首先,您需要了解目标网站的结构。您可以使用浏览器开发工具来帮助您检查元素并了解数据的格式。此外,您还应该实施测试和错误处理,并确保在请求中使用适当的头部:

400-错误请求
400-错误请求

401:未经授权

401 Unauthorized错误表示访问资源所需的身份验证失败或缺失。在网络抓取中,这通常发生在尝试访问需要身份验证的内容时。例如,使用错误的凭据访问基于订阅的数据会触发此错误。为避免此问题,请确保在请求中包含正确的身份验证头:

401-未经授权
401-未经授权

403:禁止访问

403 Forbidden错误表示服务器能够理解请求,但拒绝允许您访问资源。这在抓取对访问控制严格的网站时常见。当您进入网站的禁止部分时,通常会遇到此错误。例如,如果您以用户身份进行身份验证并尝试访问其他用户的帖子,您将无法这样做,因为您没有权限:

403-禁止访问
403-禁止访问

如果您收到403错误,请通过检查密钥或凭据来验证授权。如果授权不可用且您没有任何有效凭据,建议您避免抓取此内容以遵守网站的访问政策。

404:未找到

当服务器无法找到请求的资源时,它会返回404 Not Found错误。这通常发生在用于网络抓取的URL被更改或损坏时,例如当产品页面被删除或其URL在没有重定向或更新的情况下被修改。

为解决此问题,请验证抓取脚本中的URL,并根据需要更新它们以符合当前的网站结构:

404-未找到
404-未找到

建议您在代码中处理任何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-代理身份验证要求
407-代理身份验证要求

408:请求超时

408 Request Timeout状态代码表示服务器等待请求时间过长。此错误可能发生在您的抓取工具太慢或服务器在高峰时段超负荷时。

当请求时间优化和重试使用指数回退机制时,此问题可以最小化,因为服务器有足够的时间响应:

408-请求超时
408-请求超时

429:请求过多

429 Too Many Requests错误在用户在短时间内发送大量请求时出现。这在网络抓取时超过网站速率限制时很常见。例如,如果您频繁查询网站,速率限制将被激活,您将被阻止抓取数据。

确保您遵守目标网站的API速率限制,并应用一些抓取最佳实践,如延迟请求,这可以防止此问题并保持对所需资源的访问:

429-请求过多
429-请求过多

5xx代码:服务器端问题

服务器端问题由5xx系列HTTP状态代码表示,指服务器由于内部问题而无法完成请求。您必须了解这些错误在网络抓取中的含义,因为它们通常需要与处理客户端错误不同的方法。

500:内部服务器错误

500 Internal Server Error是一个通用响应,告知您服务器上发生了某些异常情况,导致无法完成特定请求。此问题不是由于客户端的任何错误引起的,而是服务器内部的问题。

例如,在抓取数据时,尝试访问服务器上的页面时可能会发生此错误。为解决此问题,可以稍后再试或计划在非高峰时间进行网络抓取项目,以免服务器负载过重:

500-内部服务器错误
500-内部服务器错误

501:未实现

501 Not Implemented错误发生在服务器无法识别请求方法或无法完成此方法时。由于您通常会预先测试抓取工具的方法,因此在网络抓取中很少发生此错误,但如果您使用非典型的HTTP方法,它可能会发生。

例如,如果您的抓取工具配置使用服务器不支持的方法(如PUT或DELETE),并且这些方法是您网络抓取功能所必需的,您将收到501错误。为防止此问题,请确保如果您的抓取脚本使用HTTP方法,则这些方法在所有地方都是必需的:

501-未实现
501-未实现

502:错误网关

502 Bad Gateway错误表示服务器尽管充当网关或代理,但从目标服务器收到不适当的响应,并访问以完成请求。这表明与中间服务器的通信存在问题。

在网络抓取时,当您使用的代理服务器无法从目标服务器获得适当的响应时,可能会发生502错误。为解决此问题,请验证代理服务器的健康状况和配置是否正常工作,并且可以与目标服务器通信。您可以监控代理服务器的CPU、内存和网络带宽使用情况。您还可以检查代理服务器的错误日志,这些日志可以指示处理请求时是否存在问题:

502-错误网关
502-错误网关

503:服务不可用

503 Service Unavailable错误表示服务器繁忙,无法提供请求。此错误可能是由于服务器维护或过载引起的。

在网络抓取时,尝试访问维护或高峰时段无法访问的网站时,您通常会遇到此错误。与表示服务器问题的500错误不同,503错误表示服务器正常运行,但目前不可用。

为避免此错误,您应该实施使用指数回退的重试策略。回退间隔应随着请求的重试次数而增加。因此,请求不应在停机期间导致服务器饱和:

503-服务不可用
503-服务不可用

504:网关超时

504 Gateway Timeout错误在服务器作为网关或代理未能及时从上游服务器获取响应时发生。此错误是超时问题,是502错误的变体。

在网络抓取时,当您的代理对目标服务器的回复太慢时(例如超过120秒),通常会发生此错误。为解决此问题,您可以调整抓取工具的超时设置以适应更长的等待时间,或验证代理服务器的健康状况和响应能力:

504-网关超时
504-网关超时

505:HTTP版本不支持

505 HTTP Version Not Supported错误在服务器无法识别请求中指定的HTTP协议版本时发生。这在网络抓取中不常见,但如果目标服务器设置为仅支持某些HTTP协议版本,可能会发生。例如,如果您的抓取请求到达的版本太新或太旧,服务器将不接受它们。

为避免此错误,您应确保HTTP请求头指定的版本是目标服务器可接受的,最可能是HTTP/1.1或HTTP/2,这是最常支持的版本:

505-HTTP版本不支持
505-HTTP版本不支持

避免常见代理错误的快速提示

代理错误可能令人沮丧,但通过在抓取工具中实施一些特定策略,可以绕过许多代理错误。

重试请求

许多代理问题是由短期问题引起的,例如短暂的网络中断或小的服务器故障。如果问题已自然解决,重试请求可能会绕过问题。

以下是如何在抓取脚本中使用Python的requests库和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的代理工具套件都可以帮助您增强网络抓取能力。