~/ecommerce/sephora-scraper
Sephora Scraper(全球版)
这是一款 Apify Actor,可提取 Sephora 完整的商品数据——变体、价格、图片、成分与评论——覆盖美国、加拿大、9 个欧盟市场与 10 个亚太市场,共 21 个站点,全部纳入同一套规范化 schema。
美妆
成功率 >99%
PythonCrawleecurl_cffi
美国加拿大法国意大利德国西班牙波兰捷克希腊罗马尼亚葡萄牙新西兰澳大利亚新加坡马来西亚泰国印度尼西亚菲律宾中国香港中国台湾文莱
分类ecommerce / 美妆
语言Python
技术栈Python, Crawlee, curl_cffi
市场美国, 加拿大, 法国, 意大利, 德国, 西班牙, 波兰, 捷克, 希腊, 罗马尼亚, 葡萄牙, 新西兰, 澳大利亚, 新加坡, 马来西亚, 泰国, 印度尼西亚, 菲律宾, 中国香港, 中国台湾, 文莱
成功率>99%
输出干净、RAG 就绪的 JSON
核心特性
一个 Actor 覆盖 21 个站点——美国、加拿大、9 个欧盟市场与 10 个亚太市场,由同一个 SKU 统一提供服务
自动识别市场——粘贴任意 sephora.* URL,调度器会自动路由到对应模块
支持混合多市场运行——在同一个 startUrls 列表中混合 US + EU + SEA 的 URL,统一流式写入同一个数据集,并以 `market` 字段标记
语言区域正确的定价——由 Sephora 自身的本地化层返回 NZD、EUR、USD、AUD,以及另外 17 种币种
规范化 schema——所有市场都输出相同的 `source / brand / title / options / variants / medias / stats` 结构
按市场隔离会话——认证状态不会在地区之间相互污染
全局熔断机制——连续 50 次失败会中止运行,避免在目标下线时持续消耗算力
应用场景
- 覆盖美国、欧盟与亚太美妆市场的跨地区定价情报
- 跨市场商品可购性与选品结构监控
- 品牌进入 Sephora 新市场时的竞品分析
- 跨地区配方成分对比
- 评论与评分追踪——包括东南亚的心愿单信号与美国的 AI 情感摘要
- 按市场审计会员/忠诚度定价
输入参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
startUrls | array | 必填 | 任意 sephora.* 站点的商品页或分类页 URL。市场会根据主机名自动识别。 |
market | string | 可选 | 可选的市场覆盖设置(us、eu-fr、eu-it、eu-de、eu-es、eu-pl、eu-cz、eu-gr、eu-ro、eu-pt、sea-nz、sea-au、sea-sg、sea-my、sea-th、sea-id、sea-ph、sea-hk、sea-tw、sea-bn)。 |
locale | string | 可选 | 可选的 BCP 47 语言区域代码(例如 fr-FR、en-NZ)——会覆盖市场默认值。 |
categoryIds | array | 可选 | 仅限 EU。SFCC 分类 ID(例如 C479)——可替代直接粘贴分类页 URL。 |
proxy | object | 可选 | Apify 代理配置。强烈建议使用住宅代理;请将 apifyProxyCountry 固定为目标市场。 |
maxConcurrency | number | 可选 | 并发请求数。默认 5。US:2-5。EU:3。SEA:8-16。 |
maxRequestsPerCrawl | number | 可选 | 跨所有市场的全局硬性上限。0 表示不限。 |
支持的市场
| 地区 | 市场 ID | 国家/地区 | 币种 | 域名 |
|---|---|---|---|---|
| 美洲 | us | 美国 | USD | sephora.com |
| 美洲 | us | 加拿大 | CAD | sephora.ca |
| 欧盟 | eu-fr | 法国 | EUR | sephora.fr |
| 欧盟 | eu-it | 意大利 | EUR | sephora.it |
| 欧盟 | eu-de | 德国 | EUR | sephora.de |
| 欧盟 | eu-es | 西班牙 | EUR | sephora.es |
| 欧盟 | eu-pl | 波兰 | PLN | sephora.pl |
| 欧盟 | eu-cz | 捷克 | CZK | sephora.cz |
| 欧盟 | eu-gr | 希腊 | EUR | sephora.gr |
| 欧盟 | eu-ro | 罗马尼亚 | RON | sephora.ro |
| 欧盟 | eu-pt | 葡萄牙 | EUR | sephora.pt |
| 亚太 | sea-nz | 新西兰 | NZD | sephora.nz |
| 亚太 | sea-au | 澳大利亚 | AUD | sephora.com.au |
| 亚太 | sea-sg | 新加坡 | SGD | sephora.sg |
| 亚太 | sea-my | 马来西亚 | MYR | sephora.com.my |
| 亚太 | sea-th | 泰国 | THB | sephora.co.th |
| 亚太 | sea-id | 印度尼西亚 | IDR | sephora.co.id |
| 亚太 | sea-ph | 菲律宾 | PHP | sephora.ph |
| 亚太 | sea-hk | 中国香港 | HKD | sephora.hk |
| 亚太 | sea-tw | 中国台湾 | TWD | sephora.tw |
| 亚太 | sea-bn | 文莱 | BND | sephora.bn |
输出示例
1{
2 "market": "sea-nz",
3 "source": {
4 "id": 58792,
5 "canonicalUrl": "https://www.sephora.nz/products/rare-beauty-true-to-myself-natural-matte-longwear-foundation",
6 "retailer": "SEPHORA",
7 "currency": "NZD"
8 },
9 "brand": "Rare Beauty",
10 "title": "True To Myself Natural Matte Longwear Foundation",
11 "description": "<p>A self-priming and self-setting foundation...</p>",
12 "ingredients": "Aqua/Water, Cyclopentasiloxane, Glycerin...",
13 "currentSku": "770225",
14 "categories": ["makeup/face/foundation"],
15 "options": [
16 { "name": "shade", "id": "66488", "values": [{"value": "1 Fair Neutral", "orderable": true}] }
17 ],
18 "variants": [
19 {
20 "id": "276343",
21 "sku": "770225",
22 "price": { "current": 77.0, "original": 77.0, "stockStatus": "IN_STOCK" },
23 "options": [{"name": "shade", "value": "1 Fair Neutral"}],
24 "highlights": ["NEW", "Only at Sephora"],
25 "wishlisted": null
26 }
27 ],
28 "medias": [{ "url": "https://www.sephora.nz/.../foundation-shade.jpg", "type": "image" }],
29 "stats": { "reviewCount": 971, "rating": 4.8, "lovesCount": null }
30}
使用建议
- 将代理国家固定为目标市场。 住宅出口节点与目标市场国家不匹配,是触发 Sephora Akamai 层 403 错误的头号原因。请将
apifyProxyCountry设置为对应站点的 ISO 代码(US、FR、NZ等)。 - 先做冒烟测试。 在新市场首次正式运行前,先将
maxRequestsPerCrawl设为 10。 - 按地区调整并发数。 US:2-5。EU:3。SEA:8-16。混合运行时,每个市场都拥有各自独立的信号量。
常见问题
这个爬虫支持哪些 Sephora 站点?
共 21 个站点:美国(sephora.com)、加拿大(sephora.ca)、9 个欧盟市场(FR、IT、DE、ES、PL、CZ、GR、RO、PT),以及 10 个亚太市场(NZ、AU、SG、MY、TH、ID、PH、HK、TW、BN)。市场会根据主机名自动识别——混合多个市场时无需修改输入。
可以在一次运行中抓取多个市场吗?
可以。在同一个 startUrls 列表中混合 sephora.com、sephora.fr 与 sephora.nz 的 URL 即可。调度器会按市场对它们分组,以各市场对应的认证方式并发运行各模块,并为数据集中的每条记录打上 `market` 字段标记。
爬虫是如何处理反爬虫防护的?
所有市场均使用住宅代理,EU 与 SEA 流量还会使用 curl_cffi 进行浏览器级 TLS 指纹伪装以绕过 Akamai。US 流量则使用 Crawlee 的 HttpCrawler,配合在 403/429 时自动轮换的会话池。
我现有的 v1.x 版本美国运行配置还能继续用吗?
可以。2.0 之前的输入字段——startUrls、maxConcurrency、proxy、maxRequestsPerCrawl——行为完全一致。唯一的输出变化是每条记录新增了一个 `market` 字段,这是一个非破坏性的增量变更。
为什么 SEA 数据中部分字段为 null?
Sephora SEA 的 API 不提供 `lovesCount` 计数器,因此亚太商品的 `stats.lovesCount` 为 null;每个变体改为提供一个布尔型的 `wishlisted` 字段。相对地,`sentiments`(AI 评论摘要)与 `source.crawlUrl` 仅美国市场提供。
每个市场是否都需要单独的 API 令牌或账户?
不需要。你现有的 Apify API 令牌无需任何改动即可继续使用。该 Actor 会在内部处理各市场的访客令牌——EU/SEA 无需任何凭证,US 则使用标准的 Apify 住宅代理。