如何在不被阻止的情况下抓取网页数据

你的刮板是不是又被封了?这令人沮丧,但我们一直在那里,并将与您分享十个简单的解决方案来获取您想要的数据。

以下是如何在不被阻止的情况下成功进行网络抓取的简要概述:

  1. 设置真实的请求标头
  2. 使用代理
  3. 使用高级代理
  4. 使用无头浏览器
  5. 智取蜜罐陷阱
  6. 避免留下指纹
  7. 绕过反机器人系统
  8. 自动验证码解决
  9. 使用 API 发挥您的优势
  10. 停止重复失败的尝试

避免受阻的技术类型

你需要让你的爬虫无法检测到才能从网页中提取数据,而主要的技术类型是模仿真实的浏览器和模拟人类行为。例如,普通用户不会在一分钟内向网站发出 100 个请求。

您将学习经过验证的技巧并发现一些工具,以将它们快速实施到您的代码库中。

1.设置真实的请求头

正如我们提到的,您的抓取活动应该看起来尽可能类似于浏览目标网站的普通用户。Web 浏览器通常会发送 HTTP 客户端或库不会发送的大量信息。

幸运的是,这很容易解决。首先,转到Httpbin并检查您当前浏览器发送的请求标头。在我们的例子中,我们得到了这个:

HTTP 标头

Web 抓取最重要的标头之一是User-Agent。该字符串通知服务器有关请求用户代理的操作系统、供应商和版本。

然后,使用你喜欢的库,设置这些标题,这样目标网站就会认为你的网络抓取工具是一个普通的网络浏览器。

有关具体说明,您可以查看我们关于如何为JavaScriptPHPPython设置标头的指南。

2.使用代理

如果您的抓取工具从某个 IP 地址发出过多请求,网站可能会阻止该 IP。在这种情况下,您可以使用具有不同 IP 的代理服务器。它将充当您的网络抓取脚本和网站主机之间的中介。

有许多类型的代理。使用免费代理,您可以开始测试如何将代理与您的爬虫或爬虫集成。您可以在免费代理列表中找到一个。

但请记住,它们通常很慢且不可靠。他们还可以跟踪您的活动和联系、自我识别为代理人或使用禁止列表中的 IP。

如果您认真对待网络抓取而不被阻止,那么还有更好的选择。例如,ZenRows提供出色的高级代理服务。

理想情况下,您需要轮换 IP,这样您的活动似乎来自不同的用户并且看起来并不可疑。如果一个 IP 因您可以使用其他 IP 而被禁止或列入黑名单,这也会有所帮助。

代理之间的另一个重要区别是,一些使用数据中心 IP,而另一些则依赖住宅 IP。

数据中心 IP 可靠,但易于识别和阻止。住宅 IP 代理更难检测,因为它们属于可能将它们分配给实际用户的互联网服务提供商 (ISP)。

如何配置你的爬虫来使用代理?

一旦你获得了一个用于你的爬虫的代理,你就需要将两者连接起来。确切的过程取决于您拥有的刮刀类型。

如果您使用 Python 编写您的网络抓取工具,我们有一个关于旋转代理的详细指南。

如果您的网络爬虫运行在 Node.js 上,您可以通过以下方式配置 Axios 或其他 HTTP 客户端使用代理。

const axios = require('axios'); 
 
const proxy = { 
    protocol: 'http', 
    host: '202.212.123.44', // Free proxy from the list 
    port: 80, 
}; 
 
(async () => { 
    const { data } = await axios.get('https://httpbin.org/ip', { proxy }); 
 
    console.log(data); 
    // { origin: '202.212.123.44' } 
})();

3.使用高级代理进行网页抓取

具有住宅 IP 的高速可靠代理有时被称为高级代理。对于生产爬虫和爬虫,通常使用这些类型的代理。

选择代理服务时,重要的是要检查它是否适用于网络抓取。如果你花钱购买了一个高速的私人代理,而它的唯一 IP 被你的目标网站屏蔽了,你可能就把钱花光了。

像ZenRows这样的公司提供为网络抓取和网络爬行量身定制的高级代理。另一个优点是它作为一个 API 服务与集成代理一起工作,所以你不必将 scraper 和代理旋转器捆绑在一起。

4.使用无头浏览器

为避免在网络抓取时被阻止,您希望与目标网站的交互看起来像访问 URL 的普通用户。实现这一目标的最佳方法之一是使用无头 Web 浏览器。它们是真正的网络浏览器,没有图形用户界面。

