什么是无头浏览器抓取
无头浏览器抓取是从网页抓取数据的最佳方法之一。通常的网络抓取需要你在浏览器中运行你的代码,这使得抓取过程很不方便,因为你必须在已经提供图形界面的环境中运行它。
浏览器将需要时间和资源来呈现您试图废弃的实际网页,从而使过程变慢。如果您的项目涉及基本数据提取,那么您也许可以使用基本方法来完成。这就是无头浏览器网络抓取的用武之地。
在本指南中,我们将讨论什么是无头浏览器、无头抓取的好处以及可用的最佳选项。
什么是无头浏览器抓取?
无头浏览器抓取是网络抓取的做法,但使用无头浏览器。这意味着在没有实际用户界面的情况下抓取网页。例如,当您尝试通过普通网络浏览器进行抓取时,就会发生这种情况:
那么如果使用无头爬虫呢?那么你实际上是在跳过渲染步骤:
虽然根据您使用的无头浏览器,您可能会得到不同的结果,但从高层看整个过程,当您使用无头浏览器时就会发生这种情况。
为此,您绝对可以使用大多数编程语言,例如 Node.js、PHP、JAVA、Ruby、Python 等。对这些语言中的任何一种的唯一要求是至少有一个库/包允许您与无头浏览器交互。
无头抓取更快吗?
是的,因为它需要更少的资源和更少的步骤来获取所需的信息。
当您使用无头浏览器时,您将跳过 UI 的整个呈现。
我们可以使用 Puppeteer(一种使用基于 Chromium 的浏览器的自动化工具)来检查 DevTools 中的性能选项卡,并比较配置为避免加载任何图像和 CSS 样式的页面加载结果与正常页面加载的结果。
我们将使用严重依赖图像的 eBay 网站。这是一个完美的优化网站。
看那个!当我们加载没有图像和 CSS 样式的页面时,延迟 2 秒。
绘制页面所花费的时间也减少了,因为虽然我们仍然需要展示一些东西,但那个“东西”并不那么复杂。
考虑一个更现实的场景,假设您有 100 个客户端,每个客户端每天执行 100 个抓取请求。因此,您每天有 10.000 个请求,平均节省 2 秒,这意味着每天节省 5(将近 6)小时,只是因为不必呈现所有这些资源。
现在这个数字对你来说足够大了吗?
可以检测到无头浏览器吗?
仅仅因为您可以使用最新技术废弃网站,并不意味着您应该这样做。Web 抓取可以被视为不好的,一些开发人员会加倍努力来阻止和避免抓取他们的 Web 内容。
也就是说,可以检测到无头浏览器,以下是开发人员用来检测无头浏览器抓取活动的技术:
1.请求频率
请求频率是一个明确的指标。这将我们带回到之前关于性能是双刃刀片的观点。
虽然能够同时发送更多请求是件好事,但不想被抓取的网站会很快检测到单个 IP 每秒发送过多请求,并在一瞬间阻止请求。
那么你能做些什么来避免它呢?如果您正在编写自己的抓取工具,则可以尝试限制每秒发送的请求数,尤其是当您通过同一 IP 发送所有请求时。这样你就可以尝试模拟你是一个真实的用户。
您每秒可以发送多少个请求?这取决于网站的限制,您可以通过反复试验找出答案。
2.IP过滤
开发人员用来确定您是真实用户还是试图抓取他们网站的机器人的另一种非常常见的方法是保留一份更新的他们不信任的IP 黑名单。这些 IP 不受信任,因为它们过去检测到源自它们的抓取活动。
尽管绕过 IP 过滤应该不是问题,但ZenRows为网络抓取提供了出色的高级代理。
3. 验证码
开发人员使用它们来过滤机器人。这些小家伙会提出一个简单的问题,人类可以轻松解决,而机器则需要做一些工作。这是一个简单的测试,虽然它也可以通过计算机解决,但它还需要您更加努力。
有多种方法可以绕过验证码,但我们发现最简单的方法之一是使用 ZenRows 的 API。
4. User Agent检测
所有浏览器都会发送一个名为“ User-Agent ”的特殊标头,它们会在其中添加一个标识字符串,以确定使用哪个浏览器及其版本。如果一个网站试图保护自己免受爬虫和刮板的侵害,它会查找该标头并检查该值是否正确。
例如,这将是普通 Google Chrome 浏览器发送的用户代理:“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36”
您可以看到该字符串指定了浏览器、它的版本甚至它正在使用的操作系统。
现在看一个普通的 Headless Chrome 用户代理(Headless Chrome 是 Chrome 浏览器的无头版本):
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/76.0.3803.0 Safari/537.36
您还可以看到类似的信息告诉我们它是在 Linux 而不是 Windows 上,但它也添加了 HeadlessChrome 版本。这是我们不是真正的人类的直接迹象。破了!
当然,与大多数请求标头一样,我们也可以通过我们用来废弃网站的任何工具来伪造它。但如果您忘记它,那么您将遇到一个被 UA 过滤的目标,您将被阻止。
5. 浏览器指纹识别
浏览器指纹识别是一种技术,涉及收集系统的不同特征并从中提取出唯一的哈希值。
没有单一的方法可以做到这一点,但如果操作正确,即使您试图掩盖您的身份,它们也可以识别您和您的浏览器。一种常见的技术涉及画布指纹识别,他们在背景中绘制图像并测量由您的特定设置(图形卡、浏览器版本等)引起的明显失真。
或者阅读系统中安装的媒体设备列表,这种独特的组合将在以后的会话中泄露您的身份。其他人甚至会使用声音来获取指纹,例如如何使用Web Audio API来测量振荡器产生的声波中的特定失真。
避免被这些站点检测到并非易事。当然,如果您的抓取活动不需要它,您可以避免在抓取网站时在他们的网站上运行 JavaScript 代码,这将防止他们尝试对您的浏览器进行指纹识别。如果你开始遇到更多这样的问题,你有两个选择,你要么通过研究和大量的反复试验继续解决这些问题,要么选择付费的抓取服务。
毕竟,如果您要抓取具有许多这些限制的网站,那么您可能是认真的。如果是这种情况,请考虑投资一些钱,让专业人士为您处理所有这些问题。
哪种浏览器最适合网页抓取?
那里有“最好的抓取无头浏览器”吗?不,没有。毕竟,“最佳”的概念仅在您要解决的问题的上下文中有效。
话虽这么说,但仍有一些流行的替代方案可能适合您,至少作为起点。一些最流行的无头网络抓取浏览器是:
1.ZenRows
ZenRows是一种 API,具有开箱即用的集成无头浏览器。它允许通过单个 API 调用抓取静态和动态数据。
您可以与所有语言集成,它还为 Python 和 Node.js 提供 SDK。对于测试,您可以从图形界面或 cURL 请求开始。然后使用您喜欢的语言进行扩展。
2.Puppeteer
你可以说Puppeteer是一个 Node 无头浏览器。它有一个很棒的 API,并且相对容易使用,只需几行代码,您就可以开始您的抓取活动。
3. selenium
它广泛用于无头测试,它提供了一个非常直观的 API 来指定用户对抓取目标的操作。
4.HTML单元
HTMLUnit是 Java 开发人员的绝佳选择。这个无头浏览器被许多流行的项目使用,并且得到了积极的维护。
用于 Web 抓取的无头浏览器的缺点是什么?
如果您使用无头浏览器进行网络抓取是为了好玩,那么很可能没有人会关心您的抓取活动。但是,如果您正在进行大规模的网络抓取,您将开始制造足够多的噪音并冒着被检测到的风险。以下是使用无头浏览器进行网页抓取的一些缺点:
无头浏览器更难调试
抓取基本上是从源中提取数据,为此,我们必须引用 DOM 的各个部分,例如捕获某个类名或查找具有特定名称的输入。
当网站的结构发生变化(即它的 HTML 发生变化)时,我们的代码就会变得毫无用处。发生这种情况是因为我们的逻辑无法像通过目视检查那样适应。
这就是说,如果您正在构建一个抓取工具,并且数据突然开始出错或为空(因为抓取页面的 HTML 发生了变化),您将不得不手动检查和调试代码以了解发生了什么。
因此,您必须求助于解决方法或使用支持这两个版本的浏览器(如 Puppeteer),这样您就可以在需要时打开和关闭 UI。
他们确实有一个重要的学习曲线
通过代码浏览网站需要您以不同的方式查看网站。我们习惯于使用视觉提示或描述(在视觉辅助助手的情况下)浏览网站。
但现在您必须查看网站的代码并了解其架构才能正确获取您想要的信息,这种方式基本上是抗更改的,以避免每隔几周更新一次浏览逻辑。
无头抓取有什么好处?
使用无头浏览器进行抓取的好处包括:
1.自动化
可以在无头浏览器抓取期间自动执行任务,从而真正节省时间,尤其是当您尝试抓取的网站对保护自身或过于频繁地更改其内部架构并不真正感兴趣时。这样您就不会被不断更新的浏览逻辑所困扰。
2.速度提升
速度的提高是相当可观的,因为您将在每个网站上使用更少的资源,并且每个网站的加载时间也可以减少,随着时间的推移,这将大大节省时间。
3. 从看似非结构化的来源交付结构化数据
网站可能看起来是非结构化的,因为毕竟它们是为人们阅读而设计的,而且人们对从非结构化来源收集信息没有问题。但是因为网站确实有一个内部架构,我们可以利用它并获取我们想要的信息。
然后我们可以将该信息保存为机器可读的形式(如 JSON、YAML 或任何其他数据存储格式)以供以后处理。
4. 带宽馈送的潜在节省
无头浏览可以通过跳过网页的一些最大资源(Kb-wise)的方式来完成。这直接转化为速度的提高,但它也使我们能够避免大量数据被传输到进行抓取的服务器。
这可能意味着来自云提供商的代理或网关等服务的数据传输费用要低得多,这些服务按传输字节收费。
5.抓取动态内容
上面的一些也适用于更快的工具,比如 Python 中的请求。但是它们缺少无头浏览器所具有的重要功能:从动态页面或 SPA(单页应用程序)中提取数据。
您可以等待一些内容出现,甚至可以与页面进行交互。导航或填写表格,选项几乎是无限的。毕竟,您是在与浏览器交互。
结论
一般来说,Web 抓取是一个很好的工具,可以从多个 Web 源捕获数据并将其集中在您需要的任何地方。这是一种经济高效的爬网方式,因为您可以工作一次并以非常低的价格自动执行下一组。
无头网页抓取是一种使用没有 UI 的特殊版本浏览器执行抓取的方法,这使得它运行起来更快、成本更低。