不被阻止的 Web 抓取指南模拟人类工具,即:无头 Chrome 模拟人类行为,即:代理、验证码解决和请求模式结论

2025-05-28

不被阻止的网络抓取指南

模拟人类工具,例如:Headless Chrome

模拟人类行为,即:代理、验证码解决和请求模式

结论

网络抓取或爬取是指通过下载和解析 HTML 代码从第三方网站获取数据以提取所需数据。

但您应该为此使用 API!

并非所有网站都提供 API,而且 API 也并非总能提供您需要的所有信息。因此,这通常是提取网站数据的唯一解决方案。

网页抓取有很多用例:

  • 电子商务价格监控
  • 新闻聚合
  • 潜在客户开发
  • SEO(搜索引擎结果页面监控)
  • 银行账户聚合(美国的 Mint、欧洲的 Bankin')
  • 但还有很多个人和研究人员需要建立数据集,否则就无法获得。

那么,问题是什么?

主要问题是大多数网站不想被抓取。他们只想向使用真实浏览器的真实用户提供内容(谷歌除外,他们都希望被谷歌抓取)。

所以,当你抓取数据时,你必须小心,不要被识别为机器人,这主要体现在两个方面:使用人类工具和表现出人类行为。这篇文章将指导你了解所有可以用来保护自己的东西,以及网站用来屏蔽你的所有工具。

模拟人类工具,例如:Headless Chrome

为什么要使用无头浏览?

当你打开浏览器并访问某个网页时,几乎总是意味着你正在向 HTTP 服务器请求某些内容。从 HTTP 服务器获取内容最简单的方法之一就是使用经典的命令行工具,例如cURL

问题是,如果你只是执行以下命令:curl www.google.com,Google 有很多方法可以知道你不是人类,例如,仅通过查看标头即可。标头是每个到达服务器的 HTTP 请求附带的小块信息,其中一条信息精确地描述了发出请求的客户端,我指的是“User-Agent”标头。只需查看“User-Agent”标头,Google 就知道你正在使用 cURL。如果你想了解更多关于标头的信息,维基百科页面很棒;如果你想做一些实验,可以访问这里,它是一个简单显示你请求的标头信息的网页。

使用 cURL 修改请求头非常容易,复制一个合法浏览器的 User-Agent 请求头就可以了。在实际应用中,你需要设置多个请求头,但通常情况下,使用 cURL 或任何库人为地构造一个 HTTP 请求,使其看起来与浏览器发出的请求完全一样,并不难。这一点大家都知道,因此,要判断你使用的是否是真正的浏览器网站,需要检查 cURL 和库无法做到的一件事:JS 执行。

你会说 JS 吗?

这个概念很简单,网站在网页中嵌入一小段 JS 代码,一旦执行,就会“解锁”网页。如果你使用的是真正的浏览器,那么你不会注意到有什么区别;但如果不使用浏览器,你只会看到一个包含一些晦涩 JS 代码的 HTML 页面。

(此类代码片段的实际示例)

但再次强调,这个解决方案并非万无一失,主要是因为自从 NodeJS 出现以来,在浏览器之外执行 JS 变得非常容易。不过,Web 也在不断发展,还有其他技巧可以判断你是否在使用真正的浏览器。

无头浏览

尝试在 Node 端执行 JS 代码片段非常困难,而且非常不健壮。更重要的是,一旦网站拥有更复杂的检查系统,或者是一个大型单页应用程序,cURL 和 Node 的伪 JS 执行就变得毫无用处。因此,想要看起来像一个真正的浏览器,最好的方法就是实际使用它。

无头浏览器的行为与真实浏览器“完全”相同,只是您可以轻松通过编程使用它们。最常用的是 Chrome Headless,它具有 Chrome 浏览器的行为,但没有完整的 UI 包装。

使用 Headless Chrome 最简单的方法是调用将其所有功能包装到简单 API 中的驱动程序,SeleniumPuppeteer是两个最著名的解决方案。

然而,这还不够,因为网站现在有了可以检测无头浏览器的工具。这场“军备竞赛”已经持续了很长时间。

指纹识别

每个人,尤其是前端开发人员,都知道每个浏览器的行为方式有所不同。有时是渲染 CSS,有时是 JS,有时仅仅是内部属性。大多数这些差异都是众所周知的,现在可以检测浏览器是否真的伪装成它所伪装的浏览器。这意味着网站会问自己:“所有浏览器属性和行为是否都与我所知道的该浏览器发送的 User-Agent 信息相符?”

这就是为什么想要将自己伪装成真正浏览器的抓取工具与想要将无头浏览器与其他浏览器区分开来的网站之间存在着永无休止的军备竞赛。

然而,在这场军备竞赛中,网络爬虫往往具有很大的优势,原因如下。

大多数情况下,当 JavaScript 代码尝试检测其是否在无头模式下运行时,往往意味着恶意软件正在试图逃避行为指纹识别。这意味着 JS 在扫描环境中表现良好,但在真实浏览器中则表现糟糕。正因如此,Chrome 无头模式背后的团队才试图使其与真实用户的 Web 浏览器无法区分,以阻止恶意软件这样做。而这也正是网络爬虫在这场“军备竞赛”中能够从这种努力中获益的原因。

还有一点需要注意的是,虽然并行运行 20 个 cURL 并不难,但 Chrome Headless 虽然在小型用例中相对容易使用,但在大规模部署时却会比较棘手。主要是因为它占用大量内存,因此管理超过 20 个实例是一项挑战。

如果您想了解有关浏览器指纹识别的更多信息,我建议您查看Antoine Vastel 博客,这是一个完全致力于此主题的博客。

以上就是你需要了解的关于如何假装自己在使用真实浏览器的全部内容。现在让我们来看看如何像真人一样操作。

模拟人类行为,即:代理、验证码解决和请求模式

代理自己

使用真实浏览器的人很少会每秒从同一个网站请求 20 个页面,所以如果你想从同一个网站请求大量页面,你必须欺骗该网站,让它认为所有这些请求都来自世界上不同的地方,即不同的 IP 地址。换句话说,你需要使用代理。

代理现在不太贵:每个 IP 约 1 美元。但是,如果您每天需要在同一个网站上发出超过 1 万次请求,费用会迅速上升,因为需要数百个地址。需要注意的是,需要持续监控代理 IP,以便丢弃不再可用的 IP 并更换。

市场上有几种代理解决方案,以下是最常用的:Luminati NetworkBlazing SEOSmartProxy

还有很多免费代理列表,我不建议使用它们,因为它们通常很慢,不可靠,而且提供这些列表的网站并不总是透明地说明这些列表在哪里

代理服务器的位置。这些免费代理服务器列表大多数时候都是公开的,因此,它们的IP地址会被大多数网站自动封禁。代理服务器的质量非常重要,众所周知,反爬虫服务会维护一个内部代理IP列表,因此来自这些IP地址的所有流量都会被拦截。务必谨慎选择信誉良好的代理服务器。因此,我建议使用付费代理服务器网络或自行搭建代理服务器。

要构建自己的代理,您可以考虑使用scrapoxy,这是一个很棒的开源 API,它允许您在不同的云提供商之上构建代理 API。Scrapoxy 会通过在不同的云提供商(AWS、OVH、Digital Ocean)上创建实例来创建代理池。然后,您可以配置客户端,使其使用 Scrapoxy URL 作为主代理,Scrapoxy 会自动在代理池中分配代理。Scrapoxy 可以轻松定制以满足您的需求(例如速率限制、黑名单等),但部署起来可能有点繁琐。

您还可以使用 TOR 网络,又名洋葱路由器。它是一个全球性的计算机网络,旨在通过许多不同的服务器路由流量以隐藏其来源。使用 TOR 会使网络监控/流量分析变得非常困难。TOR 有很多用途,例如隐私、言论自由、独裁政权下的记者,当然还有非法活动。在网页抓取方面,TOR 可以隐藏您的 IP 地址,并且每 10 分钟更改一次机器人的 IP 地址。TOR 出口节点的 IP 地址是公开的。一些网站使用一条简单的规则阻止 TOR 流量:如果服务器收到来自 TOR 公共出口节点之一的请求,它就会阻止它。这就是为什么在许多

在某些情况下,与传统代理相比,TOR 帮不了你。值得注意的是,由于 TOR 的多路由特性,流量本身也慢得多。

验证码

但有时代理服务器不够用,有些网站会系统地要求你通过所谓的验证码(CAPTCHA)来确认你的身份。大多数情况下,验证码只会显示给可疑的 IP 地址,因此在这种情况下切换代理服务器即可。其他情况下,你需要使用验证码解析服务(例如2CaptchasDeathByCaptchas )。

您必须知道,虽然某些验证码可以通过光学字符识别 (OCR) 自动解决,但最新的验证码必须手动解决。

旧式验证码,可通过程序破解

Google ReCaptcha V2

这意味着,如果您使用上述服务,在 API 调用的另一端,您将有数百人以每小时低至 20 美分的价格解决 CAPTCHA 。

但话又说回来,即使你一看到 CAPCHA 就解决了它或者切换了代理,网站仍然可以检测到你的小规模抓取工作。

请求模式

网站用来检测抓取行为的最后一个高级工具是模式识别。因此,如果您计划抓取 URL www.example.com/product/中从 1 到 10,000 的所有 ID ,请尽量避免按顺序执行,也不要以恒定的请求速率执行。例如,您可以维护一个从 1 到 10,000 的整数集合,并从中随机选择一个整数,然后抓取您的产品。

举个简单的例子,有些网站还会统计每个端点的浏览器指纹。这意味着,如果你不修改无头浏览器中的某些参数,并且只针对单个端点,他们可能还是会屏蔽你。

网站也倾向于监控流量的来源,因此,如果您想抓取巴西的网站,请尝试不要使用越南的代理。

但根据经验,我可以说,速度是“请求模式识别”中最重要的因素,因此,抓取速度越慢,被发现的机会就越小。

结论

我希望这个概述能够帮助您更好地理解网络抓取,并且希望您通过阅读这篇文章学到一些东西。

我在本文中讨论的所有内容都是我用来构建ScrapingBee的,它是目前最简单的网页抓取 API。如果您不想在设置上浪费太多时间,欢迎随时测试我们的解决方案,前 1000 次 API 调用由我们承担 :)。

想了解爬虫知识,欢迎在评论区留言,我会在下一篇文章里详细讲解。
祝你爬虫愉快😎

文章来源:https://dev.to/scrapingbee/a-guide-to-web-scraping-without-getting-blocked-5e7e
PREV
如何使用 CSS 变量让响应变得非常简单
NEXT
34 款提高效率的 Chrome 扩展程序🔥 我强烈推荐安装的十大扩展程序