我们使用联盟链接。它们让我们能够维持运营,而您无需承担任何费用。

网页抓取最佳实践:成功网页抓取指南

我们准备了一些在收集数据时会很有用的技巧和窍门。

网页抓取最佳实践

众所周知,网站会使用各种反爬取技术(如速率限制或 IP 地址禁令)来防范机器人。这些和其他障碍可能会决定您能否成功收集所需的数据。但有时,您所需要的只是同等的知识和一些技巧,以避免在此过程中遇到挑战。

从 IP 地址和用户代理轮换到处理重定向和改进数字指纹,即使是抓取大神也会寻找有效的指南。我们整理了 最佳网页抓取实践 帮助您解决 IP 拦截、请求限制,甚至网站结构变化等技术问题。继续阅读本指南,并掌握要遵循的网页抓取最佳实践。

网站如何检测网络爬虫?

如果你观察一下人们的浏览方式,就会发现这种模式很混乱。相反,机器人是可以预测的——单调乏味,而且比实际用户快得多。这是一个明显的迹象,因为网站可以通过跟踪你的 IP 地址来监控流量——你在特定时间范围内发出的连接请求的数量和模式。任何异常活动都会引起警觉。

但这还不是全部。网站还可以使用各种指纹识别方法识别您的设备和软件特征。例如,他们可以通过网络爬虫在 HTTP 请求标头中发送的标识符(如 cookie 或用户代理)来识别网络爬虫。最先进的指纹识别技术甚至可以跟踪页面上的鼠标移动,以确定用户是否是机器人。

网页抓取面临的挑战

网站处理不受欢迎的访问者的一种方法是 阻止他们的 IP 地址。有些甚至会封禁整个 IP 范围——来自同一 子网。这主要发生在您使用数据中心代理时。

有些网站的反应是 限制你的连接请求, 这意味着您将在一段时间内无法收集数据。时间范围因目标服务器而异。这会减慢您的抓取工具的速度,如果您继续进行不良行为,可能会导致 IP 地址被禁止。

抓取可能会给你带来更多障碍。你可以在我们的文章中阅读更多关于如何克服频繁 网页抓取挑战.

网页抓取最佳实践

1. 考虑网站的指南

想象一下网站是某人的家——它有规则要遵守。大多数网站都设置了管理机器人流量的说明,称为 的robots.txt。它们概述了哪些页面可以抓取、抓取频率以及哪些页面无法抓取。另一个重要指导原则是,您应该阅读服务条款 (ToS),这是您与目标网站之间的合同。某些 ToS 涉及抓取政策,明确禁止您从域中提取任何数据。这些规则很少具有法律约束力,但如果您不小心,它们可能会给您带来麻烦。如果有一件事您应该记住,那就是不要抓取登录后的数据——尤其是在社交媒体平台上。这已经引起了多起诉讼,并给您带来了相当大的风险。

2. 礼貌地刮擦

大多数网页抓取工具可以同时运行数百个请求。问题是,小型网站没有足够的资源来处理如此大的负载。因此,如果你过于频繁地访问它们,可能会意外导致服务器崩溃。

为了避免这种情况,您应该适应目标的能力:在请求之间增加延迟,在非高峰时段收集数据,并且不要成为负担。这样做会让每个人的体验更好。

3. 发现 API 端点

网站正变得更加直观,并针对任何设备(包括电脑、平板电脑和智能手机)进行了优化。它们使用 客户端 渲染——使用 JavaScript 直接在浏览器中渲染 HTML 页面。这允许延迟加载或无限滚动等操作,从而使网络抓取过程复杂化。但这也有好的一面:交互式网站通常通过后端 API 获取元素。内容以 .json 格式呈现,JavaScript 将所有内容放到位。即使网站没有记录的 API,也可能存在可供您使用的“隐藏”API。通常,在抓取 JavaScript 呈现的网站时,您只能通过加载 JavaScript,然后解析 HTML 来获取数据。但是,如果您设法通过检查请求对 API 端点进行逆向工程,则可以获取结构化数据并同时使用更少的带宽。寻找 GraphQL 端点 – 这可能是处理动态网站中大型数据集最流行的方法。

4. 更换你的 IP 地址

网页抓取需要在短时间内发出大量连接请求。数百个蜘蛛使你的服务器超载,这可不是件好事,因此网站会施加请求限制,使用 CAPTCHA 等反抓取技术,甚至屏蔽 IP 地址。但我们有一个名为的解决方案 IP轮换.

