网络抓取的静态内容与动态内容:主要区别

了解静态内容和动态内容在网络刮擦中的区别。了解如何识别、抓取和克服这两种类型的挑战。
1 分钟阅读
静态内容 vs 动态内容

在本指南中,您将了解到

  • 为什么要了解静态和动态内容的区别?
  • 什么是静态内容、如何检测静态内容、使用哪些工具来搜索静态内容以及所面临的挑战
  • 什么是动态内容、如何识别动态内容、哪些工具最适合用来搜索动态内容以及可能遇到的障碍
  • 网络搜刮背景下的静态与动态内容对照表

让我们深入了解一下!

网络抓取中的静态与动态内容简介

说到网络抓取,根据要提取的内容是静态的还是动态的,在方法上有很大的不同。这种区别会极大地影响你处理数据解析、处理和提取的方式。

根据经验,为搜索引擎优化而优化的版块或页面往往是静态的。相反,互动性强的版块或需要实时更新的版块一般都是动态的。然而,在大多数情况下,实际情况要比这复杂得多。

现代网页通常是混合型的,即既包括静态内容,也包括动态内容。因此,将整个网页简单地称为 “静态 “或 “动态 “通常是不准确的。更准确的说法是,网页中的特定内容要么是静态的,要么是动态的。

更复杂的是,即使网站上的一个页面是静态的,同一网站上的另一个页面也可能是动态的。正如一个网页可以包含两种类型的内容一样,一个网站也可以是静态和动态网页的集合。

因此,有鉴于此,请准备深入了解以下静态与动态内容对比!

静态内容

让我们来了解一下有关网页中静态内容以及如何刮取静态内容的所有知识。

什么是静态内容?

静态内容是指直接嵌入服务器返回的 HTML 文档中的所有网页元素。换句话说,它不需要客户端渲染或浏览器的额外数据检索。因此,所有内容都已存在于最初的 HTML 响应中。

这通常包括用户界面元素、文本、图像和其他内容,除非服务器端源代码更新,否则这些内容不会改变。即使服务器从数据库或应用程序接口动态获取数据,然后生成 HTML 文档发送给客户端,从客户端的角度来看,这些内容仍被视为静态内容。原因是浏览器无需进行进一步处理。

如何判断网页是否使用静态内容

如导言所述,现代网站很少有百分之百静态的。毕竟,大多数网页都包含一定程度的客户端交互功能。因此,真正的问题不在于网页是完全静态的还是动态的,而在于网页的哪些部分使用了静态内容。

要确定一段内容是否是静态的,需要检查服务器返回的原始 HTML 文档。请注意,这与您在浏览器中看到的内容不同。浏览器显示的是呈现的 DOM,页面加载后可能会被 JavaScript 修改。

有两种简单的方法可以检查页面是否使用静态内容,以及识别哪些元素是静态的:

  1. 查看页面来源
  2. 使用 HTTP 客户端

要使用第一种方法,请右键单击页面的空白区域,然后选择 “查看页面源 “选项:

这是一个网页,上面展示了三条引言:爱因斯坦(Albert Einstein)关于思考的名言,J.K. 罗琳(J.K. Rowling)关于选择的名言,以及另一条爱因斯坦关于人生和奇迹的引言,并附有与每条引言相关的标签。页面右上角还有一个菜单。

结果将是服务器返回的原始 HTML:

这是一个网页的源代码,用于展示名人名言。其结构包括引言文本、作者以及用于分类的标签等部分。

例如,在本例中,您可以看出引号元素已经出现在 HTML 中。因此,可以放心地认为它们是静态的。

第二种方法是使用 HTTP 客户端对页面 URL 执行简单的 GET 请求:

Postman 界面显示对 "https://quotes.toscrape.com "的 GET 请求,无需验证,以 HTML 格式显示响应正文,包括文档结构和标题 "Quotes to Scrape"。

同样,这显示的是服务器返回的原始 HTML。由于 HTTP 客户端不能运行 JavaScript,因此不必担心 DOM 的变化。不过,正如我们即将介绍的那样,你的请求可能会因为反僵尸保护而被服务器阻止。因此,建议使用 “查看页面源代码 “方法。

抓取静态内容的工具

抓取静态内容非常简单,因为它直接嵌入在页面的 HTML 源代码中。下面是该过程的基本概述:

  1. 使用简单的 HTTP 客户端对页面的 URL 执行 GET 请求,从而读取 HTML 文档。
  2. 使用 HTML 解析器解析响应。
  3. 使用CSS 选择器、XPath 或 HTML 解析器提供的类似策略提取所需的元素。

