~/ecommerce/sephora-scraper
Sephora Scraper(全球版)
这是一款 Apify Actor,可提取 Sephora 完整的商品数据——变体、价格、图片、成分与评论——覆盖 Sephora 在美国、加拿大、9 个欧盟市场、6 个中东市场、英国、印度与 10 个亚太市场的站点,全部纳入同一套规范化 schema。
美妆
PythonCrawlee
美国加拿大法国意大利德国西班牙波兰捷克希腊罗马尼亚葡萄牙阿联酋沙特阿拉伯巴林阿曼科威特卡塔尔英国印度新西兰澳大利亚新加坡马来西亚泰国印度尼西亚菲律宾中国香港中国台湾文莱
分类ecommerce / 美妆
语言Python
技术栈Python, Crawlee
市场美国, 加拿大, 法国, 意大利, 德国, 西班牙, 波兰, 捷克, 希腊, 罗马尼亚, 葡萄牙, 阿联酋, 沙特阿拉伯, 巴林, 阿曼, 科威特, 卡塔尔, 英国, 印度, 新西兰, 澳大利亚, 新加坡, 马来西亚, 泰国, 印度尼西亚, 菲律宾, 中国香港, 中国台湾, 文莱
输出干净、RAG 就绪的 JSON
核心特性
一个 Actor 覆盖美国、加拿大、9 个欧盟市场、6 个中东市场、英国与印度,以及 10 个亚太市场
自动识别市场——粘贴任意 sephora.* URL,调度器会自动路由到对应模块
支持混合多市场运行——在同一个 startUrls 列表中混合 US + EU + SEA 的 URL,统一流式写入同一个数据集,并以 `market` 字段标记
语言区域正确的定价——每个站点各自的货币(共 24 种,从 USD、EUR 到 AED、INR),均由 Sephora 自身的本地化层返回
规范化 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-ro、eu-pt、eu-cz、eu-gr、mena-ae、mena-sa、mena-bh、mena-om、mena-kw、mena-qa、uk、in、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、中东、英国与印度。使用各市场自身格式的分类 ID(例如 EU 站点为 C479)——可替代直接粘贴分类页 URL。 |
onlyNewProducts | boolean | 可选 | 仅返回近期新增商品:US/Canada 与 FR、IT、DE、ES、PL、RO、PT 站点为服务端过滤;SEA 与印度站点为按最新排序的列表页。其他站点不支持。 |
newProductsPageLimit | number | 可选 | 当 onlyNewProducts 在 SEA 或印度站点运行时,每个分类抓取的列表页数。默认 3。 |
advancedFilter | string | 可选 | 仅限 US/Canada 分类列表页:原始精炼表达式,例如 filters[isNew]=true。 |
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 |
| 中东 | mena-ae | 阿联酋 | AED | sephora.me/ae-en |
| 中东 | mena-sa | 沙特阿拉伯 | SAR | sephora.me/sa-en |
| 中东 | mena-bh | 巴林 | BHD | sephora.me/bh-en |
| 中东 | mena-om | 阿曼 | OMR | sephora.me/om-en |
| 中东 | mena-kw | 科威特 | KWD | sephora.me/kw-en |
| 中东 | mena-qa | 卡塔尔 | QAR | sephora.me/qa-en |
| 英国 | uk | 英国 | GBP | sephora.co.uk |
| 印度 | in | 印度 | INR | sephora.in |
| 亚太 | 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}
使用建议
- 将代理国家固定为目标市场。 住宅出口节点与目标市场国家不匹配,是触发 403 错误的头号原因。请将
apifyProxyCountry设置为对应站点的 ISO 代码(US、FR、NZ等)。 - 先做冒烟测试。 在新市场首次正式运行前,先将
maxRequestsPerCrawl设为 10。 - 按地区调整并发数。 US:2-5。EU:3。SEA:8-16。混合运行时,每个市场都拥有各自独立的信号量。
常见问题
这个爬虫支持哪些 Sephora 站点?
美国(sephora.com)、加拿大(sephora.ca)、9 个欧盟市场(FR、IT、DE、ES、PL、CZ、GR、RO、PT)、sephora.me 上的 6 个中东市场(AE、SA、BH、OM、KW、QA)、英国(sephora.co.uk)、印度(sephora.in),以及 10 个亚太市场(NZ、AU、SG、MY、TH、ID、PH、HK、TW、BN)。市场会根据 URL 自动识别——可能是主机名,也可能是 sephora.me 上 /ae-en/ 这类路径前缀——因此混合多个市场运行时无需额外输入。
可以在一次运行中抓取多个市场吗?
可以。在同一个 startUrls 列表中混合 sephora.com、sephora.fr 与 sephora.nz 的 URL 即可。调度器会按市场对它们分组,以各市场对应的认证方式并发运行各模块,并为数据集中的每条记录打上 `market` 字段标记。
爬虫是如何处理反爬虫防护的?
所有市场都通过住宅代理抓取,请求被拦截时会自动换新会话重试。将代理国家固定为站点所在市场,成功率最高。
我现有的 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 住宅代理。