跳到内容

503 状态代码:网络爬虫的克星(以及如何击败它)

如果您在网络上花费了一定的时间,那么您无疑遇到过可怕的“503 服务不可用”错误。对于普通互联网用户来说,这只是一个小烦恼。但对于网络爬虫来说,这可能是收集所需数据的主要障碍。

根据 Pingdom 的数据,503 错误是第二常见的 5xx 状态代码,占所有服务器错误响应的近 25%。在对 1,000 多名开发人员进行的调查中,38% 的开发人员表示排除故障并解决 503 错误是他们工作中最令人沮丧的部分之一。

作为专业的网络爬虫,您不能让 503 错误破坏您的项目。在这篇深入的指南中,我们将详细解释 503 状态代码的含义、导致它们的原因,以及最重要的是,经过验证的避免和克服它们的策略。让我们深入了解吧!

解构 503 错误:概述

在我们讨论避免 503 错误之前,了解它们的真正含义很重要。

503状态码是HTTP响应状态码,表示服务器暂时无法处理请求。这通常是因为服务器过载或停机维护而发生的。

官方对503状态码的描述是“服务不可用”。您经常会看到错误页面上显示此信息以及以下消息:

  • “由于维护停机或容量问题,服务器暂时无法满足您的请求。请稍后重试。”
  • “服务不可用,请稍后重试。”
  • “该网站的流量比平常多。请稍等,我们很快就会回来!”

需要注意的一件重要事情是,503 错误具体意味着服务器本身运行正常,但由于某种原因无法处理当前请求。这与其他指示实际服务器故障的 5xx 错误不同:

状态码名字产品描述
500内部服务器错误一般错误,指示服务器上出现意外情况
501未实现服务器不支持满足请求的功能
502错误的网关充当代理/网关的服务器收到来自源的无效响应
503服务不可用服务器过载或停机维护
504网关超时网关服务器没有及时收到源服务器的响应

如您所见,503 错误属于灰色区域。服务器本身并没有损坏,只是当时无法响应。这是我们稍后会讨论的一个关键区别。

剖析 503 错误的原因

那么到底是什么导致服务器返回 503 错误呢?有以下几种常见场景:

  1. 服务器资源超载
    每台服务器的资源都是有限的——CPU、内存、磁盘 I/O、网络带宽等。当传入请求量超出这些资源的处理能力时,服务器可能会开始拒绝新连接以避免完全崩溃。它将响应 503,表示它现在太忙,无法满足请求。

  2. 定期维修
    许多网站都有定期维护窗口,用于部署更新、运行备份或执行其他维护。在此期间,该网站可能部分或完全不可用。在维护完成并重新启动服务器之前,请求将失败并返回 503。

  3. DDoS 攻击缓解
    当网站受到分布式拒绝服务 (DDoS) 攻击时,它可能会启用紧急速率限制或阻止规则来抵御恶意流量。这可能会导致合法请求陷入冲突并因 503 错误而被拒绝。

  4. Web 应用程序防火墙块
    许多网站通过 Web 应用程序防火墙 (WAF) 路由请求,以防止 SQL 注入和跨站点脚本等常见攻击。如果请求看起来可疑,WAF 可能会阻止它并返回 503 错误。

  5. 反机器人服务验证码
    一些网站使用验证码和其他挑战响应测试来尝试过滤掉伪装成人类的机器人。自动网络抓取工具可能会受到这些陷阱的影响,从而导致 503 错误。

根据 Imperva 的 2022 年恶意机器人报告,所有网站流量的 27.7% 来自机器人,其中 30.2% 的机器人流量是恶意的。难怪越来越多的网站受到打击,这让网络爬虫感到懊恼。

确定 503 错误的根本原因

当您的网络抓取工具开始只返回 503 错误时,请不要惊慌。第一步是查明根本原因。主要有两种可能性:

  1. 该网站完全关闭或所有人都无法访问
  2. 该网站可用,但已阻止您的特定抓取工具

要了解您正在处理哪种情况,请尝试在常规 Web 浏览器中或从不同地理区域的代理浏览到返回 503 错误的 URL。如果您可以正常访问该网站,则意味着 503 错误是您抓取的 IP 地址所特有的。

您还可以使用第三方网站监控工具来检查网站的整体状态:

  • DownDetector 跟踪用户报告的热门网站问题
  • UptimeRobot 和 Pingdom 将从多个全球位置监控 URL
  • IsItDownRightNow 和 CurrentDown 提供快速状态检查

如果其中之一显示该网站对所有人来说都已关闭,则您必须等到他们解决问题。再多巧妙的编码也无法破解完全离线的网站。

但如果该网站在世界其他地方看起来不错,那就意味着您需要集中精力让您的抓取工具更好地模仿普通用户。

避免 503 错误的久经考验的策略