如果您正在寻找用于内容搜刮的工具,请查看我们的详细指南:

您可以在我们的 “使用 Python 进行网络搜刮“教程中找到与 “Quotes to Scrape “网站相关的完整示例,该网站的 HTML 代码已在前面的章节中展示过。

用于检索静态内容的一些常用搜索堆栈包括

  • Python Requests + Beautiful Soup、HTTPX + Beautiful Soup、AIOHTTP + Beautiful Soup
  • JavaScript:Axios + Cheerio、Node Fetch + Cheerio、Fetch API + Cheerio
  • PHP:cURL + DomCrawler、Guzzle + DomCrawler、cURL + Simple HTML DOM 解析器
  • C#:HttpClient + HtmlAgilityPack、HttpClient + AngleSharp

“与 Selenium 相比,BeautifulSoup 速度更快,占用内存更少。除了解析 HTML 和处理 DOM 之外,它不执行 JavaScript,也不做其他任何事情。-Reddit 上的讨论

静态内容抓取的挑战

刮擦静态内容的主要挑战在于如何发出正确的 HTTP 请求来检索 HTML 文档。许多服务器被配置为只向真正的浏览器提供内容,因此如果请求缺少某些标头或未能通过TLS 指纹检查,它们可能会阻止你的请求。

为避免这些问题,应手动设置适当的HTTP 标头,以便进行网络刮擦。或者,使用能模拟浏览器行为的高级 HTTP 客户端,如cURL Impersonate

否则,要想获得不依赖代码中的笨拙技巧或变通方法的专业解决方案,可以考虑使用网络解锁器。这是一个端点,可以返回任何网页的 HTML,无论服务器实施了何种防御机制。

此外,如果从同一 IP 地址发送过多请求,可能会触发速率限制,甚至 IP 禁止。为避免这种情况,请集成旋转代理,将请求分发到多个 IP。请参阅我们的 “如何使用代理避免 IP 禁止“指南。

动态内容

下面,我们将继续介绍静态内容与动态内容的对比,探讨动态内容是如何在网页中加载或呈现的,以及如何对其进行抓取。

什么是动态内容?

在网页中,动态内容是指在客户端加载或呈现的任何内容–无论是在初始页面加载期间还是在用户交互之后。这包括通过AJAXWebSockets 等技术获取的数据,以及嵌入 JavaScript 并在浏览器运行时呈现的内容。

特别是,动态内容并不是服务器返回的原始 HTML 文档的一部分。这是因为动态内容是在 JavaScript 执行后添加到页面中的。这意味着,除非在浏览器中渲染页面,否则动态内容将不可见,而浏览器是唯一一种可以运行 JavaScript 的工具。

如何判断网页是否使用了动态内容

判断页面是否动态的最简单方法就是采用与检测静态内容相反的方法。如果服务器返回的 HTML 文档包含您在页面上看到的内容,那么客户端就有某种机制来动态检索或呈现这些内容。

反之则不一定有效。如果服务器返回的 HTML 中存在某些内容,并不意味着页面完全是静态的。这些内容可能是陈旧的,客户端可以在页面加载后一次或定期对其进行动态更新。例如,显示实时更新的页面通常就是这种情况。

一般来说,要查看页面是否包含动态内容,可以重新加载页面,或者在检查浏览器 DevTools 中的 “网络 “部分时,重复导致内容出现的用户操作:

网络开发人员控制台截图,显示 Chrome DevTools 中的 "网络 "选项卡,其中显示了各种请求以及对名为 "Chaz Kangaroo Hoodie "的产品的 JSON 响应,其中包含 ID、类型、SKU、描述、库存、售价和图片 URL 等详细信息。

例如,在上述网页中,很明显电子商务数据是通过 AJAX 调用 API 在客户端动态检索的。

动态内容的另一个可能来源是作为 SPA(单页面应用程序)构建的网络应用程序。这些应用由 React 等前端技术驱动,严重依赖 JavaScript 渲染。因此,如果您在 DevTools 中看到的 DOM 与服务器返回的 HTML 有很大不同,那么该页面就是动态的。

抓取动态内容的工具

动态内容需要执行 JavaScript 才能呈现或检索。由于只有浏览器才能执行 JavaScript,因此您刮擦动态内容的选择通常仅限于Playwright、Selenium 和 Puppeteer 等浏览器自动化工具

