如何在无头电商商店上抓取动态产品页面
Scrapeless Agent Browser 在托管的浏览器会话中渲染 JavaScript 店面,Scrapeless Residential Proxies 则支持面向位置的访问,用于授权的区域抓取。
摘要
- 一个无头产品页面可能有多种表现形式。 对比初始 HTML、文档化的店面数据以及最终面向买家的报价。
- 变体选择需要有有意义的就绪条件。 在接受渲染价格之前,将选定的变体、市场和响应进行关联。
- 网络证据和可见状态相辅相成。 一个响应可能属于预取的或默认变体,而买家从未选择它。
- 一个区域性观测需要市场证据。 即使连接使用了面向位置的代理,也要确认所渲染的货币和市场。
识别由哪个界面表面负责该报价
无头电商店面将购物界面与后端电商服务分离,因此产品信息可能出现在初始 HTML、应用状态、响应以及渲染页面中。根据要回答的具体采集问题选择数据来源。如果商店为你的用途提供了有文档的 API 或数据源,它可能就足以用于目录标识。如果你需要的是买家在选择市场和变体之后看到的价格,也要验证渲染状态。
并排检查初始 HTML 和真实浏览器会话。一个页面可以在服务器端提供产品标题和默认金额,然后对控件进行注水并显示所选变体的报价。另一页面则可以在服务器端渲染选定的报价,仅使用浏览器来更改变体。 Hydrogen 产品变体选择 描述了某个框架对变体感知店面路由和数据的使用方式。在假定特定实现之前,先检查手头的商店。
在采集约定中,将产品家族、变体和市场区分开来。 ProductGroup 词汇 区分一个分组与属于它的变体。即使选定变体存在于查询参数或状态变化中,规范产品 URL 也可以标识一个家族。在已知的情况下同时存储规范分组 URL,以及抓取过程中观察到的实际 URL。
前提条件与安装
使用带有 Playwright 包和 Chromium 的 Node.js 项目。安装 Playwright Chromium 运行时或配置现有的兼容浏览器。选择一个经批准的店面或隔离的测试夹具。包含一个会改变金额的变体、一个不可用选项以及一个使用不同货币的市场。远程运行需要 Scrapeless 账号和文档化的 Agent Browser 连接设置。
在经批准的店面上使用开发者工具检查加载、控件和请求。确认你要采集的是产品数据还是面向买家的报价证据。如果站点为你的用途提供了有文档接口,获取适当访问权限并遵守其范围。出现在开发者工具中的请求并不构成稳定接口,也不授予你独立从中采集的权限。
步骤 1:发现产品和选定市场
从允许的目录来源或已知产品 URL 出发,并记录你打算观察的市场上下文。按照正常导航并捕获最终路由。查找渲染出的市场或货币指示,尤其是在初始路由发生重定向时。在同时公开语言环境和市场的商店上,两者都要记录。产品标题的语言不足以确定货币或配送区域。
《 URL Standard 》解释了浏览器在解析和序列化 URL 时使用的各组成部分。根据商店行为对这些组件进行处理。跟踪参数对标识可能无关,而用于实际变体选择的查询参数则对证据至关重要。在规范化路由之前,先在有无该参数的情况下测试页面。
步骤 2:关联变体响应并验证界面
只有当报价响应对应预期交互和状态时,它才有用。在执行操作之前注册监听器,匹配预期的来源和请求结构,并验证选定变体和市场。然后等待预期值提交到渲染报价中。避免用通用加载延迟来作为所有异步更新都已完成的信号。
下面的示例针对一个受控的店面夹具运行,该夹具在按钮点击后返回报价响应并更新产品面板。路径、选择器和负载字段都是夹具特定的。只将它们改编到你在目标商店上能够验证的接口和页面控件中。对于基于 GraphQL 的集成,经批准的操作名称及其相关输入变量可以在共享端点处理多个请求时标识某个响应。
async function readMarketVariant(page, targetUrl, variant, market) {
await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
await page.getByTestId('product-ready').waitFor({ state: 'visible' });
// Register the response listener before selecting the variant.
const data = page.waitForResponse(response => {
const url = new URL(response.url());
return url.origin === new URL(targetUrl).origin &&
url.pathname === '/fixture/offer' &&
url.searchParams.get('variant') === variant &&
url.searchParams.get('market') === market &&
response.request().method() === 'GET' && response.ok();
}, { timeout: 5000 });
await Promise.all([
data,
page.getByRole('button', { name: variant, exact: true }).click()
]);
const offer = await (await data).json();
const panel = page.getByTestId('rendered-offer');
await panel.getByText(offer.display, { exact: true }).waitFor();
const visible = await panel.evaluate(node => ({
variant: node.dataset.variant,
market: node.dataset.market,
currency: node.dataset.currency,
display: node.querySelector('[data-testid="amount"]').textContent.trim()
}));
if (offer.variant !== variant || offer.market !== market ||
visible.variant !== variant || visible.market !== market ||
visible.currency !== offer.currency || visible.display !== offer.display) {
throw new Error('Offer response and rendered state disagree');
}
return { url: page.url(), ...visible, observedAt: new Date().toISOString() };
}
该夹具选择 Olive,收到市场 GB 的 GBP 报价,并验证显示的 £74.00。当渲染出的市场或变体与响应不符时,它会失败。真实店面可能在不发出新请求的情况下完成注水,例如当所需数据已经提供或预取时。在这种情况下,选择一个已验证的渲染状态检查,以在不期待不会发生的事件的前提下,识别选定报价。
中领取你的免费额度
步骤 3:解读产品价格、库存和条件性报价 Offer 词汇 提供价格、货币和可用性等条款。将原始金额和规范化金额设为单独字段,并在存在时区分促销价、标价和会员价。无头店面可能只会在已知位置后才显示运费或税费提示。定义数据约定所期望的组件,在金额尚未验证前,将具有条件的金额排除在可比的现金价视图之外。
在从一个选项切换到另一个选项时检查所选变体,即使可见金额保持不变。两个变体可能拥有相同价格,仅依赖文本更新会不可靠。检查状态标记或其他身份证据。示例会在可视金额解析后,同时检查响应和面板身份。在你运营的商店中,如果需要单一稳定的集合条件,请暴露带版本的就绪标记。
将可用性与导航成功分开处理。有效的浏览器响应可能显示售罄商品、不可用变体、重定向或店面故障消息。按类别保存结果,这样空金额就不会变成错误的低价警报。使用刻意无法渲染完整报价的固定用例,并确认下游流水线会将它们排除在已批准的比较之外。
步骤 4:分配浏览器和代理的职责
在 Playwright 需要执行店面并与其控件交互时,使用 Scrapeless Agent Browser 。 适用于动态网站的 Agent Browser 解决方案 涵盖基于浏览器的工作流。在授权观察需要选定网络位置时,使用 Residential Proxies 。 代理价格监控解决方案 适用于同一目录需要跨市场反复比较的场景。浏览器负责执行页面,代理提供网络路径。市场接受度属于采集逻辑的范畴。
这份 适用于 Shopify 变体数据的 Playwright 指南 提供了在抽取前选择正确来源的另一个示例。在测量浏览器会话保持打开的时长以及各区域的网络传输量后,使用 Scrapeless pricing 估算实时工作负载。将行为相似的页面归组,这样复杂的交互模板就不会扭曲对简单产品页的估算。
你将获得什么
可复查的事件包含来源 URL、产品或变体键、市场、货币、显示金额、观察时间和捕获来源。当来源展示并且数据约定需要时,添加可用性和卖家信息。保留规范化的表示以供下游分析,以及一份简明记录来说明为何接受该次捕获。证据可包括所选选项、相关响应字段,以及在用例需要时提供的局部截图。
在扩展前验证店面状态
选择一个已知产品,对比初始 HTML、已批准的结构化数据和渲染出的报价。将精确选择过程自动化,并记录操作后发生了哪些变化。当你的采集器可以区分请求的报价与默认、预取或区域不匹配状态时,再扩大范围。
准备好捕获无头店面的报价了吗?
在 Agent Browser 中渲染已批准的店面,并将所选报价与其响应进行比较。
立即注册即可获得 $5 in free credit — 无需信用卡.
领取你的 $5 额度 →常见问题
所有无头电商店都需要使用 Playwright 吗?
当有文档化的目录 API 或 feed 并提供所需字段时,它们可能已足够。当行为依赖渲染后的店面或用户选择时,使用 Playwright 进行验证。
初始 HTML 中能包含可用价格吗?
某些店面会在其服务器渲染的响应中包含价格。在使用这些数值前,确认它们适用于所选变体和市场。
在无头电商抓取中,什么时候代理有用?
当经授权的、特定市场的捕获依赖出口路径时,使用按位置定向的路由。检查显示的区域和货币,因为市场选择器和会话设置会改变结果。
采集器应如何处理访问拒绝和流量限制?
将被拒绝的页面记录为不可用,并使用所有者批准的抓取范围或 feed。在需要时与法律顾问一起审查适用条款和权限,并将流量控制在约定限制之内。
当商店更改其产品标记时会发生什么?
使用新的固定样本检查适配器,并确认响应关联和渲染报价身份两者都仍然有效。耐用的已选变体或已确认报价标记有助于定位变更。
此工作流能在没有 AI 代理的情况下运行吗?
Playwright 可以直接导航、选择选项,并将响应与渲染页面进行比较。将浏览器并发量限制在已批准的来源上限和可用资源范围内。