Python으로 대규모 아마존 제품 데이터 스크래핑하는 방법
세 줄로 끝나는 BeautifulSoup 튜토리얼은 한 번만 작동하고, 그 후 아마존은 CAPTCHA를 제공합니다. 대규모로 작동하지 않는 실제 원인은 무엇인지 — 가격 선택기의 변화, 지역 가격, IP 차단 — 그리고 이를 견디는 파이프라인에 대해 알아보세요.
아마존 제품 데이터 스크래핑은 모든 초보자 튜토리얼에서 간단해 보입니다: requests, BeautifulSoup, 제목과 가격을 가져오면 끝. 하지만 몇 백 번 실행하면 아마존은 로봇 확인 페이지를 제공하고 가격 선택기는 None을 반환합니다. 이 가이드는 실제 사이트와의 접촉을 견디는 버전에 관한 것입니다 — ASIN 우선 파이프라인, 실제로 깨지는 선택기, 동일한 제품이 다른 IP에 다른 가격을 표시하는 이유, CAPTCHA 벽을 피하는 프록시 설정에 관한 것입니다. 이는 로그인 뒤에 있는 것이 아닌 공개된 제품 데이터(제목, 가격, 평점, 가용성)에 관한 것입니다.
URL 구조: ASIN이 핵심
모든 아마존 제품은 ASIN — B08N5WRWNW와 같은 10자 식별자 — 을 가지고 있으며, 전체 카탈로그는 이에 의존합니다. 제품 페이지는 단순히 https://www.amazon.com/dp/<ASIN>이며, 동일한 ASIN은 여러 마켓플레이스에서 매핑됩니다 (amazon.co.uk/dp/<ASIN>, amazon.de/dp/<ASIN>). 검색 및 카테고리 페이지는 /s? 아래에 쿼리 및 브라우즈 노드 매개변수와 함께 존재합니다. 따라서 확장 가능한 파이프라인은 두 단계로 구성됩니다: 검색 또는 베스트셀러 페이지에서 ASIN을 발견하고, 각 ASIN을 /dp/ 페이지에서 보충합니다. 한 가지 주의할 점은 "부모" ASIN(크기나 색상 변형이 있는 제품)은 자동으로 선택된 자식 변형으로 해석되므로 실제로 도착한 변형 ASIN을 캡처해야 합니다.
import requests
from bs4 import BeautifulSoup
PROXY = "http://USER:PASS@gate.quantumproxies.io:8000"
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9"}
def product(asin, domain="com"):
url = f"https://www.amazon.{domain}/dp/{asin}"
r = requests.get(url, headers=HEADERS,
proxies={"http": PROXY, "https": PROXY}, timeout=20)
soup = BeautifulSoup(r.text, "html.parser")
return parse(soup, asin)
모두가 복사한 선택기와 아마존이 폐기한 선택기
거의 모든 오래된 튜토리얼은 span#priceblock_ourprice에서 가격을 읽습니다. 아마존은 여러 가격 블록 레이아웃을 제공하고 A/B 테스트를 진행하므로, 오늘날 대부분의 페이지에서 해당 단일 ID는 비어 있습니다. 지속 가능한 접근법은 여러 알려진 가격 컨테이너를 순서대로 시도하고 일치하는 첫 번째 것을 선택하는 것입니다 — 그리고 누락된 가격을 실제 상태(보통 품절)로 처리하고, 충돌로 간주하지 않는 것입니다.
def parse(soup, asin):
title = soup.select_one("#productTitle")
price = None
for sel in ["span.a-price span.a-offscreen", # current layout
"#priceblock_ourprice", # legacy
"#priceblock_dealprice", # deal layout
"#corePrice_feature_div .a-offscreen"]:
el = soup.select_one(sel)
if el and el.get_text(strip=True):
price = el.get_text(strip=True)
break
rating = soup.select_one("span.a-icon-alt")
return {
"asin": asin,
"title": title.get_text(strip=True) if title else None,
"price": price, # None -> likely out of stock
"rating": rating.get_text(strip=True) if rating else None,
}

