当人们说他们想在爬取时保持匿名,他们通常的意思比听起来更实际:他们希望爬虫表现得像一位体贴的访客,不会让站点超载、不会让来自其网络的每个请求都被标记,也不会耗尽他们所依赖的 IP 地址。这里的匿名性是关于在站点限制内运营并保护你自己的基础设施,而非掩盖不良行为或绕过你已同意遵守的规则。

本指南介绍最重要的技术:轮换 IP 和代理、控制请求节奏并尊重速率限制、管理用户代理和请求头、处理 Cookie 和会话,以及将难点卸载给托管代理。每一个都减少了正常、善意的爬取触发自动防御的机会。读完本文,你应该知道如何在不让你自己的 IP 或目标服务器承受不必要压力的情况下可靠地收集公开数据。

爬取时匿名的真正含义

Web 服务器看不到你的意图。它只看到一串请求,并根据信号决定如何处理它们:请求到达的频率、它们来自哪个 IP、用户代理和请求头说什么,以及模式是否像是人在浏览还是脚本在轰炸端点。当这些信号看起来异常时,服务器可能会降低你的速度、提供 CAPTCHA 或直接封锁该地址,通常是作为自动响应而非个人判断。

因此,保持匿名主要是关于不因错误原因而引人注目。将负载分散在多个地址、合理控制节奏并提供诚实一致客户端信息的爬取看起来像普通流量,这正是你在任何量级收集公开数据时想要的。这也保持你自己的网络健康:被限速或列入黑名单的单一 IP 可能会中断同一地址上不相关的工作,因此分发和节奏请求既保护爬取也保护你的基础设施。

你与站点之间的层级。轮换 IP、真实请求头和节奏请求位于你的机器人和目标之间,使站点看到普通流量,而非一台机器对其狂轰滥炸。

爬取时保持匿名的技巧

以下技巧相互叠加。没有哪个是银弹,但综合起来,它们使爬取能在数小时内干净运行,而不是在遇到第一个防御时就停滞。在设置新爬虫时按顺序逐一实施。

1. 轮换 IP 和代理

服务器读取的最清晰信号是来源 IP。当数百个请求在短时间内从一个地址到达时,该地址会被标记、限速或封锁,之后来自它的每个请求都要付出代价。将请求分散到一组地址中,可以让其中任何一个都远低于阈值,这意味着单次封锁不会停止整个任务。

你可以轮换数据中心代理、住宅代理或两者混合,取决于站点和你的预算。重要的是,没有单一 IP 承载任何人类都无法合理产生的流量。轮换还保护你自己的主要网络:如果你直接从办公室或服务器 IP 爬取,它被列入黑名单后,可能会影响共享该地址的普通浏览和服务。我们关于如何使用轮换代理的指南详细介绍了这些模式,不被封锁地爬取网站中更广泛的检查清单展示了轮换在其他防御中的位置。

2. 控制请求节奏并尊重速率限制

速度是第二个暴露信号。脚本发射请求的速度远超任何人点击的速度,这种突发速率是服务器最容易检测的信号之一。修复方法简单且体贴:慢下来。在请求之间添加延迟,保持适度的并发,让爬虫在页面之间喘息,而不是以网络允许的最快速度获取。

请求之间几秒钟的延迟,加上一点随机性使间隔不完全均匀,效果显著。许多站点也会发布或执行速率限制,有时通过 429 Too Many Requests 响应或 Retry-After 请求头发出信号。将这些视为指令,而非障碍:看到它们时退后。节奏保护目标服务器免受不必要负载,也保护你免受过度负载招致的封锁。爬取越快,对所有人越不好,包括下一个需要该数据的人。

3. 管理用户代理和请求头

每个 HTTP 请求都携带描述发出请求的客户端的请求头,服务器最常检查的是用户代理字符串。像 python-requests/2.x 这样的默认库用户代理立刻宣布是机器人。设置真实的、当前的浏览器用户代理使请求看起来像它声称的那样,在一小组合理值之间轮换避免了来自一个来源的数千个相同指纹的模式。

请求头也应该一致且完整。真实浏览器会一起发送 AcceptAccept-LanguageAccept-Encoding 和类似请求头;带有浏览器用户代理但没有其他请求头的请求看起来不匹配。以下是在 Python 中设置诚实、一致请求头的简短示例:

