1. 배경 및 요구사항
전자상거래 데이터 분석, 가격 모니터링, 상품 도구 선정 등의 시나리오에서 타오바오 상품 상세 데이터(제목, 가격, 재고, SKU, 메인 이미지, 상세 이미지, 판매량 등) 획득은 핵심 전제 조건입니다. 타오바오 오픈 플랫폼은 공식 API(taobao.item.get)를 제공하지만, 신청 절차가 까다롭고 권한이 제한되어 있으며 필드가 제한적이라 모든 개발자에게 적합하지 않습니다.
따라서 제3자 크롤링 서비스 또는 자체 크롤링 솔루션 기반 접근 방식이 더 유연하고 실행 가능한 대안이 됩니다.
2. 솔루션 개요: 제3자 크롤링 API의 장점
| 솔루션 유형 | 공식 API | 제3자 크롤링 API |
|---|---|---|
| 권한 신청 | 기업 인증, 상점 연동 필요 | 타오바오 계정 불필요 |
| 필드 완전성 | 기본 필드, 일부는 고급 권한 필요 | 상세 페이지 전체 데이터 획득 가능 |
| 실시간성 | 15~30분 지연 | 거의 실시간(초 단위) |
| 호출 제한 | 엄격한 QPS 및 권한 제어 | 더 유연한 배치 처리 지원 |
| 캡슐화 지원 | 시스템 자체 구축 필요 | 직접 API 서비스로 캡슐화 가능 |
결론: 제3자 크롤링 API는 빠른 통합과 상용화에 더 적합하며, 특히 타오바오 개발자 권한이 없는 팀에게 이상적입니다.
3. 핵심 인터페이스: 타오바오 상품 상세 크롤링 API
1. 인터페이스 기능 설명
상품 URL 또는 상품 ID(num_iid)를 통해 타오바오/천猫 상품의 전체 상세 데이터를 구조화된 JSON 형태로 반환합니다.
2. 요청 예시(제3자 서비스)
import requests
# API 엔드포인트 설정
API_ENDPOINT = "https://api.ecommerce-scraper.com/taobao/product/details"
# 요청 헤더 구성
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_KEY"
}
# 요청 본문 생성
payload = {
"product_url": "https://detail.tmall.com/item.htm?id=6543210987654"
}
# API 호출
response = requests.post(API_ENDPOINT, json=payload, headers=headers)
# 응답 처리
if response.status_code == 200:
product_data = response.json()
print(product_data)
else:
print(f"요청 실패: {response.status_code}")
3. 응답 필드 예시
{
"product_id": "6543210987654",
"name": "아이폰 15 실리콘 케이스 방충 보호 커버",
"current_price": 29.9,
"discounted_price": 19.9,
"inventory_count": 1523,
"total_sales": 4820,
"store_name": "어떤 디지털 전문점",
"main_image": "https://img.alibaba.com/imgextra/...jpg",
"detail_images": [
"https://img.alibaba.com/imgextra/...jpg",
"https://img.alibaba.com/imgextra/...jpg"
],
"variant_options": [
{
"attributes": "색상:검정색",
"price": 19.9,
"stock": 500
},
{
"attributes": "색상:흰색",
"price": 19.9,
"stock": 300
}
]
}
실제 응답에는 쿠폰, 상세 설명 HTML, 상품 매개변수, 동영상 링크 등이 포함될 수 있으며, 플랫폼 기능에 따라 다릅니다.
4. 기술 구현: 크롤링에서 API 캡슐화까지
1. 크롤링 핵심 로직(파이썬 기반)
(1) 페이지 인터페이스 분석
브라우저 개발자 도구를 사용하여 타오바오 상품 상세 페이지에 내장된 JSON 데이터 소스(일반적으로 detail, item 키워드 포함)를 찾습니다.
(2) 요청 구성 및 크롤링 우회
import aiohttp
import asyncio
from fake_useragent import UserAgent
class TaobaoScraper:
def __init__(self):
self.ua = UserAgent()
self.session = None
async def __aenter__(self):
self.session = aiohttp.ClientSession()
return self
async def __aexit__(self, exc_type, exc, tb):
await self.session.close()
def get_random_headers(self):
return {
"User-Agent": self.ua.random,
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
}
async def fetch_product_data(self, product_id):
if not self.session:
raise Exception("Session not initialized. Use async with statement.")
url = f"https://detail.tmall.com/item.htm?id={product_id}"
try:
async with self.session.get(url, headers=self.get_random_headers(), timeout=10) as response:
if response.status == 200:
return await response.text()
return None
except Exception as e:
print(f"Error fetching product {product_id}: {str(e)}")
return None
# 사용 예시
async def main():
async with TaobaoScraper() as scraper:
product_html = await scraper.fetch_product_data("6543210987654")
if product_html:
# 여기에 HTML 파싱 로직 추가
print("Product data fetched successfully")
asyncio.run(main())
⚠️ 참고: 타오바오 쿠키의 유효 기간이 짧으므로 주기적으로 업데이트하거나 Playwright와 같은 자동 로그인 도구를 사용하는 것이 좋습니다.
(3) 데이터 파싱 및 구조화
name, price, inventory, sales, variant_options, main_image, detail_images 필드를 추출합니다.
2. API 서비스로 캡슐화(Starlette 예시)
from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route
import uvicorn
import json
class ProductScraper:
def __init__(self):
self.cache = {}
async def get_product_detail(self, request):
form_data = await request.form()
product_id = form_data.get('product_id')
# 캐시 확인
if product_id in self.cache:
return JSONResponse(self.cache[product_id])
# 실제 크롤링 로직 호출
product_data = await self._scrape_product(product_id)
if product_data:
# 캐시 저장 (30분)
self.cache[product_id] = product_data
return JSONResponse(product_data)
else:
return JSONResponse({"error": "Failed to scrape product"}, status_code=400)
async def _scrape_product(self, product_id):
# 실제 크롤링 구현
# 이 예시에서는 모의 데이터 반환
return {
"product_id": product_id,
"name": "아이폰 15 실리콘 케이스",
"price": 29.9,
"inventory": 1523,
"sales": 4820,
"source": "실시간 크롤링"
}
# 라우팅 설정
routes = [
Route('/api/product/detail', endpoint=ProductScraper().get_product_detail, methods=['POST'])
]
# 애플리케이션 생성
app = Starlette(routes=routes)
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
서비스 시작:
python main.py
5. 최적화 및 안정성 보장
| 문제 | 해결 방안 |
|---|---|
| 쿠키 만료 | Playwright 자동 로그인으로 쿠키 업데이트 |
| IP 차단 | 프록시 풀 사용(예: 라이브러리 프록시, 프록시 서비스) |
| 요청 빈도 제한 | 무작위 지연(0.5~2초), QPS < 20 제한 |
| 데이터 필드 누락 | 다중 인터페이스 융합 보완(상세 페이지 + SKU 인터페이스) |
| 고동시성 요구 | 분산 크롤링 배포(Scrapy + Redis) |
6. 규정 준수 및 리스크 경고
- 타오바오 robots 규칙 및 플랫폼 정책을 준수하며 상업적 이익을 위한 악의적 경쟁에 사용하지 않아야 합니다.
- 사용자 개인정보(구매자 댓글의 개인 정보 등) 수집을 금지하며 익명화 처리가 필요합니다.
- 고빈도 접근을 피하고, 속도 제한 및 캐시 메커니즘(Redis 캐시 30분)을 설정하는 것이 좋습니다.
- 제3자 서비스 사용 시 데이터 사용 계약을 체결하여 데이터 출처의 합법성을 확인해야 합니다.
7. 요약 및 제안
| 시나리오 | 제안 솔루션 |
|---|---|
| 빠른 출시, 개발 리소스 없음 | 성숙한 제3자 API 사용(예: CRMEB, Alibaba Cloud 마켓) |
| 기술 팀 보유, 맞춤형 필드 필요 | 자체 크롤링 + Starlette 캡슐화, 내부 서비스로 배포 |
| 고동시성, 대규모 수집 | 분산 크롤링 클러스터 구축, 배치 인터페이스 /batch_detail 지원 |
최종 제안: 제3자 크롤링 API는 현재 타오바오 상품 상세 수집을 위한 최적의 경로 중 하나로, 합법성, 안정성, 필드 완전성 사이의 균형을 맞춥니다. 서명 인증 지원, 풍부한 반환 필드, URL 직접 전송 지원하는 서비스 제공업체를 우선적으로 선택하고 캐시 및 프록시 메커니즘을 결합하여 고가용성 데이터 파이프라인을 구축하는 것이 좋습니다.