大多数流行的网络浏览器(如 Google Chrome 和 Firefox)都支持无头模式。然而,即使你在无头模式下使用官方浏览器,你也需要让它的行为看起来真实。添加一些特殊的请求标头来实现这一点是很常见的,比如用户代理。

Selenium 和其他浏览器自动化套件允许您将无头浏览器与代理结合起来。这将使您能够隐藏您的 IP 并降低被阻止的风险。

要了解更多关于使用无头浏览器来防止您的网络抓取工具被阻止的信息,请查看我们关于SeleniumPlaywrightPuppeteer的详细指南。

5.智取蜜罐陷阱

有些网站会设置蜜罐陷阱。这些机制旨在吸引机器人,同时不被真实用户注意到。他们可以通过使用虚假数据来混淆爬虫和刮刀。

让我们学习如何在不落入陷阱的情况下获得蜂蜜!

一些最基本的蜜罐陷阱是网站 HTML 代码中的链接,但人类是看不到的。让您的爬虫或刮板识别具有使其不可见的 CSS 属性的链接。

理想情况下,您的抓取工具不应跟踪与背景颜色相同或故意对用户隐藏的文本链接。您可以看到一个基本的 JavaScript 片段,它在下面的 DOM 中标识了一些不可见的链接。

function filterLinks() { 
    let allLinksAr = Array.from(document.querySelectorAll('a[href]')); 
    console.log('There are ' + allLinksAr.length + ' total links'); 
    let filteredLinks = allLinksAr.filter(link => { 
        let linkCss = window.getComputedStyle(link); 
        let isDisplayed = linkCss.getPropertyValue('display') != 'none'; 
        let isVisible = linkCss.getPropertyValue('visibility') != 'hidden'; 
        if (isDisplayed && isVisible) return link; 
    }); 
    console.log('There are ' + filteredLinks.length + ' visible links'); 
}

避免蜜罐陷阱的另一个基本方法是尊重 robots.txt 文件。它专为机器人编写,包含有关网站的哪些部分可以被抓取或抓取以及应避免哪些部分的说明。

蜜罐陷阱通常与旨在对自动请求进行指纹识别的跟踪系统一起使用。这样,网站以后就可以识别类似的请求,即使它们不是来自同一个 IP。

6.避免指纹

如果你在请求中更改了很多参数,但你的爬虫仍然被阻止,你可能已经被指纹识别了。即,反机器人系统使用某种机制来识别您并阻止您的活动。

为了克服指纹识别机制,让网站更难识别您的抓取工具。不可预测性是关键,因此您应该遵循以下提示。

  • 不要每天在同一时间提出请求。相反,随机发送它们。
  • 经常换IP。
  • 伪造和旋转 TLS 指纹。您可以在我们关于绕过 Cloudflare 的文章中了解更多相关信息。
  • 使用不同的请求标头,包括其他用户代理。
  • 配置无头浏览器以使用不同的屏幕尺寸、分辨率和安装的字体。
  • 使用不同的无头浏览器。

7.绕过反机器人系统

如果您的目标网站使用 Cloudflare、Akamai 或类似的反机器人服务,您可能无法抓取该 URL,因为它已被阻止。绕过这些系统具有挑战性,但也是可能的。

例如,Cloudflare 使用不同的机器人检测方法。他们阻止机器人程序最重要的工具之一是“等候室”。即使您不是机器人,您也应该熟悉这种类型的屏幕:

medium_cf_waiting_room_03e6bbe363

在您等待期间,一些 JavaScript 代码会进行检查以确保访问者不是机器人。好消息是这段代码在客户端运行,我们可以篡改它。坏消息是,它被混淆了并且并不总是相同的脚本。

我们有绕过 Cloudflare的综合指南,但请注意;这是一个漫长而艰难的过程。绕过此类保护的最简单方法是使用 ZenRows 之类的服务,该服务旨在克服任何反机器人系统

8. 自动验证码解决

绕过验证码是抓取 URL 时最困难的障碍之一。这些计算机挑战专门用于区分人类和机器人。通常,它们被放置在包含敏感信息的部分中。您应该考虑是否仍然可以获得所需的信息,即使您遗漏了受保护的部分,因为编写解决方案很困难。

从好的方面来说,一些公司愿意为您解决验证码问题。他们雇用真正的人来完成这项工作,并按解决的测试收费。一些例子是Anti Captcha2Captcha

总体而言,CAPTCHA 的解决速度缓慢且成本高昂。完全避免它们不是更好吗?如果您正在寻找受验证码保护的内容,ZenRows 的 Anti-CAPTCHA将为您提供帮助。它会在您这边无需任何操作的情况下获取内容。

9. 充分利用 API

