API vs HTML: 알리익스프레스 데이터 수집의 첫 번째 선택
알리익스프레스를 scrape할 때 가장 먼저 결정해야 할 것은 HTML 파싱과 API 엔드포인트 직접 호출 중 어느 방식을 택할지입니다. 데스크톱 HTML은 렌더링 의존적이고 선택자가 자주 변경되며, 반응형 SPA 구조로 인해 단순 requests.get()으로는 빈 껍데기만 돌아오는 경우가 많습니다.
반면 알리익스프레스 모바일 API는 정형 JSON을 반환하고, 변형 SKU, 배송비, 판매자 평판 데이터를 단일 응답에 포함합니다. 이 가이드에서는 두 접근을 비교하고, 모바일 API 기반 AliExpress product research 파이프라인을 구축하는 방법을 다룹니다.
알리익스프레스 사이트 구조 이해하기
데이터를 수집하려면 먼저 알리익스프레스가 어떤 페이지 구조를 가지는지 파악해야 합니다. 주요 진입점은 다음과 같습니다.
검색 결과 페이지
URL 패턴: https://www.aliexpress.com/wholesale?SearchText=wireless+earbuds
검색 결과는 무한 스크롤로 동작하며, 초기 로드 시 약 60개 상품이 렌더링되고 이후 JSON API를 통해 추가 페이지를 로드합니다. 데스크톱 HTML에서 상품 카드의 주요 선택자:
- CSS:
div._3GR7u div.manhattan--container--1lP57Ag - 상품 제목:
h1.manhattan--title--1N0ATV5 - 가격: div.manhattan--price--1N0ATV5
하지만 이 선택자들은 프론트엔드 빌드마다 변경될 수 있으므로, 안정적인 API 호출이 장기적으로 더 유리합니다.
상품 상세 페이지
URL 패턴: https://www.aliexpress.com/item/1234567890.html
상품 상세 페이지에는 제목, 가격, 변형(SKU), 설명, 리뷰, 판매자 정보가 포함됩니다. HTML 내에 window.runParams이라는 JSON 객체가 임베드되어 있어, 정규식으로 추출할 수 있습니다.
import re, json, requests
url = "https://www.aliexpress.com/item/1234567890.html"
html = requests.get(url, headers={"User-Agent": "..."}).text
match = re.search(r"window\.runParams\s*=\s*({.+?});", html)
if match:
data = json.loads(match.group(1))
print(data["data"]["titleModule"]["subject"])
스토어 페이지
URL 패턴: https://www.aliexpress.com/store/912345678
스토어 페이지에서는 판매자의 전체 상품 목록, 평점, 응답률 등을 확인할 수 있습니다. 스토어 데이터는 상품 상세 페이지의 storeModule에서도 추출 가능합니다.
인기 상품 피드
알리익스프레스는 https://www.aliexpress.com/popular/wireless-earbuds.html 형태의 인기 상품 피드를 제공합니다. 이 피드는 카테고리별 트렌딩 상품을 보여주며, 드롭시핑 상품 리서치에 유용합니다.
알리바바 그룹의 안티봇 스택
알리익스프레스는 알리바바의 정교한 안티봇 인프라를 공유합니다. 주요 방어 수단은 다음과 같습니다.
- WAF (Web Application Firewall): 비정상적 트래픽 패턴, 헤더 조합, TLS 핑거프린트를 기반으로 차단합니다.
- 기기 핑거프린팅: 브라우저 캔버스, WebGL, 오디오 컨텍스트 핑거프린트를 수집합니다.
- 행동 분석: 마우스 움직임, 스크롤 패턴, 클릭 간격을 분석해 봇 여부를 판단합니다.
- 속도 제한: 동일 IP에서 분당 약 80~120요청 이상 시 429 응답 또는 CAPTCHA 챌린지를 반환합니다.
- 모바일 API 인증:
sgsignature헤더와 타임스탬프 기반 서명을 요구합니다. 서명 알고리즘은 주기적으로 변경됩니다.
핵심 인사이트: 데이터센터 IP 대역은 알리바바 WAF가 즉시 차단하는 우선 순위 목록에 포함되어 있습니다. AliExpress proxy로 레지덴셜 또는 모바일 프록시를 사용하는 것이 필수적입니다.
모바일 API 엔드포인트: 데스크톱 HTML보다 풍부한 JSON
알리익스프레스 모바일 앱은 데스크톱 웹보다 구조화된 JSON 데이터를 반환하는 API 엔드포인트를 사용합니다. 주요 엔드포인트는 다음과 같습니다.
상품 검색 API
https://m.aliexpress.com/api/search/items?keyword=wireless+earbuds&page=1
검색 결과를 JSON 배열로 반환합니다. 각 상품 항목에는 제목, 가격, 이미지 URL, 판매량, 평점이 포함됩니다.
상품 상세 API
https://m.aliexpress.com/api/item/detail?itemId=1234567890
단일 상품의 전체 정보를 반환합니다. 변형 SKU, 배송 옵션, 판매자 평판 데이터가 모두 포함됩니다.
샘플 응답 (축약)
{
"data": {
"itemId": "1234567890",
"subject": "TWS Wireless Earbuds V5.3",
"price": {"minPrice": "8.99", "maxPrice": "15.99"},
"skuList": [
{"skuId": "sku001", "color": "Black", "price": "8.99", "stock": 1523},
{"skuId": "sku002", "color": "White", "price": "9.49", "stock": 876}
],
"shippingOptions": [
{"method": "Cainiao Super Economy", "price": "0.00", "days": "35-50"}
],
"seller": {
"storeId": "912345678",
"positiveRate": "97.2",
"yearsOnPlatform": 5
}
}
}
API 접근 시 주의사항
- 모바일 API는
sgsignature헤더가 필요합니다. 이 서명은 앱 버전, 타임스탬프, 시크릿 키를 조합해 생성됩니다. - 서명 알고리즘이 변경되면 기존 스크립트가 작동하지 않습니다. 대안으로
aeapi오픈소스 라이브러리나 미러 엔드포인트를 활용할 수 있습니다. - 요청 시 모바일 User-Agent와 적절한 헤더를 포함해야 합니다.
프록시 유형 비교: 알리익스프레스 스크레이핑에 최적의 선택
| 프록시 유형 | 성공률 | 속도 | 지역 타겟팅 | 비용 | 추천 용도 |
|---|---|---|---|---|---|
| 레지덴셜 | 높음 (95%+) | 중간 | 국가/도시 | 중간 | 상품 상세, 검색 |
| 모바일 | 가장 높음 (98%+) | 낮음~중간 | 국가/통신사 | 높음 | 모바일 API 호출 |
| 데이터센터 | 낮음 (30~50%) | 빠름 | 제한적 | 낮음 | 차단 위험 높아 비추천 |
알리바바 WAF는 데이터센터 IP를 즉시 식별하므로, AliExpress proxy로는 레지덴셜 또는 모바일 프록시가 필수입니다. 대량 수집이 아닌 소규모 테스트에만 데이터센터를 고려하세요.
Python 실전: 레지덴셜 프록시로 트렌딩 상품 발굴하기
다음은 ProxyHat 레지덴셜 프록시를 사용해 알리익스프레스 모바일 API에서 트렌딩 상품을 수집하는 Python 스크립트입니다.
import requests, json, time
from datetime import datetime
PROXY_URL = "http://user-country-US:PASSWORD@gate.proxyhat.com:8080"
PROXIES = {"http": PROXY_URL, "https": PROXY_URL}
HEADERS = {
"User-Agent": "AliApp/8.59.0 (iPhone; iOS 17.0; Scale/3.00)",
"X-Client-Type": "iphone",
"X-App-Version": "8.59.0",
"Accept": "application/json",
}
def search_trending(keyword: str, pages: int = 3) -> list:
"""Search AliExpress mobile API for trending products."""
results = []
for page in range(1, pages + 1):
url = (
f"https://m.aliexpress.com/api/search/items"
f"?keyword={keyword}&page={page}&sortType=SALE_PRICE_ASC"
)
resp = requests.get(url, headers=HEADERS, proxies=PROXIES, timeout=30)
if resp.status_code != 200:
print(f"Page {page} failed: {resp.status_code}")
break
data = resp.json()
items = data.get("data", {}).get("itemList", [])
for item in items:
results.append({
"itemId": item.get("itemId"),
"title": item.get("subject", ""),
"minPrice": item.get("price", {}).get("minPrice", ""),
"orders": item.get("trade", 0),
"rating": item.get("rating", ""),
})
time.sleep(2) # rate-limit buffer
return results
trending = search_trending("wireless earbuds", pages=3)
for p in trending[:5]:
print(json.dumps(p, ensure_ascii=False, indent=2))
변형 SKU, 배송비, 판매자 평판 데이터 처리
드롭시핑 상품 리서치에서 가장 중요한 데이터 포인트는 변형 SKU별 가격과 재고, 배송비, 판매자 신뢰도입니다. 상세 API에서 이를 추출하는 방법을 살펴보겠습니다.
변형 SKU 파싱
알리익스프레스 상품은 색상, 사이즈 등 여러 변형을 가집니다. skuList 배열에서 각 변형의 가격과 재고를 추출합니다.
def parse_product_detail(item_id: str) -> dict:
"""Fetch and parse product detail from mobile API."""
url = f"https://m.aliexpress.com/api/item/detail?itemId={item_id}"
resp = requests.get(url, headers=HEADERS, proxies=PROXIES, timeout=30)
resp.raise_for_status()
data = resp.json().get("data", {})
# Parse variant SKUs
skus = []
for sku in data.get("skuList", []):
skus.append({
"skuId": sku.get("skuId"),
"variant": sku.get("variantName", "default"),
"price": float(sku.get("price", 0)),
"stock": int(sku.get("stock", 0)),
})
# Parse shipping by destination
shipping = []
for opt in data.get("shippingOptions", []):
shipping.append({
"method": opt.get("method"),
"price": float(opt.get("price", 0)),
"days": opt.get("days", ""),
"destination": opt.get("destination", "US"),
})
# Seller reputation
seller = data.get("seller", {})
seller_info = {
"storeId": seller.get("storeId"),
"positiveRate": float(seller.get("positiveRate", 0)),
"yearsOnPlatform": int(seller.get("yearsOnPlatform", 0)),
"responseRate": seller.get("responseRate", "N/A"),
}
return {
"itemId": item_id,
"title": data.get("subject", ""),
"skus": skus,
"shipping": shipping,
"seller": seller_info,
}
result = parse_product_detail("1234567890")
print(json.dumps(result, ensure_ascii=False, indent=2))
배송비 목적지별 추정
배송비는 목적지 국가에 따라 크게 다릅니다. API 호출 시 shipToCountry 파라미터를 추가해 특정 국가의 배송비를 조회할 수 있습니다.
# Ship to South Korea
url = (
f"https://m.aliexpress.com/api/item/detail"
f"?itemId=1234567890&shipToCountry=KR"
)
resp = requests.get(url, headers=HEADERS, proxies=PROXIES, timeout=30)
shipping_data = resp.json()["data"]["shippingOptions"]
for s in shipping_data:
print(f"{s['method']}: ${s['price']} ({s['days']} days)")
판매자 평판 평가 기준
드롭시핑 상품 리서치에서 판매자 평판은 다음 기준으로 필터링하는 것이 좋습니다.
- 긍정 평가율: 95% 이상 우선 선택
- 플랫폼 경력: 3년 이상 판매자 우선
- 응답률: 90% 이상 권장
- 주문 처리 시간: 24시간 이내 출하 선호
데이터 신선도: 가격과 재고 변경 주기와 수집 케이던스
알리익스프레스의 가격과 재고는 매우 동적입니다. 이해해야 할 핵심 패턴은 다음과 같습니다.
변경 빈도
- 가격: 프로모션 기간(11.11, 6.18 등)에는 시간 단위로 변동합니다. 일반적으로 인기 상품은 하루 2~3회, 비인기 상품은 주 1~2회 변경됩니다.
- 재고: 베스트셀러의 경우 분 단위로 소진될 수 있습니다. 일반 상품은 일 단위 변동입니다.
- 판매량: 누적 주문 수는 실시간으로 업데이트됩니다.
권장 수집 케이던스
| 데이터 유형 | 권장 빈도 | 비고 |
|---|---|---|
| 트렌딩 상품 발굴 | 1회/일 | 카테고리별 상위 100개 |
| 가격 모니터링 | 4회/일 (6시간 간격) | 핵심 상품 500개 이내 |
| 재고 추적 | 1회/시간 | 품절 방지가 중요한 상품만 |
| 판매자 평판 | 1회/주 | 변동이 적어 빈번 불필요 |
과도한 수집은 IP 차단과 API 레이트 리밋(분당 80~120요청)을 유발합니다. 프록시 레이트 리밋 모범 사례를 참고해 요청 간격을 조절하세요.
안티봇 우회 실전 팁
알리익스프레스의 안티봇 시스템을 우회하기 위한 실전 팁입니다.
1. 레지덴셜 프록시 회전 전략
요청마다 다른 IP를 사용하는 per-request rotation이 기본 전략입니다. ProxyHat에서는 세션 플래그 없이 사용자명만 전달하면 자동 회전됩니다.
# Per-request rotation (new IP every request)
proxy_url = "http://user-country-US:PASSWORD@gate.proxyhat.com:8080"
# Sticky session (same IP for 10-30 minutes)
sticky_proxy = "http://user-country-US-session-abc123:PASSWORD@gate.proxyhat.com:8080"
2. 요청 헤더 최적화
- 모바일 API 호출 시 모바일 User-Agent 사용
Accept-Language헤더를 프록시 국가와 일치Referer헤더 포함- 요청 간 2~5초 지연 추가
3. 지역 타겟팅
특정 국가의 가격과 배송비를 확인하려면 프록시 국가를 해당 국가로 설정하세요. 한국 가격 확인 예시:
KR_PROXY = "http://user-country-KR:PASSWORD@gate.proxyhat.com:8080"
kr_proxies = {"http": KR_PROXY, "https": KR_PROXY}
# Same search with Korean exit IP
resp = requests.get(url, headers=HEADERS, proxies=kr_proxies, timeout=30)
4. CAPTCHA 대응
CAPTCHA가 발생하면 즉시 해당 세션을 중단하고 새 IP로 전환하세요. ProxyHat의 자동 회전을 활용하면 수동 개입 없이 CAPTCHA 이후 복구가 가능합니다. CAPTCHA 빈도가 높다면 요청 속도를 낮추거나 웹 스크레이핑 모범 사례를 검토하세요.
윤리적·법적 고려사항
알리익스프레스 스크레이핑 시 다음 사항을 준수하세요.
- robots.txt 확인: 알리익스프레스 robots.txt는 주요 API 경로를 허용하지 않습니다. 공개 API 엔드포인트 사용 시에도 속도 제한을 준수하세요.
- 이용약관: 알리익스프레스 이용약관은 자동화된 데이터 수집을 금지합니다. 상업적 용도의 대량 수집은 법적 리스크가 있습니다.
- GDPR/CCPA: 개인 데이터(리뷰 작성자 정보 등)를 수집할 때는 관련 프라이버시 법규를 준수해야 합니다.
- 합리적 속도: 서버에 과부하를 주지 않는 요청 속도를 유지하세요.
핵심 요약
Key Takeaways
- 알리익스프레스 스크레이핑은 모바일 API 엔드포인트가 HTML 파싱보다 안정적이고 풍부한 데이터를 제공합니다.
- 알리바바 WAF는 데이터센터 IP를 즉시 차단하므로 레지덴셜 또는 모바일 프록시가 필수입니다.
- 변형 SKU, 배송비, 판매자 평판은 상세 API에서 단일 응답으로 추출 가능합니다.
- 가격은 하루 2~3회 변동하므로 수집 케이던스를 데이터 유형에 맞게 설정하세요.
- 모바일 API 서명은 변경될 수 있으므로, 폴백으로 HTML 파싱 로직도 준비해 두세요.
- 요청 간 2~5초 지연과 지역별 IP 타겟팅으로 차단 리스크를 최소화하세요.
레지덴셜 프록시로 알리익스프레스 데이터 수집을 시작하려면 ProxyHat 요금제를 확인하거나, 지원 국가 목록에서 필요한 지역을 찾아보세요. 드롭시핑 상품 리서치 파이프라인 구축에 대한 더 많은 인사이트는 SERP 트래킹 가이드에서도 확인할 수 있습니다.