此时,您已确定您的抓取工具的请求被挑选出来并因 503 错误而被阻止。你能做什么?以下是一些行之有效的技术,可以让您的网络抓取工具重新赢得网站的青睐:

  1. 放慢你的滚动速度
    网站阻止抓取工具的第一个最常见原因是它们过快地发出太多请求。以比人类浏览速度更快的速度攻击网站是极其可疑的。您的第一道防线应该是限制您的抓取工具,使其最多每 10-15 秒请求一页。还可以考虑在请求之间添加随机延迟,以使时间安排看起来更加有机。

  2. 分配负载
    即使延迟增加,在短时间内从单个 IP 地址发出数百或数千个请求仍然是一个巨大的危险信号。将请求分布在轮换代理池中,使您的流量看起来像是来自不同位置的许多不同合法用户。使用来自不同子网甚至不同提供商的代理进一步增加了伪装性。

  3. 与人类融为一体
    有关抓取工具请求的所有内容都应该模仿使用常规浏览器的普通用户。这意味着设置一个与网站的典型访问者相匹配的通用用户代理标头。它还意味着包含普通标头,例如 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 错误的唯一方法是使用无头浏览器进入完全隐身模式。

Puppeteer 和 Playwright 等工具允许您以编程方式控制真实的浏览器。与 Selenium 不同,它们被设计为默认情况下无头运行,并且具有模拟人类行为的额外技巧:

  • 生成假鼠标移动和点击
  • 随机化视口大小和设备参数
  • 拦截和修改请求/响应

这是让您的抓取工具与真实用户无法区分的最接近的方法。缺点是与发送简单请求相比,它相当消耗资源。但对于机器人恶意网站上的关键任务数据来说,这种权衡是值得的。

如果我不承认规避网站机器人对策的潜在法律和道德影响,那就是我的失职。

一般来说,法院裁定抓取可公开访问的信息并不违反《计算机欺诈和滥用法》。在 2019 年具有里程碑意义的 HiQ Labs 诉 LinkedIn 案件中,美国第九巡回上诉法院认为,抓取公共 LinkedIn 个人资料并不属于“未经授权的访问”,因为该数据并非登录后的数据。

然而,一些公司已经成功地针对网络爬虫提出了侵犯版权、侵犯动产、违反合同和其他诉讼理由的索赔。在收到停止函后绕过技术限制访问网站的法律风险尤其大。

还有一种观点认为,故意绕过 503 速率限制错误来继续攻击网站违反了互联网社会规范,并且浪费了网站所有者的资源。仅仅因为你可以,并不总是意味着你应该这样做。

作为一个有道德的网络抓取工具,您应该始终尝试遵循 robots.txt 规则,遵守网站服务条款的隐含合同,并避免给服务器造成过度负担。有时,最好尝试直接与网站所有者合作,通过 API 和数据转储等经批准的方式获取所需的数据。

网页抓取与反机器人防御的未来

网络爬虫和试图阻止它们的网站运营商之间的猫鼠游戏没有任何放缓的迹象。

随着越来越多的公司意识到网络数据的价值,构建复杂的抓取工具的动机空前高涨。与此同时,许多网站正在采取更严格的反机器人措施,以保护自己免受恶意行为者的侵害。

机器学习模型被双方使用——爬虫学习人类浏览模式,网站学习类似机器人的请求模式。我们可能会看到这场人工智能军备竞赛愈演愈烈,机器人试图模仿人类,而机器人探测器则试图揭露他们的伪装。

网络抓取的法律环境也在不断发展,关于抓取是否会越界进入未经授权的访问,存在许多悬而未决的问题。我们肯定会看到更多 CFAA 的裁决,例如 HiQ Labs 诉 LinkedIn,这有望为网络抓取社区提供更多清晰度。

目前,503 错误仍然是许多爬虫存在的祸根。但通过理解它的含义、使用智能节流技术并借鉴狡猾的机器人的一些技巧,您可以克服它并保持数据流动。

避免 503 错误的关键要点

在本次深入探讨 503 服务不可用错误中,我们已经涵盖了很多内容。以下是要记住的要点:

  1. 503错误意味着网站的服务器运行正常,但过载或当时无法处理您的请求。

  2. 在进一步诊断之前,请务必确定 503 是否只适合您或整个站点。

  3. 503 错误的最常见原因是请求太多太快、服务器维护、DDoS 防护、Web 应用程序防火墙规则和反机器人验证码。

  4. 添加延迟、使用代理轮换、欺骗类似人类的请求标头以及不同的爬行模式可以帮助您的爬虫保持在雷达之下。

  5. 使用指数退避重试失败的请求,以处理临时 503,而不会显得太像机器人。

  6. 像 Puppeteer 和 Playwright 这样的无头浏览器是抵御最复杂的反机器人系统的最后一道防线。

  7. 请注意规避 503 错误和服务条款方面潜在的法律灰色地带。

  8. 网络爬虫和反机器人措施之间的技术军备竞赛只会加速。

通过遵循这些建议并运用一些克制和常识,您可以克服 503 错误并获取为应用程序提供支持所需的数据。快乐刮擦!

加入谈话

您的电邮地址不会被公开。 必填带 *