电商 — 商品列表
类目/搜索 URL 或关键词 + 过滤条件 → 分页商品列表(每项含 URL、名称、价格、图片、评分)
语言
所有面向用户的流程输出(进度更新、流程提示)都使用用户语言。
目标
从任意电商品类页、搜索结果页或关键词搜索页提取结构化的商品列表,支持价格/品牌/评分过滤与多页翻页。
前置条件
- 目标浏览器已打开并已连接
- 公开列表页无需登录
执行前检查
1. 工具就绪
如果当前会话中已确认 browser-act 可用 → 跳过本步。
通过 Skill 工具调用 browser-act 加载用法。如果出现安装或配置问题,按其指引解决后重试。
能力组成
本技能的操作边界 = 用户在自己浏览器里能手动做到的事。它只读取页面上已经展示给用户的数据。JS 代码封装在
scripts/目录下的 Python 文件中,通过eval "$(python scripts/xxx.py {params})"调用。使用 bash 工具执行。
DOM:从当前页面提取商品列表
先导航到列表/搜索页,然后提取:
eval "$(python scripts/extract-listing.py --max-results 20)"
参数:
--max-results:每页返回的最大条目数,默认 20
输出示例:
{
"count": 20,
"items": [
{
"url": "https://www.amazon.com/dp/B09WNK39JN",
"name": "Amazon Echo Pop",
"price": 39.99,
"currency": "USD",
"image": "https://m.media-amazon.com/images/I/...jpg",
"rating": 4.7,
"review_count": 103789,
"asin": "B09WNK39JN"
}
]
}
DOM:获取下一页 URL
提取完一页后,获取下一页要导航的 URL:
eval "$(python scripts/extract-listing-next-page.py)"
输出示例:
{"next_url": "https://www.amazon.com/s?k=headphones&page=2", "has_next": true, "method": "amazon"}
当 has_next 为 false 时,翻页结束。
组合能力:带过滤条件的关键词搜索 → 商品列表
步骤一 —— 用过滤条件构造搜索 URL:
按目标站点与所需过滤条件,用下面的模式构造 URL,然后导航:
Amazon(amazon.com):
https://www.amazon.com/s?k={keyword_urlencoded}&s={sort}&rh={filter_params}
- 排序(
s):price-asc-rank|price-desc-rank|review-rank|date-desc-rank(省略则按相关度) - 价格过滤:把
p_36:{min_cents}-{max_cents}追加到rh(美元 × 100,例如 $50–$200 →p_36:5000-20000) - 评分过滤:把
avg_customer_review:four-and-above|three-and-above|two-and-above追加到rh - 仅看有货:把
p_n_availability:1248801011追加到rh - 多个
rh值:用逗号分隔(例如rh=p_36:5000-20000,avg_customer_review:four-and-above)
eBay(ebay.com):
https://www.ebay.com/sch/i.html?_nkw={keyword_urlencoded}&_udlo={min_price}&_udhi={max_price}&_sop={sort_num}
- 排序:
12=BestMatch |15=PriceLow |16=PriceHigh |24=NewlyListed
Walmart(walmart.com):
https://www.walmart.com/search?q={keyword_urlencoded}&min_price={min}&max_price={max}&sort={sort}
- 排序:
best_match|price_low|price_high|rating_high
Google Shopping(跨站,未指定 --site):
https://www.google.com/search?tbm=shop&q={keyword_urlencoded}&tbs=p_ord:{sort}
- 排序:
rv=relevance |pd=price ascending |prd=price descending
任意站点 + --site(通用):
https://{site}/search?q={keyword_urlencoded}
步骤二 —— 导航并提取:
navigate {constructed_url}→wait stableeval "$(python scripts/extract-listing.py --max-results {n})"
步骤三 —— 翻页(重复直到完成):
eval "$(python scripts/extract-listing-next-page.py)"- 若
has_next为 true:navigate {next_url}→wait stable→ 重新运行 extract-listing.py - 若
has_next为 false:停止
翻页
URL 翻页:extract-listing-next-page.py 会检测 rel=next 链接、平台特定的翻页控件以及 URL 页码参数,并返回用于导航的 next_url。
DOM 翻页:对于带"加载更多"按钮的站点(部分 Shopify 主题):
- 用
state找到 "Load more" 或 "Show more" 按钮 click <index>→wait stable→ 重新运行extract-listing.py- 终止条件:按钮不再存在,或条目数不再增长
成功判据
result.count >= 1 AND items[0].url != null
已知限制
- Amazon:全新会话中直接导航可能触发反爬检测 —— 先从
https://www.amazon.com导航 - eBay 列表页可能需要先从
https://www.ebay.com导航 - Google Shopping 结果的 SPA 结构复杂,准确率可能下降;指定了
--site时优先用站内搜索 - 过滤 URL 参数是站点特定的;部分站点会静默忽略不支持的过滤参数
- Shopify 主题差异很大;如果通用 DOM 策略漏掉了条目,检查页面源码里是否有 JSON-LD ItemList 或 Product 数组
执行效率
- 批量编排:在单个会话内串行遍历各页;页面导航之间加 1–2 秒间隔
- 批量前先测试:先用 1 页测试,再跑多页提取
- 错误续跑:记录页码;失败时从最后成功的页继续
经验记录
路径:{working-directory}/browser-act-skill-forge-memories/ecommerce-scraper-ecommerce-listing.memory.md
执行前:如果该文件存在,先读它 —— 它记录了过去执行中遇到过的意外情况;据此调整策略顺序。
执行后:如果遇到意外情况(策略失效、页面改版、反爬升级、发现更好路径),追加一行:
{YYYY-MM-DD}: {发生了什么} → {结论}
微信扫一扫