python
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/120.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept": "text/html,application/xhtml+xml",
}

保持用户代理更新。浏览器经常更新,固定在多年前版本的字符串本身就是一个暴露信号。如果你想深入了解请求的构建,我们关于使用 curl 发送 HTTP 请求头的说明展示了命令行的机制。

Cookie 和会话是站点识别回访用户的方式,它们两面都有作用。继续携带 Cookie 可以使一系列请求看起来像一个连贯的浏览会话,这正是站点期望连续性时你想要的。但处理不当会产生新问题。当 Cookie 不存在时,有些站点将会话 ID 编码到 URL 中,因此忽略 Cookie 的爬虫可能会在每次访问时生成一个新会话(以及一组新的 URL),使爬取膨胀为几乎重复页面的循环。

实用规则很简单。在逻辑会话内跨请求持久化 Cookie,使站点看到一致的状态,但不要无限期地重用一个会话,因为这会将所有流量集中在单一身份背后。轮换 IP 时,同时轮换或重置会话,使会话和地址讲述相同的故事。对登录后的任何内容要谨慎:经过认证的爬取将每个请求与一个账号绑定,这消除了你试图保留的大部分匿名性,并且通常违反站点的服务条款。

5. 使用托管代理或爬取服务

单独来看,轮换、节奏、请求头、会话和 CAPTCHA 处理各自都是可管理的,但在规模上跨许多各自不同防御的站点维护所有这些,本身就是一个项目。托管代理或爬取服务将这些关注点折叠进一个端点:你发送一个 URL,服务在幕后处理 IP 轮换、请求头管理、重试和 CAPTCHA 解决,返回页面就好像普通浏览器已获取它一样。

这就是卸载的回报所在。不必为每个站点分别维护代理池和调整延迟,你让为此构建和维护的基础设施承担这些负载,这让你自己的地址远离火线,你的代码专注于数据而非管道。

Crawlbase Crawling API

如果自己维护代理池、请求头轮换和 CAPTCHA 处理听起来超出你想要拥有的范围,Crawlbase Crawling API 将所有这些整合进单一请求。它轮换 IP、管理请求头、重试失败的获取,并自动处理 CAPTCHA,因此你在站点限制内收集公开数据,而不暴露自己的网络。你获得 1,000 个免费请求起步,只为成功的请求付费。

保持爬取干净的其他行为

除了五个核心技巧,还有一些习惯可以完善行为良好的爬虫。它们单独来看较小,但综合起来保持你的流量看起来普通。

尊重 robots.txt

站点根目录的 robots.txt 文件声明了所有者希望自动化客户端访问的路径以及频率。尊重它是体贴爬取的基准:它告诉你哪里受欢迎,使你远离所有者要求机器人避开的部分,并帮助你远离主要为了抓住忽略规则的爬虫而存在的区域。读取并遵循它是在站点声明的限制范围内正确行事的最简单方式。

注意蜜罐陷阱

有些站点植入对人类访客不可见的链接,用 CSS 隐藏,如 display: none 或与背景混合的颜色。人类从不看到或点击它们,但跟随每个链接的朴素爬虫会,这样做会将客户端标记为自动化。充分解析页面以跳过真实浏览器永远不会渲染的链接,可以让你远离这些陷阱,并使你的行为与正常访客无法区分。

变化爬取模式

以刻板、相同节律点击页面的爬虫很容易被发现,正是因为它从不偏离。引入适度的变化,稍微不同的延迟、不那么机械的页面顺序、偶尔的暂停,使流量更像真实人在浏览而非在轨道上运行的脚本。目标不是欺骗;只是人类流量是不规则的,与这种不规则性匹配使普通爬取不会显得异常。

识别何时被封锁

了解封锁的迹象让你在情况变糟之前退后。注意状态码如 403 Forbidden429 Too Many Requests503 Service Unavailable 以及突然连续的 404 或重定向响应,还有 CAPTCHA 页面出现在内容曾经所在的地方,或交付中的异常延迟。当这些出现时,正确的响应是降低速度、轮换地址,并重新考虑你的节奏,而不是加大力度。关于 CAPTCHA 方面,我们关于爬取时处理 CAPTCHA 的演练涵盖了各种选项。

