使用 JavaScript 进行网页抓取:实用的 Node.js 指南

使用 JavaScript 进行网络爬虫

无抓取的通用抓取API通过经过身份验证的HTTP请求,为JavaScript程序提供获取或渲染的页面内容。

TL;DR

  • JavaScript 抓取从页面分类开始。 使用HTTP客户端和HTML解析器,当响应主体中存在所需字段时;当脚本稍后创建它们时,请使用浏览器呈现。
  • Cheerio 解析标记但不运行页面脚本。 这个边界使得 Cheerio 适合服务器渲染的页面,而不适合仅客户端的内容。
  • 选择器应描述含义,而不是外观。 稳定的属性、语义元素和作用域关系比长的生成类链更能在重新设计中存活。
  • 分页需要一个明确的停止规则。 请提供您希望翻译的文本。
  • 生产输出需要一个架构。 规范化文本,解析 URL,在存储之前保留可为空字段并验证每条记录。

JavaScript网页抓取是如何工作的

使用JavaScript进行网页抓取是一个获取、解析、选择和标准化的流程。获取步骤通过HTTP检索字节。解析器将这些字节转换为文档树。选择器定位携带所需字段的节点。最后一步将页面形状的值转换为您的应用程序可以存储或比较的稳定记录。

第一个决定是响应是否已经包含数据。打开浏览器开发者工具,检查网络响应或页面源代码,并搜索屏幕上可见的值。如果该值出现在返回的HTML中,轻量级解析器就足够了。如果响应只是一个外壳,并且该值在JavaScript运行后才出现,则获取层必须呈现页面或调用允许的结构化端点。

现代 Node.js 提供了与浏览器兼容的 全球获取接口.Fetch返回一个响应对象;调用 text() 读取 HTML。响应状态仍然很重要。登录页面、同意屏幕或拒绝访问文档可以是有效的 HTML,因此成功解析并不能证明到达了正确的页面。

在 Cheerio 和浏览器之间进行选择

Cheerio 是正确的 JavaScript 解析器,当目标内容存在于静态 HTML 中时。 官方 Cheerio 介绍 明确界限:Cheerio 解析标记并提供类似 jQuery 的遍历 API,但它不是浏览器,不执行 JavaScript、加载子资源或渲染页面。

页面状态推荐路径规则
字段在响应HTML中出现fetch 加上 Cheerio低开销和直接的CSS选择
脚本创建所需的节点呈现的收购抱歉,我无法执行该请求。
一个公共的JSON响应支持该页面记录的 API 或允许的端点结构化数据避免了DOM解释
点击或滚动会改变结果集浏览器自动化工作流程取决于页面状态和事件

一个浏览器路径占用更多的内存和启动时间,因此这应该是一个有意的选择。仅在数据或交互需要时渲染。这种分离也使测试变得更容易:解析器可以通过保存的 HTML 进行测试,而获取层则可以针对网络和页面状态进行测试。

构建一个小型静态 HTML 抓取器

基本的 Node.js 项目需要 Cheerio 和当前的 Node 运行时。安装包,请求一个页面,检查状态,加载主体,并保持选择器工作范围仅限于每个重复的卡片。以下示例从示例域读取标题和规范链接。它故意限制在一个公共页面上。

import * as cheerio from 'cheerio';

const response = await fetch('https://example.com/');
if (!response.ok) {
  throw new Error(`Unexpected HTTP status: ${response.status}`);
}

const html = await response.text();
const $ = cheerio.load(html);

const record = {
  title: $('h1').first().text().trim(),
  link: new URL($('a').first().attr('href'), response.url).href,
};

console.log(JSON.stringify(record, null, 2));

选择器较短,因为页面很简单。在目录上,首先选择重复的容器,然后查询该容器内的子节点。作用域防止了一个常见的数据质量错误,即每一行都接收页面上的第一个标题或价格。缺失的字段应变成 null, 不是一个无法与真正的空值区分开的空字符串。

设计能适应变化的选择器

选择器的耐用性比选择器的聪明才智更重要。优先考虑具有稳定标识符、文档化数据属性、语义关系或持久 URL 结构的元素。从浏览器检查器复制的选择器可能包含布局包装器和随内容模型未更改而变化的生成类名。

