如何使用 Playwright 构建竞争对手价格跟踪器
Senior Web Scraping Engineer
摘要:
- 竞品价格跟踪器需要稳定的报价键。 在比较价格前,先匹配零售商、变体、市场、卖家和购买类型。
- Playwright 可以等待价格渲染完成。 将定位器限定在单个产品摘要区域,以免读到推荐价或参考价。
- 保持金额与货币一起存储。 同时保存展示字符串和十进制表示,方便审核解析结果。
- 捕获失败时应保留上一次的有效价格。 将访问、导航和解析问题发送到采集监控系统。
引言
一个商品页面在同一可视区域内,可能同时显示促销价、参考价以及一行相关商品。如果跟踪器只读取到第一个货币符号,那么它的告警很可能指向一个用户根本没有选择的报价。
下面的 Playwright 示例会读取一个公开演示商城中、单个产品摘要里的价格。真正实用的部分在提取之后:判断何时可以认为两个价格描述的是同一项报价。
安装 Playwright
本示例使用 Playwright 的 Python 包以及已安装的 Google Chrome。请在项目环境中安装该包,并确认执行环境上可以使用 Chrome。对调度器使用显式的商品 URL 白名单,并从单个 worker 开始。
bash
python3 -m pip install playwright
配置要跟踪的报价
跟踪器在访问页面之前,就应定义好比较用的键。包括零售商、产品或变体、市场、卖家和购买类型。在比较检查中保留货币和计价单位。Schema.org 的 Offer 模型将报价与其基础商品区分开来,并包含独立的 price 与 currency 属性。
如果报价依赖市场路由,请在可比的采集中使用同一套经过批准的网络环境。关于路由选择,可参考价格监控基础设施工作流。在本示例中,浏览器读取的是单一的英式展示格式,并直接校验 GBP 格式。
从 Scrapeless 开始抓取
使用 Scrapeless 提升你的网页抓取与自动化工作流。
立即注册即可获得 5 美元免费额度 —— 无需信用卡。现在就在 Scrapeless 控制台领取你的免费额度。
从公共演示页面读取一个报价
Playwright 捕获可以检查导航情况,等待一个唯一的价格定位器,并输出一条简洁的观测记录。Playwright 定位器参考文档解释了定位器如何定位元素,以及在多个元素匹配时严格操作的行为。本示例将标题和价格都限定在同一个产品摘要区域内。
python
import json
import re
from datetime import datetime, timezone
from decimal import Decimal
from playwright.sync_api import sync_playwright
URL = "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"
with sync_playwright() as playwright:
browser = playwright.chromium.launch(channel="chrome")
try:
page = browser.new_page(locale="en-GB")
response = page.goto(URL, wait_until="domcontentloaded", timeout=20_000)
if response is None or not response.ok or page.url != URL:
raise RuntimeError("Expected the demo product page")
summary = page.locator(".product_main")
price = summary.locator(".price_color")
price.wait_for(state="visible", timeout=10_000)
display_price = price.inner_text().strip()
match = re.fullmatch(r"£([0-9]+\.[0-9]{2})", display_price)
if match is None:
raise ValueError("Unexpected demo price format")
print(json.dumps({
"product_key": "books-to-scrape:a-light-in-the-attic",
"title": summary.get_by_role("heading", level=1).inner_text(),
"final_url": page.url,
"offer_type": "listed",
"price": str(Decimal(match.group(1))),
"currency": "GBP",
"display_price": display_price,
"observed_at": datetime.now(timezone.utc).isoformat(),
}, ensure_ascii=False))
finally:
browser.close()
脚本会打印一条记录,其中包含十进制金额的字符串、展示值以及时间。互联网时间戳标准定义了表示 UTC 偏移的方法,以便跨 worker 对齐观测结果。
比较成功的捕获结果
价格变动应将当前观测值,与同一报价上一次的可比观测值进行对比。发送告警前需持久化二者。如果任务再次发现相同的数值,可根据报表需求选择不改变价格历史,或记录一条确认。
| 捕获结果 | 跟踪器动作 |
|---|---|
| 相同报价且价格更低 | 记录一次降价,并关联两次观测 |
| 相同报价且价格相同 | 记录采集健康状态或一次确认 |
| 货币或购买类型发生变化 | 在比较前重新检查报价键 |
| 访问受阻、价格缺失或意外重定向 | 记录一次采集问题,并保留上一次有效观测 |
从演示页面迁移到真实目标时,请使用经过验证的本地化价格解析器,并存储价格计价基础。会员价与普通报价应分别成列。对于选择之后才渲染内容的页面,要同时等待已选变体标记和价格区域。为解析器做版本管理,以便在页面改版导致误报时可以回溯。
何时将 Playwright 迁移到托管浏览器
从本地工作进程开始。当工作进程维护或重复运行成为实际负担时,再迁移到用于网页自动化的托管浏览器。浏览器总览介绍了云端会话,Scrapeless 价格有助于估算这一变更的成本。将 Playwright 定位器和 offer 密钥掌握在自己手中。Puppeteer 代理工作流涵盖了相关的路由问题。
结论
该演示会打印一个商品报价。在将相同方法用于多家零售商之前,先测试当价格区域为空、货币变更或页面重定向时会发生什么。这些观察中的任何一种情况都不应替代上一次可比价格。
准备好构建你的竞争对手价格追踪器了吗?
加入 Discord 或 Telegram 社区,与正在构建价格追踪流程的开发者交流。在 Scrapeless 控制台创建账号开始使用。
常见问题
问:竞争对手价格追踪器应该多久运行一次?
选择与团队使用提醒的方式以及站点允许的请求配额相匹配的节奏。价格报告和时间敏感型促销监控可以采用不同的调度频率。
问:Playwright 价格监控是否一定需要代理?
在允许的区域路径下,可以重现本地店面视图。单一市场的演示或经批准的本地来源可以使用其普通连接。
问:如果站点出现访问挑战,追踪器应该怎么做?
记录失败,并与站点所有者一起审查访问路径。保留先前成功获取的报价作为比较基线。
问:可以在没有 AI 代理的情况下运行吗?
Playwright 和调度器可以收集并比较观测结果。在有限并发下运行,并在已知的商品页面上验证变更后的定位器。
问:可以监控任何竞争对手店面吗?
使用已获批准的界面,并在范围不明确时,与法律顾问一起审查适用条款、采集限制以及再利用权利。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。