负责任地爬取

匿名是成为好访客的方式,而非忽视规则的许可证。坚持公开数据,阅读并尊重每个站点的服务条款和 robots.txt,保持合理的请求速率,避免降低真实用户的服务质量。除非有明确许可,否则避免版权媒体和登录或付费墙后的任何内容,当数据涉及个人信息时,按照 GDPR 和 CCPA 等法规处理。轮换 IP 和控制请求节奏是在站点限制内运营并保护你自己基础设施的工具,而非规避你已同意遵守的限制。这样使用,它们保持你的爬取可持续且你的数据收集可辩护。关于爬取如何融入更广泛工具集的完整图景,参见我们的网络爬取技术和框架概述

回顾

核心要点

  • 匿名是关于融入,而非规避规则。分散负载并控制节奏的行为良好的爬取看起来像普通流量,并在站点限制内运营。
  • 轮换 IP 和代理。将请求分散到一组地址中,使任何单一地址低于阈值,并保护你自己的网络免于被列入黑名单。
  • 控制请求节奏并尊重速率限制。添加随机延迟,保持适度并发,并在 429Retry-After 信号时退后,以避免使服务器超载。
  • 提供诚实、一致的客户端信息。使用带有完整匹配请求头集的当前浏览器用户代理,并处理 Cookie 和会话使请求讲述连贯的故事。
  • 将难点卸载给托管代理。爬取服务将轮换、请求头、重试和 CAPTCHA 处理折叠进一个端点,使你的地址远离火线。

常见问题

匿名爬取是否合法?

当你尊重每个站点的服务条款和 robots.txt,并避免受限或版权内容时,爬取公开数据通常是合法的。使用轮换代理和控制请求节奏本身不是非法的;这些是分发负载和保护你自己基础设施的标准工具。合法性取决于你收集什么以及如何收集,而不是你的流量是否分散在多个地址上。当涉及个人数据时,遵循 GDPR 和 CCPA 等法规。

为什么即使我慢慢爬取,我的请求也会被封锁?

速度只是一个信号。服务器还会查看来源 IP、用户代理和请求头、Cookie 和会话行为,以及你的访问模式是否可疑地规律。如果你所有请求都来自一个带有默认库用户代理的地址,即使速度很慢也可能被标记。将慢节奏与 IP 轮换和诚实、一致的请求头结合起来,而不是依赖任何单一措施。

我需要多少 IP 或代理?

这取决于你的请求量和目标站点的严格程度。原则是没有单一地址应该承载任何人类都无法合理产生的流量,因此调整你的池大小使每个 IP 舒适地低于该线。小型、繁忙的爬取可能只需要少数几个地址,而跨防御性站点的大型任务需要很多。托管服务为你处理这种大小调整。

我应该使用什么用户代理?

使用真实的、当前的浏览器用户代理,而不是默认的库字符串,并发送真实浏览器包含的支持请求头,如 AcceptAccept-Language,使请求在内部一致。在一小组合理的、最新的值之间轮换避免了数千个相同指纹的模式。保持字符串更新,因为固定到过时浏览器版本的用户代理本身就是一个暴露信号。

我应该在登录后爬取以获取更多数据吗?

通常不应该。经过认证的爬取将每个请求与一个账号绑定,这消除了你试图保留的匿名性,并且经常违反站点的服务条款,使账号本身面临风险。优先使用公开可访问的页面。如果项目确实需要经过认证的访问,确保你有明确许可,并了解你是在该账号的身份下运营,而非作为匿名流量。

托管代理能让我的爬取匿名吗?

托管代理或爬取服务为你处理 IP 轮换、请求头管理、重试和 CAPTCHA 解决,使你的流量融入,你自己的地址远离火线。这防止合法爬取被标记并保护你的基础设施,但它不是绕过站点规则的方式。无论谁路由请求,你仍然有责任尊重服务条款、robots.txt 和合理的速率限制。

开始构建

大规模爬取任何站点,无需与基础设施对抗。

Crawlbase 负责处理代理、指纹和 CAPTCHA,让你的团队专注于交付数据流水线,而非维护爬取管道。1,000 次请求免费,无需信用卡。

自助开通 · 无需销售通话 · 提供企业级爬取量