같은 제품이 두 가지 가격을 보이는 이유
이것은 가격 데이터셋을 조용히 망치는 사실입니다. 아마존은 가격과 가용성을 쇼핑객의 배송 위치 — "배송지" 설정 — 에 맞추어 현지화합니다. 이는 주로 IP에서 추론됩니다. 독일 데이터센터 IP에서 amazon.com을 스크래핑하면 유로 가격, 다른 제안, 또는 미국 쇼핑객이 보는 것과 다른 구매 박스 승자를 얻을 수 있습니다. 경쟁 가격 데이터를 수집하고 있다면, 출구 IP의 지리적 위치가 실험입니다: 미국 구매자가 보는 가격을 캡처하려면 미국 주거용 프록시를 통해 경로를 설정하고, 영국 시장을 위해서는 영국 출구를 사용합니다. 하나의 제품, 여러 가격, 샘플링한 시장마다 하나씩.
왜 단순한 스크래퍼가 차단되는가
아마존은 자동화된 요청 관리 시스템을 운영합니다: 하나의 IP에서 너무 빠르게 폭발하면 CAPTCHA, IP 차단, 또는 축소된 페이지를 받습니다. 대량으로 스크래퍼를 유지하는 세 가지 요소가 있습니다. 첫째, IP를 회전시켜 단일 주소가 전체 부하를 감당하지 않도록 합니다 — 회전하는 주거용 풀은 많은 실제 소비자 IP에 요청을 분산시킵니다. 둘째, 속도를 조절하세요: 무작위 지연과 동시성 제한, 무작정 반복하지 마세요. 셋째, 일관된 헤더를 보내세요 — 실제 브라우저 User-Agent와 Accept-Language를 사용하고, 기본 Python 문자열을 사용하지 마세요. 페이지가 의심스럽게 짧거나 로봇 확인 마커가 포함되어 돌아오면, 이를 버리고 새 IP에서 다시 시도하세요, 쓰레기를 구문 분석하지 마세요.
import time, random
def fetch_many(asins, domain="com"):
rows = []
for asin in asins:
for attempt in range(3):
data = product(asin, domain)
if data["title"]: # got a real page
rows.append(data)
break
time.sleep(1.5 + random.random()) # back off, rotate, retry
time.sleep(random.uniform(1, 3)) # pace between products
return rows
검색, 베스트셀러 및 페이지 매김
제품 페이지는 세부 정보이고, 검색 및 베스트셀러 페이지는 가져올 것을 발견하는 방법입니다. 키워드 검색은 /s?k=<query>&page=<n>; 베스트셀러는 카테고리 브라우즈 노드에 걸려 있습니다. 페이지를 걸어가며 각 결과 카드에서 ASIN을 가져온 다음, 이를 위의 제품 단계에 입력하세요. 두 단계를 분리해 두세요 — ASIN을 중복 제거하고, 크롤링을 재개하며, 매번 다시 발견하지 않고도 일정에 따라 알려진 ASIN 목록의 가격을 다시 설정할 수 있습니다. 더 넓은 빌드를 위해, 웹 스크래핑을 위한 최고의 프록시에 대한 가이드는 이 풀 측면을 다룹니다.
출력 자체를 위해, 행 스키마를 평평하고 안정적으로 유지하세요: asin, 소스 url, title, price, rating, 리뷰 수, image_url 및 가져온 마켓플레이스 domain. 혼합 시장 데이터셋이 미국 가격과 영국 가격을 혼동하지 않도록 모든 행에 도메인을 기록하세요. 가격이 비어 있을 때도 ASIN을 캡처하세요 — 품절 판독은 데이터 포인트이지, 공백이 아니며, 제품이 재고에 들어오고 나가는 시점을 추적하는 것은 종종 가격만큼 가치가 있습니다. 이러한 열을 가진 CSV 또는 데이터베이스 테이블은 추가 재구성 없이 가격 추적, 가용성 알림 또는 구매 박스 연구에 깔끔하게 피드를 제공합니다.