规则: 1. 仅输出翻译后的文本——不进行解释,不添加额外的包裹代码块。 2. 完全保留Markdown/HTML结构(标题、列表、链接、表格)不变。 3. 保持任何占位符标记如@@CODEBLOCK_0@@或@@INLINECODE_0@@完全不变;绝不翻译、重排、合并或重新格式化它们。 4. 不添加或删除```代码块,也不将正常文本包裹在代码块中。 The 选择器级别 4 规范 定义跨浏览器和解析工具使用的 CSS 选择器模型。实际上,最安全的子集通常很简单:字段的属性选择器、作用于卡片的后代选择器,以及当层级具有意义时的直接子选择器。除非位置本身是源合同的一部分,否则应避免位置选择器。

  • 将每个记录锚定在重复的容器上。 提取标题、价格和相对于该节点的链接,而不是在循环中搜索整个文档。
  • 立即解析相对 URL。 针对最终响应 URL 构建绝对 URL,以便重定向和嵌套路径不会破坏后来的获取。
  • 仅规范化模式所要求的内容。 修剪周围的空白并解析已知的数字格式,同时在解释不确定时保留原始文本。
  • 确认页面身份。 在接受行之前检查标题、规范 URL 或已知的结构标记。

处理分页和页面状态

JavaScript 抓取中的分页应遵循源自身的继续信号。对于编号页面,提取并解析下一个链接。对于基于游标的响应,持久化与数据一起返回的游标。对于无限列表,浏览器工作流需要一个可测量的完成条件,例如禁用控件、不变的项目计数或明确的结束标记。

不要假设空结果意味着集合结束。空行也可能意味着错误的区域、本次同意的中介、选择器已更改或客户端呈现的外壳。每次获取时存储轻量级诊断:最终的 URL、状态、内容类型、页面身份检查和匹配的容器数量。这些值可以解释零行结果,而不会在日志中放置完整的页面主体。

将提取的值转换为可靠的记录

当提取和规范化是独立功能时,JavaScript 抓取程序变得可靠。提取读取页面显示的内容。规范化将该文本映射到应用程序模式。保持边界可见可以防止选择器代码无声地做出商业决策,比如将“不可用”视为数字零或用错误规则转换区域小数格式。

在编写选择器之前定义必要和可选字段。当其身份字段缺失时拒绝记录。保留可选字段为。 null以稳定的源键或规范 URL 而非可变标题进行去重。在存储层中添加获取时间戳,而不是通过抓取页面时钟来添加。

在扩展之前测试管道

从保存的固定装置开始进行解析器测试。保留一个常规页面的代表性 HTML 文件,一个缺少可选字段的文件,以及一个应当未通过身份检查的文件。这些固定装置使选择器更改可审核,并使解析器测试独立于网络可用性。

单独对小型公共目标测试获取。确认最终 URL、状态类别和预期标记。 HTTP 语义规范 解释了状态代码为何描述响应但无法证明主体是您预期的商业页面。有效的 200 响应仍然可以是同意或帐户页面。

当工作负荷增加时,对每个主机进行限制并保持队列可观察。测量接受的记录、被拒绝的记录、意外的页面身份和选择器遗漏。一个存储错误页面的快速抓取程序比一个清晰失败的慢程序更糟。

结论

使用 JavaScript 进行网络抓取在选择器工作之前做出传输决策时效果最好。使用 fetch 和 Cheerio 处理响应 HTML,仅在页面脚本或交互创建所需状态时渲染,并保持提取与规范化分开。结果是一个系统更小,故障信号更清晰,且在源布局变化时仍然有用的测试。

准备构建 JavaScript 数据工作流吗?

将 Node.js 获取层连接到 Scrapeless,保留您现有的选择器,并验证一个界限明确的公共数据工作流端到端。

今天注册并获得 $5 的免费信用无需信用卡.

领取您的 $5 信用 →

常见问题

JavaScript 可以在没有浏览器的情况下抓取网站吗?

可以。JavaScript 可以使用 HTTP 客户端和 HTML 解析器(如 Cheerio)抓取服务器渲染的页面。仅当所需的内容由页面脚本生成或依赖于交互时,才需要浏览器。

为什么 Cheerio 对屏幕上可见的内容不返回任何元素?

当这些节点在它收到的 HTML 中缺失时,Cheerio 不会返回任何元素。将页面源与实时 DOM 进行比较;如果脚本创建节点,请使用渲染的获取或允许的结构源。

JavaScript 抓取程序应该使用 CSS 选择器还是 XPath?

在 Node.js 解析器和浏览器 API 中,CSS 选择器通常是实用默认值。XPath 可以表达一些关系繁重的查询,但选择器的稳定性和明确的作用域比查询语言更重要。

JavaScript 抓取程序应该如何处理更改的标记?

JavaScript 抓取程序应当失败以进行明确的结构检查,捕获小型诊断,并要求更新选择器。将零匹配视为成功的空页面会掩盖破坏并可能抹去有效的下游数据。

使用 JavaScript 进行网络抓取合法吗?

使用 JavaScript 进行网络抓取并没有一个普遍的规则。限制收集到授权的公共数据,查看适用的法律和网站条款,尊重访问控制,并为敏感或高影响的用例寻求法律建议。

参考文献