目前,网站显示的大部分信息都来自 API。这些数据很难抓取,因为它通常是在用户执行某些操作后使用 JavaScript 动态请求的。

假设您正在尝试从出现在具有“无限滚动”的网站上的帖子中收集数据。在这种情况下,静态网页抓取不是最佳选择,因为您总是会从第一页获得结果。

您可以使用无头浏览器或抓取服务来为这些网站配置用户操作。

或者,您可以对网站的 API 进行逆向工程。第一步是使用您首选浏览器的网络检查器并检查页面发出的 XHR (XMLHttpRequest) 请求。

medium_network_requests_devtools_e641202edc

然后您应该检查发送的参数,例如页码、日期或参考 ID。有时这些参数使用简单的编码来防止 API 被第三方使用。在这种情况下,您可以通过反复试验了解如何发送适当的参数。

其他时候,您必须通过真实用户和浏览器获取身份验证参数,并将此信息作为标头或 cookie 发送到服务器。无论如何,您都需要仔细研究网站对其 API 发出的请求。

medium_detailed_request_devtools_a57b53753d

有时,弄清楚私有 API 的工作原理可能是一项复杂的任务,但如果您设法做到了。解析工作会简单得多,因为您将获得已经组织和结构化的信息,通常采用 JSON 格式。

10.停止重复失败的尝试

网站管理员最可疑的情况之一是看到大量失败的请求。最初,他们可能不会怀疑机器人是原因并开始调查。

但是,如果他们检测到这些错误是因为机器人试图抓取他们的数据,他们就会阻止您的网络抓取工具。这就是为什么最好检测并记录失败的尝试,并在碰巧暂停抓取时得到通知。

这些错误的发生通常是因为网站发生了变化。在继续数据抓取之前,您需要调整您的抓取工具以适应新的网站结构。这样,您将避免触发可能导致被阻止的警报。

结论

如您所见,某些网站使用多种机制来阻止您抓取其内容。仅使用一种技术来避免被阻止可能不足以成功抓取。

让我们回顾一下我们在这篇文章中看到的反封锁技巧:

防刮板 解决方法 由 ZenRows 支持
IP请求限制 旋转代理
数据中心 IP 被封锁 高级代理
Cloudflare 和其他反机器人系统 避免可疑请求和逆向工程 JavaScript 挑战
浏览器指纹识别 旋转无头浏览器
蜜罐陷阱 跳过不可见链接和循环引用
可疑请求的验证码 高级代理和类似用户的请求
永远在线的验证码 验证码解决工具和服务
[/su_table]

请记住,即使在应用了这些提示之后,您也可能会被阻止。节省所有时间!

ZenRows,我们使用这里讨论的所有反封锁技术以及更多技术。这就是为什么我们的网络抓取 API 可以每秒处理数千个请求而不会被阻止。

常见问题

如何在不被阻止的情况下抓取网站?

网站采用各种技术来防止机器人流量访问其页面。这就是为什么您在网络抓取时可能会遇到防火墙、等候室、JavaScript 挑战和其他障碍的原因。

幸运的是,您可以通过尝试以下操作来最大程度地降低被阻止的风险:

  • 设置真实的请求标头。
  • 使用代理。
  • 使用高级代理进行网页抓取。
  • 使用无头浏览器。
  • 智取蜜罐陷阱。
  • 避免指纹。
  • 绕过反机器人系统。
  • 自动验证码解决。
  • 使用 API 发挥您的优势。
  • 停止重复失败的尝试。

为什么不允许网页抓取?

网络抓取是合法的,但并不总是被允许,因为即使是公开可用的数据也经常受到版权法的保护,并且需要书面授权才能用于商业用途。幸运的是,您可以按照合理使用准则合法地抓取数据。此外,网站可能包含受国际法规保护的数据,如个人信息和机密信息,需要数据主体的明确同意。

网站可以阻止您进行网络抓取吗?

是的,如果网站检测到您的工具违反了其 robots.txt 文件中概述的规则或触发了反机器人措施,它会阻止您的抓取工具。

您可以采取一些基本的预防措施来避免禁令,包括使用具有轮换 IP 的代理并确保您的请求标头看起来真实。此外,你的爬虫应该尽可能表现得像人一样,不要太快发送太多请求。

为什么网站会阻止抓取?

网站有很多理由阻止机器人访问其页面。例如,许多公司出售数据,所以他们这样做是为了保护他们的收入。此外,针对黑客和未经授权的数据使用的安全措施禁止所有机器人,包括爬虫。

另一个问题是,如果设计不当,爬虫可能会因请求而使网站服务器超载,从而导致金钱成本并破坏用户体验。

类似文章