~/ecommerce/sephora-scraper

Sephora Scraper(全球版)

这是一款 Apify Actor,可提取 Sephora 完整的商品数据——变体、价格、图片、成分与评论——覆盖 Sephora 在美国、加拿大、9 个欧盟市场、6 个中东市场、英国、印度与 10 个亚太市场的站点,全部纳入同一套规范化 schema。

美妆 PythonCrawlee 美国加拿大法国意大利德国西班牙波兰捷克希腊罗马尼亚葡萄牙阿联酋沙特阿拉伯巴林阿曼科威特卡塔尔英国印度新西兰澳大利亚新加坡马来西亚泰国印度尼西亚菲律宾中国香港中国台湾文莱
proooxy/sephora-scraper — 规格
分类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 情感摘要
  • 按市场审计会员/忠诚度定价

输入参数

参数类型必填说明
startUrlsarray必填任意 sephora.* 站点的商品页或分类页 URL。市场会根据主机名自动识别。
marketstring可选可选的市场覆盖设置(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)。
localestring可选可选的 BCP 47 语言区域代码(例如 fr-FR、en-NZ)——会覆盖市场默认值。
categoryIdsarray可选EU、中东、英国与印度。使用各市场自身格式的分类 ID(例如 EU 站点为 C479)——可替代直接粘贴分类页 URL。
onlyNewProductsboolean可选仅返回近期新增商品:US/Canada 与 FR、IT、DE、ES、PL、RO、PT 站点为服务端过滤;SEA 与印度站点为按最新排序的列表页。其他站点不支持。
newProductsPageLimitnumber可选当 onlyNewProducts 在 SEA 或印度站点运行时,每个分类抓取的列表页数。默认 3。
advancedFilterstring可选仅限 US/Canada 分类列表页:原始精炼表达式,例如 filters[isNew]=true。
proxyobject可选Apify 代理配置。强烈建议使用住宅代理;请将 apifyProxyCountry 固定为目标市场。
maxConcurrencynumber可选并发请求数。默认 5。US:2-5。EU:3。SEA:8-16。
maxRequestsPerCrawlnumber可选跨所有市场的全局硬性上限。0 表示不限。

支持的市场

地区市场 ID国家/地区币种域名
美洲us美国USDsephora.com
美洲us加拿大CADsephora.ca
欧盟eu-fr法国EURsephora.fr
欧盟eu-it意大利EURsephora.it
欧盟eu-de德国EURsephora.de
欧盟eu-es西班牙EURsephora.es
欧盟eu-pl波兰PLNsephora.pl
欧盟eu-cz捷克CZKsephora.cz
欧盟eu-gr希腊EURsephora.gr
欧盟eu-ro罗马尼亚RONsephora.ro
欧盟eu-pt葡萄牙EURsephora.pt
中东mena-ae阿联酋AEDsephora.me/ae-en
中东mena-sa沙特阿拉伯SARsephora.me/sa-en
中东mena-bh巴林BHDsephora.me/bh-en
中东mena-om阿曼OMRsephora.me/om-en
中东mena-kw科威特KWDsephora.me/kw-en
中东mena-qa卡塔尔QARsephora.me/qa-en
英国uk英国GBPsephora.co.uk
印度in印度INRsephora.in
亚太sea-nz新西兰NZDsephora.nz
亚太sea-au澳大利亚AUDsephora.com.au
亚太sea-sg新加坡SGDsephora.sg
亚太sea-my马来西亚MYRsephora.com.my
亚太sea-th泰国THBsephora.co.th
亚太sea-id印度尼西亚IDRsephora.co.id
亚太sea-ph菲律宾PHPsephora.ph
亚太sea-hk中国香港HKDsephora.hk
亚太sea-tw中国台湾TWDsephora.tw
亚太sea-bn文莱BNDsephora.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 住宅代理。

~/ecommerce 下的相关工具

运行 Sephora Scraper(全球版),或定制专属方案

几分钟内即可在 Apify 上开始提取数据,或聘请我为你的目标源和 schema 定制专属爬虫与 RAG 管道。

在 Apify 上运行 获取定制数据