这些工具公开了应用程序接口(API),允许你以编程方式控制真实浏览器。因此,动态内容网络搜刮需要以下三个步骤:

  1. 指示浏览器导航到目标页面。
  2. 等待页面上出现特定的动态内容。
  3. 使用它们提供的节点选择和数据提取应用程序接口选择和提取这些内容。

如需更多指导,请阅读我们关于如何用 Python 搜刮动态网站的文章。

动态内容抓取面临的挑战

从本质上讲,抓取动态内容比抓取静态内容更具挑战性。首先,您可能需要在代码中模拟用户交互,以复制访问内容所需的所有操作。在处理具有复杂导航功能的网站时,这可能会成为一个问题。

其次,由于动态网页通常采用先进的反抓取和反机器人措施,如验证码、JavaScript 挑战、浏览器指纹等。

此外,请记住,浏览器自动化工具必须对浏览器进行检测才能对其进行控制。浏览器设置中的这些更改足以让高级反僵尸系统将你检测为僵尸。在无头模式下控制浏览器以节省资源时尤其如此。

解决这些问题的开源方法是使用具有内置反僵尸规避功能的浏览器自动化库,如SeleniumBaseUndetected ChromeDriverPlaywright StealthPuppeteer Stealth

不过,这些解决方案只能解决冰山一角,而且会受到静态内容搜索中突出显示的所有问题的影响,如 IP 禁止、IP 信誉问题等。因此,最有效的方法是使用 Bright Data 的抓取浏览器 这样的解决方案:

  • 与 Puppeteer、Playwright、Selenium 和其他浏览器自动化工具集成
  • 在云中运行,无限扩展
  • 可与超过 1.5 亿个 IP 的代理网络协同工作
  • 以满载模式运行,避免无头检测
  • 内置验证码解决功能
  • 具有一流的反僵尸绕过功能

网络抓取的静态内容与动态内容:对比表

这是一份汇总表,比较了静态和动态内容在网络刮擦中的应用:

方面 静态内容 动态内容
定义 直接嵌入服务器初始 HTML 响应的内容 页面加载后通过 JavaScript 加载或呈现的内容
HTML 中的可见性 在服务器返回的原始 HTML 文档中可见 在初始 HTML 文档中不可见
渲染位置 服务器端渲染 客户端渲染
检测方法 – 查看页面源代码 “选项
– 在 HTTP 客户端检查 HTML
– 检查源 HTML 与渲染 DOM 之间的差异
– 检查 DevTools 的 “网络 “选项卡
常见用例 – 以搜索引擎优化为导向的内容
– 简单的信息列表
– 实时更新
– 用户专用仪表板
– SPA 内容
刮削难度 简单 从中度到高度
扫描方法 HTTP 客户端 + HTML 解析器 浏览器自动化工具
性能 速度快,因为无需 JS 渲染 速度慢,因为需要在浏览器中渲染页面并等待元素加载
刮削的主要挑战 – TLS 指纹
– 速率限制
– IP 禁止
– 验证码
– 复杂的导航/交互流程
– JS 挑战
避免阻塞的推荐工具 代理,网络解锁器 扫描浏览器
堆栈示例 请求 + 美汤 剧作家、Selenium 或 Puppeteer

有关涵盖这两种情况的特定编程语言的刮擦工具列表,请参阅下面的指南:

结论

在这篇文章中,你了解了网页上静态内容与动态内容的区别,重点是网页刮擦。您了解了这两种内容的含义、区别以及在解析网页数据时如何处理这两种内容。

无论您处理的是静态内容还是动态内容,都会因反抓取和反僵尸措施而变得复杂。这正是 Bright Data 的优势所在,它提供了一套全面的工具,可满足您所有的搜索需求:

  • 代理服务:多种类型的代理服务可绕过地理限制,提供 1.5 亿多个 IP[1]。
  • 抓取浏览器:与 Playright、Selenium 和 Puppeter 兼容的浏览器,内置解锁功能。
  • 网络抓取 API:预配置 API,用于从 100 多个主要域中提取结构化数据。
  • 网络解锁程序:一体化应用程序接口,可在具有反僵尸保护功能的网站上处理网站解锁。
  • SERP API:这是一个专门的应用程序接口,可以解锁搜索引擎结果,并从所有主要搜索引擎中提取完整的 SERP 数据[2]。

创建 Bright Data 帐户,通过免费试用测试我们的刮擦产品!

支持支付宝等多种支付方式