一、说明
在数据爬取中,你的scraper又被挡住了吗?这很令人沮丧。但我们冷静下来,看看业内别人的说法,并将与您分享十种简单的解决方案来获取您想要的数据。
以下是尝试在不被阻止的情况下成功进行网络抓取的简短概述:
- 设置实际请求标头。
- 使用代理。
- 使用高级代理。
- 使用无头浏览器。
- 智胜蜜罐陷阱。
- 避免指纹识别。
- 绕过反机器人系统。
- 自动解决验证码。
- 利用 API 发挥您的优势。
- 停止重复失败的尝试。
二、避免被阻止的技术类型
您需要使您的抓取器无法检测到,以便能够从网页中提取数据,而主要的技术类型是模仿真实的浏览器和模拟人类行为。例如,普通用户不会在一分钟内向网站发出 100 个请求。
您将学习经过验证的技巧,并发现一些工具,以快速将它们实现到您的代码库中。
1. 设置实际请求标头
正如我们提到的,您的抓取活动应该看起来尽可能与浏览目标网站的普通用户相似。Web 浏览器通常会发送大量 HTTP 客户端或库不会发送的信息。
幸运的是,这很容易解决。首先,转到 Httpbin 并检查当前浏览器发送的请求标头。在我们的例子中,我们得到了这个:
网页抓取最重要的标头之一是用户代理。该字符串通知服务器有关请求用户代理的操作系统、供应商和版本。
然后,使用您喜欢的库设置这些标题,以便目标网站认为您的网络抓取工具是常规的网络浏览器。
有关具体说明,您可以查看有关如何为 JavaScript、PHP 和 Python 设置标头的指南。
2. 使用代理
如果您的抓取工具从某个 IP 地址发出太多请求,网站可以阻止该 IP。在这种情况下,您可以使用具有不同 IP 的代理服务器。它将充当您的网络抓取脚本和网站主机之间的中介。
代理有多种类型。使用免费代理,您可以开始测试如何将代理与抓取工具或爬虫集成。您可以在免费代理列表中找到一个。
但请记住,它们通常很慢且不可靠。他们还可以跟踪您的活动和连接,自我标识为代理,或使用禁止列表中的IP。
如果您认真对待网络抓取而不会被阻止,那么有更好的选择。例如, ZenRows 提供出色的高级代理服务。
理想情况下,您需要轮换 IP,因此您的活动似乎来自不同的用户,看起来并不可疑。如果一个 IP 被禁止或列入黑名单,这也很有帮助,因为您可以使用其他 IP。
代理之间的另一个本质区别是,有些代理使用数据中心IP,而另一些则依赖于住宅IP。
数据中心 IP 是可靠的,但易于识别和阻止。住宅 IP 代理更难检测,因为它们属于可能将其分配给实际用户的互联网服务提供商 (ISP)。
如何配置scraper以使用代理?
获得与刮板一起使用的代理后,您需要将两者连接起来。确切的过程取决于您拥有的刮刀类型。
如果您正在使用 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 服务工作,因此您不必将刮板和代理旋转器捆绑在一起。
4. 使用无头浏览器
为避免在网页抓取时被阻止,您希望与目标网站的交互看起来像访问 URL 的普通用户。实现这一目标的最佳方法之一是使用无头 Web 浏览器。它们是真正的 Web 浏览器,无需图形用户界面即可工作。
大多数流行的网络浏览器,如谷歌浏览器和火狐浏览器都支持无头模式。但是,即使您在无头模式下使用官方浏览器,也需要使其行为看起来真实。添加一些特殊的请求标头来实现这一点是很常见的,例如用户代理。
Selenium 和其他浏览器自动化套件允许您将无头浏览器与代理相结合。这将使您能够隐藏您的 IP 并降低被阻止的风险。
要了解有关使用无头浏览器来防止您的网络抓取工具被阻止的更多信息,请查看我们的硒、剧作家和木偶师的详细指南。
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');
}
避免蜜罐陷阱的另一个基本方法是尊重机器人.txt文件。它仅为机器人编写,并包含有关可以抓取或抓取网站的哪些部分以及应避免哪些部分的说明。
蜜罐陷阱通常与旨在指纹自动请求的跟踪系统一起使用。这样,网站将来可以识别类似的请求,即使它们不是来自同一个IP。
6. 避免指纹识别
如果您在请求中更改了很多参数,但您的抓取器仍然被阻止,则您可能已被指纹识别。也就是说,反机器人系统使用某种机制来识别您并阻止您的活动。
为了克服指纹识别机制,使网站更难识别您的抓取工具。不可预测性是关键,因此您应该遵循以下提示。
- 不要每天在同一时间提出请求。相反,请在随机时间发送它们。
- 经常更改 IP。
- 伪造和轮换 TLS 指纹。您可以在我们关于绕过 Cloudflare 的文章中了解更多信息。
- 使用不同的请求标头,包括其他用户代理。
- 将无外设浏览器配置为使用不同的屏幕尺寸、分辨率和已安装的字体。
- 使用不同的无头浏览器。
7. 绕过反机器人系统
如果您的目标网站使用 Cloudflare、Akamai 或类似的反爬虫程序服务,您可能无法抓取该 URL,因为它已被阻止。绕过这些系统具有挑战性,但有可能。
例如,Cloudflare使用不同的机器人检测方法。他们阻止机器人的最重要工具之一是“等候室”。即使你不是机器人,也应该熟悉这种类型的屏幕:
单击以全屏打开图像
在等待期间,一些 JavaScript 代码会进行检查,以确保访问者不是机器人。好消息是这段代码在客户端运行,我们可以篡改它。坏消息是,它被混淆了,并不总是同一个脚本。
我们有一个关于绕过Cloudflare的综合指南,但请注意;这是一个漫长而艰难的过程。绕过此类保护的最简单方法是使用像ZenRows这样的服务,旨在克服任何反机器人系统。
8. 自动化验证码求解
绕过验证码是抓取 URL 时最困难的障碍之一。这些计算机挑战专门用于区分人类和机器人。通常,它们被放置在包含敏感信息的部分中。
您应该考虑是否仍然可以获得所需的信息,即使您省略了受保护的部分,因为很难编写解决方案。
从好的方面来说,一些公司提供为您解决验证码。他们雇用真人来完成工作,并按解决的测试收费。一些例子是反验证码和2验证码。
总体而言,验证码解决速度慢且成本高昂。完全避免它们不是更好吗?ZenRows的反验证码将为您提供帮助,如果您正在寻找受CAPTCHA保护的内容。它将获得内容,而无需您采取任何行动。
9. 利用 API 发挥您的优势
目前,网站显示的大部分信息来自API。这些数据很难抓取,因为它通常是在用户执行某些操作后使用 JavaScript 动态请求的。
假设您正在尝试从出现在具有“无限滚动”的网站上的帖子中收集数据。在这种情况下,静态网页抓取不是最佳选择,因为您始终会从第一页获得结果。
您可以使用无头浏览器或抓取服务来配置这些网站的用户操作。ZenRows提供了一个网络抓取API,无需复杂的无头浏览器配置即可做到这一点。
或者,您可以对网站的 API 进行逆向工程。第一步是使用首选浏览器的网络检查器,并检查页面发出的 XHR (XMLHttpRequest) 请求。
然后,您应该检查发送的参数,例如页码、日期或参考 ID。有时,这些参数使用简单的编码来防止第三方使用 API。在这种情况下,您可以了解如何通过反复试验发送适当的参数。
其他时候,您必须通过真实用户和浏览器获取身份验证参数,并将此信息作为标头或 cookie 发送到服务器。无论如何,您都需要仔细研究网站对其API提出的请求。
有时,弄清楚私有 API 的工作原理可能是一项复杂的任务,但如果您设法做到这一点。解析工作将简单得多,因为您将获得已经组织和结构化的信息,通常采用 JSON 格式。
10. 停止重复失败的尝试
对于网站站长来说,最可疑的情况之一是看到大量失败的请求。最初,他们可能不会怀疑机器人是原因并开始调查。
但是,如果他们因为机器人试图抓取他们的数据而检测到这些错误,他们将阻止您的网络抓取工具。这就是为什么最好检测并记录失败的尝试,并在发生暂停抓取时收到通知。
这些错误通常是因为网站发生了更改。在继续数据抓取之前,您需要调整抓取工具以适应新的网站结构。这样,您将避免触发可能导致被阻止的警报。
三、结论
如您所见,某些网站使用多种机制来阻止您抓取其内容。仅使用一种技术来避免被阻止可能不足以成功抓取。
让我们回顾一下我们在这篇文章中看到的反块技巧:
防刮板块 | 解决方法 | 由 ZenRows 支持 |
---|---|---|
请求数受 IP 限制 | 轮换代理 | ✅ |
数据中心 IP 被阻止 | 高级代理 | ✅ |
Cloudflare 和其他反僵尸系统 | 避免可疑请求和逆向工程 JavaScript 挑战 | ✅ |
浏览器指纹识别 | 旋转无头浏览器 | ✅ |
蜜罐陷阱 | 跳过不可见链接和循环引用 | ✅ |
可疑请求的验证码 | 高级代理和类似用户的请求 | ✅ |
始终在线的验证码 | 验证码解决工具和服务 | ❌ |
请记住,即使在应用这些提示后,您也可能被阻止。节省所有这些时间!
在ZenRows,我们使用这里讨论的所有反阻止技术以及更多内容。这就是为什么我们的网络抓取 API 每秒可以处理数千个请求而不会被阻止的原因。
最重要的是,我们甚至可以创建适合您需求的定制scraper。您今天可以免费试用。
四、附录:常见问题解答
如何在不被阻止的情况下抓取网站?
网站采用各种技术来防止机器人流量访问其页面。这就是为什么您在网络抓取时可能会遇到防火墙、等候室、JavaScript 挑战和其他障碍的原因。
幸运的是,您可以通过尝试以下操作来最大程度地降低被阻止的风险:
- 设置实际请求标头。
- 使用代理。
- 使用高级代理进行网页抓取。
- 使用无头浏览器。
- 智胜蜜罐陷阱。
- 避免指纹识别。
- 绕过反机器人系统。
- 自动解决验证码。
- 利用 API 发挥您的优势。
- 停止重复失败的尝试。
为什么不允许网页抓取?
网页抓取是合法的,但并不总是允许的,因为即使是公开可用的数据也通常受版权法保护,并且需要书面授权才能用于商业用途。幸运的是,您可以遵循合理使用准则合法地抓取数据。
此外,网站可能包含受国际法规保护的数据,例如个人和机密信息,需要数据主体的明确同意。
网站可以阻止您进行网页抓取吗?
是的,如果网站检测到您的工具违反了其 robots.txt 文件中列出的规则或触发了反机器人措施,它将阻止您的抓取工具。
为了避免禁令,您可以采取的一些基本预防措施是使用具有轮换 IP 的代理,并确保您的请求标头看起来真实。此外,您的刮板应尽可能像人类一样运行,而不会太快地发送太多请求。
为什么网站会阻止抓取?
网站有很多理由阻止机器人访问其页面。例如,许多公司出售数据,因此他们这样做是为了保护他们的收入。此外,针对黑客和未经授权的数据使用的安全措施禁止所有机器人,包括抓取工具。
另一个问题是,如果设计错误,抓取工具可能会使网站的服务器因请求而过载,从而导致金钱成本并破坏用户体验。
你觉得内容有帮助吗?传播这个词并在推特或LinkedIn上分享。