프록시 대 스크래핑 API: 전환 시점
손으로 만든 requests와 좋은 주거용 풀은 볼륨을 제어하고 대상이 협조적일 때 올바른 선택입니다. 수천 개의 ASIN을 하루에 유지하면서 회전 선택기, CAPTCHA 처리, 지역 고정 및 재시도 로직을 유지하게 되면, 그 유지 관리가 작업이 됩니다. Scraper API는 이를 간단히 만듭니다: 아마존 URL을 보내고, 회전, 렌더링 및 지역 처리가 완료된 구조화된 제품 데이터를 받습니다. 솔직한 규칙 — 마찰이 적을 때는 DIY, 반봇 유지 비용이 데이터 가치보다 더 많은 엔지니어링 시간을 소모할 때 전환하세요. 우리의 구축 대 구매 분석은 그 선에 숫자를 제공합니다.
자주 묻는 질문
Python으로 아마존 제품 데이터를 어떻게 스크래핑하나요?
requests와 실제 브라우저 User-Agent를 사용하여 /dp/<ASIN>에서 제품 페이지를 가져온 다음, BeautifulSoup으로 제목, 가격, 평점 및 가용성을 구문 분석하세요. 폐기된 priceblock_ourprice뿐만 아니라 여러 가격 선택기를 시도하세요. 폭발이 차단을 유발하지 않도록 회전하는 주거용 프록시를 통해 경로를 설정하고, 원하는 가격의 시장에 출구 지역을 고정하세요.
아마존 제품 데이터를 스크래핑하는 것이 합법인가요?
공개적으로 보이는 제품 데이터 — 제목, 가격, 평점 — 를 수집하는 것은 일반적으로 로그인 우회 또는 보호된 콘텐츠 복사와 다르게 취급되지만, 아마존의 약관은 자동화된 접근을 제한하며 법적 상황은 관할권 및 사용에 따라 다릅니다. 이는 일반 정보이며 법적 조언이 아닙니다: 공개 데이터만 스크래핑하고, 속도 제한을 준수하며, 상업적이거나 경계선에 있는 경우에는 법률 자문을 받으세요.
왜 내 아마존 스크래퍼가 웹사이트와 다른 가격을 얻나요?
아마존은 가격과 가용성을 IP에서 추론한 배송 위치에 맞추어 현지화합니다. 연구 중인 시장과 다른 국가에서 프록시가 종료되면 잘못된 통화와 제안을 보게 됩니다. 목표 시장에 출구 IP를 고정하세요 — 미국 가격을 위해서는 미국 주거용 IP, 영국 가격을 위해서는 영국 IP — 데이터를 실제 쇼핑객이 보는 것과 일치하도록 하세요.
아마존 스크래핑 시 차단을 피하는 방법은 무엇인가요?
많은 주거용 IP를 회전하여 단일 주소가 부하를 감당하지 않도록 하고, 무작위 지연과 동시성 제한으로 속도를 조절하며, 일관된 브라우저 헤더를 보내세요. 모든 응답을 검증하세요 — 200 응답도 로봇 확인 페이지일 수 있습니다 — 차단된 페이지를 구문 분석하지 말고 새 IP에서 다시 시도하세요. 대량으로는, Scraper API가 이를 모두 처리합니다.
대규모 아마존은 구문 분석이 어려워서가 아니라 사이트가 저항하고 가격이 서 있는 위치에 따라 달라지기 때문에 어렵습니다. ASIN 우선으로 구축하고, 여러 가격 컨테이너를 일치시키며, 지역을 고정하고, IP를 회전시키며, 짧은 응답을 데이터가 아닌 차단으로 처리하세요. 이를 제대로 하면 초보자 튜토리얼이 마침내 확장됩니다.