使用 JavaScript 进行网页抓取:获取、选择、验证

使用 JavaScript 进行网页抓取

Scrapeless Agent Browser 提供了一种云浏览器连接,用于当公共页面需要呈现状态或交互时的 JavaScript 自动化。

TL;DR

  • JavaScript 抓取有两种获取路径。 当字段存在时获取和解析响应 HTML;当页面代码之后生成它们时进行渲染。
  • Node.js fetch 获取响应,但不呈现页面。 解析器或浏览器是一个独立的组件。
  • 选择器应限于一个记录。 稳定属性和语义关系比生成的类链更容易维护。
  • 分页和验证需要明确的停止规则。 跟踪唯一键、下一个链接和接受的记录。

使用 JavaScript 进行网页抓取意味着检索允许的网络表示并将选定字段转换为记录。在 Node.js 中,fetch 可以下载 HTML,解析器可以查询它。在浏览器上下文中,页面脚本可以执行,自动化可以读取生成的 DOM。那些路径使用相同的语言,但具有不同的能力、成本和失败信号。

从一个公共页面和一个小的模式开始。识别记录容器、一个必需字段、一个可选字段和一个稳定的标识符。将初始响应与可见页面进行比较。然后选择实际上包含这些字段的获取路径。教程的其余部分专注于在源更改时保持选择、分页和输出的诚信。

在编写选择器之前对页面进行分类

使用浏览器开发者工具检查第一个文档响应并搜索目标值。如果该值出现在原始 HTML 中,Node.js fetch 加上 HTML 解析器可以工作。如果它仅在脚本运行后出现,请检查任何允许的结构化网络响应和生成的 DOM。一个包含 JavaScript 文件的页面并不自动是客户端呈现的数据源;相关的问题是特定字段何时可用。

该 Node.js 全局 fetch 文档 描述了一个 HTTP 请求接口。解析的 fetch 调用会给你一个 Response 对象,而不是呈现的浏览器文档。在读取文本之前检查 response.ok、最终 URL 和 Content-Type。访问通知或登录页面可能是有效的 HTML,因此在运行选择器之前测试属于预期页面的标记。

一个快速的获取说明应命名目标 URL、预期标题、源层、记录键和允许的导航。该说明是当站点更改时的调试助手。没有它,一个打印空数组的脚本无法告诉你是网络失败、解析器选择了错误的选择器,还是浏览器从未到达预期的状态。

使用面向 DOM 的库解析静态 HTML

像 Cheerio 这样的解析器将标记加载到可查询的结构中。它的 官方介绍 解释了 CSS 风格的遍历,同时明确表示 Cheerio 不执行 JavaScript。首先选择记录容器,然后选择每个容器内的标题、链接和可选字段。这即使在一个记录缺少一个字段的情况下也能保留关系。

例如,公共列表可能使用 article[data-item-id] 作为容器。从属性中读取 ID,在该文章内找到 h2,并根据最终响应 URL 解析其锚点 href。通过折叠空格规范化文本,但在捕捉其含义之前不要去掉货币符号或单位。如果某个字段缺失,发出显式的 null 或在模式下拒绝该记录,而不是将另一个项目的值移到它的位置。

保留一组真实的允许 HTML 作为选择器逻辑的开发固定。这使得解析器的更改便于测试。然而,仅凭固定不验证当前的获取;对页面身份和字段计数进行小的实时检查。通过独立报告两个阶段来将解析器失败与 HTTP 失败分开。

仅在需要时呈现和交互

当目标字段仅在浏览器执行后存在时,浏览器自动化会话可以导航、等待目标并读取生成的 DOM。使用特定内容的定位器,而不是固定延迟。 Playwright 定位器指南 描述了定位器如何识别元素并支持等待可操作状态。定位器仍然必须从页面的实际标记中选择。

该 Agent Browser 入门指南 记录了一个用于支持的自动化框架的云浏览器连接。当工作流需要浏览器执行或一系列动作时,它是有用的。不要暗示连接到浏览器保证正确的数据集:页面可以呈现外壳、同意通知或访问状态。导航后验证路线和目标记录。