实现 IP 轮换的一种方法是使用代理。我建议选择 轮换代理提供商 每次请求连接时都会自动轮换您的代理 IP。除非您的工作流程要求您连续多次请求时使用相同的身份,否则请尽量避免使用粘性会话。另外,请注意,有些代理会阻止来自云托管服务(数据中心代理)的 IP,因此您可能需要改用住宅地址。

5. 了解何时使用无头浏览器

无头浏览器 就像常规的 Web 浏览器(Chrome 或 Firefox),只是没有用户界面。 网络抓取,有两种方法可以实现无头浏览器:要么它是必不可少工具,要么与项目成功无关。如果您正在处理 JavaScript 呈现的网站,常规 HTML 提取工具将无济于事。服务器可以通过检查它是否可以呈现 JavaScript 来识别请求何时来自真实浏览器。无头浏览器完全能够加载动态 AJAX 页面 同时模仿真实浏览器并克服浏览器指纹识别。但如果网站不依赖动态元素来显示内容,或者不依赖基于 JavaScript 的指纹识别方法,使用无头浏览器只会减慢您的速度。在这种情况下,Beautiful Soup 和 Requests 等库可以更快地完成这项工作。

6. 改善浏览器的指纹

从 Web 浏览器发出的请求包含一组标头,这些标头会显示您的偏好和软件信息。其中一个标头(用户代理字符串)尤其重要:如果该标头缺失或格式错误,目标将拒绝为您的 Web 抓取工具提供服务。这适用于大多数 HTTP 客户端(如 Requests),它们会发送自己的用户代理标头。别忘了更改它!

此外,由于网站监控来自同一浏览器的请求,因此始终使用相同的用户代理字符串可能不是一个好主意。解决方法是轮换您的用户代理。您应该收集最新 Web 浏览器的用户代理并循环遍历它们。

除了 User-agent 之外,还有更多标头需要考虑。例如,有些网站需要 Cookie,如果您添加 referer 标头,您将有更大的机会在其他网站上取得成功。

7. 维护你的网页爬虫

当您购买预制的抓取工具时,您订阅的服务会负责维护。但是,定制软件需要您(或您的同事)不断监督。主要有两个原因:1)它是一堆工具的拼凑,2)网站开发人员经常对网站进行结构更改。

首先,自建的抓取工具由不同的组件组成。因此,迟早会有一个或多个元素出现故障,您需要修复该问题,这是很现实的。例如,您的代理服务器可能会出现故障,或者网络抓取工具可能会遇到它不知道如何处理的情况。

其次,网站管理员经常进行结构更改,这可能会影响抓取工具的功能。这可能包括新的保护方法或简单地重新排列 HTML 结构以破坏您的解析代码。随着时间的推移,您需要在旧结构之上添加新功能并运行测试以查看抓取工具是否可用。此外,请密切关注缺失或修改的字段名称等更改。这将防止您损失数据质量。

8. 行为自然

人类和机器人行为之间的主要区别在于,人类行动缓慢且难以预测,而机器人则速度非常快并且被编程为特定的爬行模式。

为了看起来更像人类,您应该通过更改请求之间的时间间隔或点击网站上的特定元素来降低抓取率。如果您使用的是无头浏览器,您还可以添加鼠标移动等随机活动。不可预测的操作将使服务器更难将您识别为机器人。

改进抓取机器人的其他技巧

在您的抓取工具全部设置并运行之后,还有更多方法可以改进您的脚本。

缓存 HTTP 请求。 价格汇总等任务需要抓取多个页面,这意味着您必须浏览许多网站 URL。这就是 爬行 开始发挥作用——您构建一个爬取逻辑来从多个页面中提取特定数据。但是,当您想知道爬虫已经访问过哪些页面,或者您稍后需要重新访问这些页面以获取更多数据时,该过程会变得有点负担。通过将响应存储到数据库,您将避免将来请求相同的页面。

使用规范的 URL。 一些网站有多个 URL 指向相同的内容。通常当它们同时包含桌面版和移动版时会发生这种情况:例如 www.instagram.com 和 https://m.instagram.com。规范 URL 或规范标签是一个 HTML 片段,用于定义重复(或近似重复)的主要版本。rel=”canonical” 元素可帮助开发人员检测和避免重复页面。Scrapy 等框架默认处理相同的 URL。

处理重定向。 HTML 重定向或转发是一种将用户从一个 URL 重定向到另一个 URL 的方法。HTML 重定向会使抓取工具感到困惑并导致速度变慢。基于 Python 的抓取库(如 Requests)通常默认遵循重定向,但提供不遵循重定向的选项。Web 抓取框架(如 Scrapy)具有重定向中间件来处理它们。

Adam Dubois 的图片
亚当·杜波依斯
代理极客和开发人员。