~/ecommerce/sephora-scraper
Sephora Scraper(글로벌)
미국, 캐나다, EU 9개국, 아시아태평양 10개국 등 21개 스토어에서 상품 변형, 가격, 이미지, 성분, 리뷰까지 Sephora의 전체 상품 데이터를 하나의 정규화된 스키마로 추출하는 Apify 액터입니다.
뷰티
>99% 성공률
PythonCrawleecurl_cffi
미국캐나다프랑스이탈리아독일스페인폴란드체코그리스루마니아포르투갈뉴질랜드호주싱가포르말레이시아태국인도네시아필리핀홍콩대만브루나이
카테고리ecommerce / 뷰티
언어Python
스택Python, Crawlee, curl_cffi
마켓미국, 캐나다, 프랑스, 이탈리아, 독일, 스페인, 폴란드, 체코, 그리스, 루마니아, 포르투갈, 뉴질랜드, 호주, 싱가포르, 말레이시아, 태국, 인도네시아, 필리핀, 홍콩, 대만, 브루나이
성공률>99%
출력클린한 RAG-레디 JSON
주요 기능
하나의 액터에 21개 스토어 — 미국, 캐나다, EU 9개국, APAC 10개국을 단일 SKU로 커버
자동 마켓 감지 — sephora.* URL을 붙여넣으면 디스패처가 알맞은 모듈로 라우팅
다중 마켓 혼합 실행 — 미국 + EU + SEA URL을 하나의 startUrls 목록에 담으면 `market`으로 태그된 단일 데이터셋으로 스트리밍
로케일에 맞는 가격 — Sephora 자체 로컬라이제이션 레이어가 반환하는 NZD, EUR, USD, AUD 등 17개 이상의 통화
정규화된 스키마 — 모든 마켓이 동일한 `source / brand / title / options / variants / medias / stats` 구조로 출력
마켓별 세션 격리 — 인증 상태가 지역 간에 섞이지 않음
글로벌 서킷 브레이커 — 50회 연속 실패 시 실행을 중단해 다운된 타겟에 컴퓨팅 자원을 낭비하지 않음
활용 사례
- 미국, EU, APAC 뷰티 마켓 전반의 범지역 가격 인텔리전스
- 마켓 간 상품 재고 및 구색 모니터링
- 새로운 Sephora 지역에 진출하는 브랜드를 위한 경쟁사 분석
- 지역별 포뮬레이션 간 성분 비교
- 리뷰 및 평점 추적 — SEA 위시리스트 신호와 미국 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 전용. C479와 같은 SFCC 카테고리 ID — 카테고리 URL을 붙여넣는 대신 사용할 수 있습니다. |
proxy | object | 선택 | Apify 프록시 설정. 레지덴셜을 강력히 권장하며, apifyProxyCountry를 타겟 마켓으로 고정하세요. |
maxConcurrency | number | 선택 | 동시 요청 수. 기본값 5. 미국: 2-5. EU: 3. SEA: 8-16. |
maxRequestsPerCrawl | number | 선택 | 모든 마켓을 아우르는 전역 상한. 0 = 무제한. |
지원 마켓
| 지역 | 마켓 ID | 국가 | 통화 | 호스트네임 |
|---|---|---|---|---|
| 아메리카 | us | 미국 | USD | sephora.com |
| 아메리카 | us | 캐나다 | CAD | sephora.ca |
| EU | eu-fr | 프랑스 | EUR | sephora.fr |
| EU | eu-it | 이탈리아 | EUR | sephora.it |
| EU | eu-de | 독일 | EUR | sephora.de |
| EU | eu-es | 스페인 | EUR | sephora.es |
| EU | eu-pl | 폴란드 | PLN | sephora.pl |
| EU | eu-cz | 체코 | CZK | sephora.cz |
| EU | eu-gr | 그리스 | EUR | sephora.gr |
| EU | eu-ro | 루마니아 | RON | sephora.ro |
| EU | eu-pt | 포르투갈 | EUR | sephora.pt |
| APAC | sea-nz | 뉴질랜드 | NZD | sephora.nz |
| APAC | sea-au | 호주 | AUD | sephora.com.au |
| APAC | sea-sg | 싱가포르 | SGD | sephora.sg |
| APAC | sea-my | 말레이시아 | MYR | sephora.com.my |
| APAC | sea-th | 태국 | THB | sephora.co.th |
| APAC | sea-id | 인도네시아 | IDR | sephora.co.id |
| APAC | sea-ph | 필리핀 | PHP | sephora.ph |
| APAC | sea-hk | 홍콩 | HKD | sephora.hk |
| APAC | sea-tw | 대만 | TWD | sephora.tw |
| APAC | 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}
팁
- 프록시 국가를 타겟 마켓에 고정하세요. 국가가 일치하지 않는 레지덴셜 출구 IP는 Sephora의 Akamai 레이어에서 403이 발생하는 가장 큰 원인입니다.
apifyProxyCountry를 스토어의 ISO 코드(US,FR,NZ등)로 설정하세요. - 먼저 스모크 테스트를 하세요. 새로운 마켓에서 첫 프로덕션 실행을 하기 전에
maxRequestsPerCrawl=10으로 설정해보세요. - 지역별로 동시성을 조정하세요. 미국: 2-5. EU: 3. SEA: 8-16. 혼합 실행에서는 각 마켓이 자체 세마포어를 가집니다.
자주 묻는 질문
이 스크래퍼는 어떤 Sephora 스토어를 지원하나요?
21개 스토어: 미국(sephora.com), 캐나다(sephora.ca), EU 9개국(FR, IT, DE, ES, PL, CZ, GR, RO, PT), APAC 10개국(NZ, AU, SG, MY, TH, ID, PH, HK, TW, BN)을 지원합니다. 마켓은 호스트네임으로 자동 감지되므로, 여러 마켓을 섞어도 입력을 바꿀 필요가 없습니다.
한 번의 실행으로 여러 마켓을 크롤링할 수 있나요?
네. sephora.com, sephora.fr, sephora.nz URL을 하나의 startUrls 목록에 섞어서 넣으면 됩니다. 디스패처가 이를 마켓별로 그룹화하고, 각 모듈을 마켓에 맞는 인증으로 동시 실행하며, 모든 데이터셋 항목에 `market` 필드를 태그합니다.
스크래퍼는 안티봇 방어를 어떻게 처리하나요?
모든 마켓에서 레지덴셜 프록시를 사용하며, EU와 SEA 트래픽에는 curl_cffi로 브라우저급 TLS 핑거프린팅을 적용해 Akamai를 우회합니다. 미국 트래픽은 403/429에서 로테이션하는 세션 풀을 갖춘 Crawlee의 HttpCrawler를 사용합니다.
기존 v1.x 미국 실행 설정도 계속 동작하나요?
네. 2.0 이전 입력값(startUrls, maxConcurrency, proxy, maxRequestsPerCrawl)은 동일하게 동작합니다. 유일한 출력 변경사항은 모든 항목에 새로 추가된 `market` 키뿐이며, 이는 기존 구조를 해치지 않는 추가적 변경입니다.
SEA 데이터에서 일부 필드가 null인 이유는 무엇인가요?
Sephora SEA의 API는 `lovesCount` 카운터를 노출하지 않으므로, APAC 항목은 `stats.lovesCount = null`이 됩니다. 대신 각 변형에는 불리언 `wishlisted` 필드가 있습니다. 반대로 `sentiments`(AI 리뷰 요약)와 `source.crawlUrl`은 미국 전용입니다.
마켓별로 별도의 API 토큰이나 계정이 필요한가요?
아니요. 기존 Apify API 토큰을 그대로 사용할 수 있습니다. 액터가 내부적으로 마켓별 게스트 토큰을 처리하므로 EU/SEA에는 별도의 인증 정보가 필요 없고, 미국은 표준 Apify 레지덴셜 프록시로 동작합니다.