如果页面在滚动时加载更多记录,请捕获当前唯一键集,执行一个有界操作,然后等待新键或显式结束信号。当文档或观察到的延续结束时停止。盲目滚动固定的次数可能会遗漏数据、重复数据,或在有用的数据收集完成后继续运行脚本。

处理分页和记录形状

仅在下一个链接、页面参数或游标属于源的实际导航模型时,遵循经过验证的链接。根据最终页面 URL 解析链接,并拒绝超出预期范围的目标。保持访问页面集和独立的记录键集。第一个防止导航循环;第二个检测跨页面的重复项。

在大规模收集之前定义输出。一个简单的记录可能包含源URL、物品ID、标题、目标URL、观察到的价格文本和观察时间。缺少的必需字段应在验证时失败。可选字段应保持可为空。将原始文本与规范化值一起存储,以便在解释可以稍后修改时使用。解析器的成功信号不是数据质量信号。

使源更改可观察。计算访问的页面、选定的记录、接受的记录、重复的键、缺失的必需字段以及意外的页面身份。如果源开始返回200状态的访问页面,则身份检查应停止存储。如果标记发生变化但页面仍然正确,则选择器未命中的计数将指向提取层。

保持工作流负责任且易于维护

仅处理您的项目允许访问的内容。检查网站条款、隐私义务和容量指导;限制并发和请求量。不应在客户端代码中嵌入凭据或在示例中发布活动会话cookie。当提供相同授权数据并具有更清晰合同时,优先选择有文档的API。

该 代理浏览器产品页面 描述了受管理的浏览器界面。相关的 Node.js刮取指南 比较轻量级HTML解析与呈现页面工作。将这两者视为一个提取合同下的两个获取选择,而不是将每个页面都通过浏览器运行的理由。

在调度定期抓取之前,测试每个布局变体的一个代表性页面。保存经过编辑的响应证据,编写字段级断言,并决定收集的数据应保留多久。一个小而正确范围的工作流比一个广泛的爬虫更容易审核,其失败隐藏在单个总行计数之后。

如果列表包含赞助卡、导航模块和普通结果,即使它们共享视觉类,也应将其视为单独的结构。记录选择器应说明哪些元素算作所需的项目。在接受每个候选项之前检查一个稳定的属性或目标模式。这一步小的分类可以防止重新设计将一个促销块变成一个产品记录,仅仅因为两者恰好都包含一个标题和链接。

结论

使用JavaScript进行网络抓取在获取路径与源匹配时有效。获取并解析完整的响应HTML;仅在浏览器创建的状态下呈现。范围选择器,定义记录架构,遵循真实的继续规则,并拒绝未能证明已访问目标页面的响应。

构建JavaScript抓取工作流

选择一个允许的目标,并在原始HTML不完整时连接适当的Scrapeless浏览器路径。

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

领取您的$5信用→

常见问题

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

可以。Node.js可以获取HTML或一个允许的结构化端点,并解析返回的内容。只有在目标依赖于浏览器执行或交互时才需要浏览器。

fetch会执行页面JavaScript吗?

不会。Fetch检索HTTP响应。它不会创建页面DOM,运行下载的脚本或点击控件。使用解析器处理返回的HTML或浏览器环境处理脚本创建的状态。

Cheerio和浏览器之间有什么区别?

Cheerio解析提供的标记,并支持无需执行页面脚本的DOM类似选择。浏览器运行脚本,管理页面状态,并可以与控件交互。选择依据目标字段出现的位置。

抓取器应该如何处理更改的CSS类?

优先选择语义元素、稳定的数据属性和每条记录中限定的短关系。验证必需字段并监控选择器未命中,以便重新设计造成可见的失败,而不是悄然不完整的输出。

每个JavaScript抓取器都需要代理吗?

不需要。网络路由和JavaScript渲染针对不同条件。仅在目标访问模式和您的允许工作流要求时使用提供商支持的代理配置;首先确定数据来自何处。

参考