~/ecommerce/macys-scraper
Macy's Scraper——商品、价格、SKU 与新闻
提取 Macy's 的商品数据——价格、变体、SKU/UPC 条码、图片、评分与评论——以及 Macy's Inc. 新闻,覆盖搜索、分类、热门与商品 URL。无需浏览器,可绕过 Akamai。
百货商店
TypeScriptCrawleeCheerio
美国
分类ecommerce / 百货商店
语言TypeScript
技术栈TypeScript, Crawlee, Cheerio
市场美国
输出干净、RAG 就绪的 JSON
核心特性
一个 Actor 覆盖四大场景——商品搜索、分类、热门商品与 Macy's Inc. 新闻
无需浏览器即可绕过 Akamai Bot Manager,直接调用 Macy's 自有的移动端与网站 JSON API
每个可购买变体的 SKU 均附带 UPC 条码、颜色、尺码、库存状态与价格
价格以整数美分存储,并附带本地化格式化字符串——杜绝浮点数舍入误差
完整的评论情报——星级分布直方图、推荐数,以及版型/尺码等二级评分
所有色号与尺码归并到同一条商品记录下,而非一个变体一行
只输出干净的规范网址——内部 API 端点与客户端密钥绝不会泄露到输出结果中
search、category、trending 与商品详情结果统一采用同一套规范化 schema
应用场景
- SKU 级别的百货商店价格与促销监控
- 竞品分析——Macy's 对比 Nordstrom、Ulta 或品牌自营 DTC 定价
- 通过每个变体的 UPC 条码实现跨零售商的商品目录匹配
- 针对 Macy's 在售品牌的评论与评分情报
- 零售新闻监控——Macy's Inc. 的新闻稿与财报公告
输入参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
scrapeType | string | 必填 | 要抓取的场景:search、category、trending、news 或 all(默认:search)。 |
query | string | 可选 | 商品搜索关键词,例如 women shoes。 |
startUrls | array | 可选 | Macy's 商品页/分类页 URL,或 Macy's Inc. 新闻页 URL。 |
categoryIds | array | 可选 | Macy's 分类 ID(例如 5449)。已知分类页 URL 时优先使用 URL。 |
trendingUrls | array | 可选 | 热门、畅销或精选榜单页 URL。 |
newsUrls | array | 可选 | Macy's Inc. 新闻列表页或文章页 URL。 |
includeProductDetails | boolean | 可选 | 为列表条目补全完整商品详情——变体、SKU、图库(默认:true)。 |
maxPages | number | 可选 | 每个列表/新闻来源的最大分页深度。 |
maxResults | number | 可选 | 输出记录数上限。0 表示不限。 |
proxy | object | 必填 | Apify Proxy 或自定义代理 URL。推荐使用美国住宅代理。 |
输出示例
1{
2 "type": "product",
3 "source": {
4 "id": "12345678",
5 "canonicalUrl": "https://www.macys.com/shop/product/calvin-klein-womens-sheath-dress?ID=12345678",
6 "retailer": "macys",
7 "currency": "USD"
8 },
9 "title": "Women's Sleeveless Sheath Dress",
10 "brand": "Calvin Klein",
11 "categories": ["Women", "Dresses", "Work Dresses"],
12 "price": {
13 "sale": 5999,
14 "list": 9800,
15 "currentFormatted": "$59.99",
16 "stockStatus": "InStock"
17 },
18 "stats": { "rating": 4.6, "reviewCount": 9, "ratingPercentage": 92 },
19 "options": [
20 { "type": "Color", "values": [{ "id": "1", "name": "Black" }] },
21 { "type": "Size", "values": [{ "id": "10", "name": "M" }, { "id": "12", "name": "L" }] }
22 ],
23 "variants": [
24 {
25 "id": "987654",
26 "sku": "192837465012",
27 "options": ["Black", "M"],
28 "price": { "stockStatus": "InStock" },
29 "extraInfo": { "upc": "192837465012" }
30 }
31 ],
32 "medias": [{ "type": "Image", "url": "https://slimages.macysassets.com/is/image/MCY/products/.../main.jpg" }]
33}
价格
按事件计费——只对实际保存的条目计费:
| 事件 | 价格 | 说明 |
|---|---|---|
| 抓取一件商品 | $0.006 | 一件完整商品详情——变体、SKU/UPC、价格、图片、评分 |
| 抓取一篇文章 | $0.002 | 一篇 Macy’s Inc. 新闻文章——标题、作者、日期、正文、图片 |
更高级别的 Apify 套餐会自动享受批量折扣(低至每件商品 $0.0045)。按标价计算,抓取 1,000 件商品约为 $6.00。
使用建议
- 使用美国住宅代理。 商品详情端点会间歇性触发速率限制;住宅代理的会话轮换能顺利通过,而数据中心 IP 会遇到更多 403 错误。
- 保持适度并发。
maxConcurrency设为 2–3 是最佳区间——更高的值只会增加触发速率限制的概率,而不会提升吞吐量。 - 优先使用分类页 URL,而非裸 ID。 URL 中携带了 API 所需的分类路径;单独的 ID 可能会解析出范围过大或为空的结果集。
- 不需要变体或描述信息时,可关闭
includeProductDetails,实现快速的列表级抓取(名称、品牌、列表价格、图片、评分)。
常见问题
在不使用浏览器的情况下,它是如何绕过 Akamai 的?
它根本不需要正面应对 JS 挑战。列表数据来自 Macy's 移动 App 的 API,商品详情来自网站自身的 JSON API——两者都运行在能够响应匿名读取请求的独立基础设施上。无需登录、无需 cookie、无需 API 密钥。
价格单位是美元还是美分?
以整数美分存储(5999 = $59.99),以避免浮点数舍入误差,同时附带本地化格式化字符串($59.99)。
变体与 UPC 是如何处理的?
所有颜色与尺码都归并在同一条商品记录的 variants[] 数组下。每个变体都携带各自的 UPC 条码、颜色、尺码、库存状态与价格——这些数据来自 Macy's 的 SKU 关系数据,而非从色卡组件上抓取。
可以在一次运行中同时抓取商品与新闻吗?
可以。将 scrapeType 设为 all,并按需组合提供 query、startUrls、categoryIds、trendingUrls 与 newsUrls。