베스트 바이 & 타겟 스크래핑: 매장별 재고 및 가격 데이터

대형 매장의 가격 및 재고 데이터는 단순히 제품 URL 뒤에 있는 것이 아니라 매장 선택기와 우편번호 뒤에 숨겨져 있습니다. 매장 범위 설정과 지리적 타겟팅을 정확히 하면 베스트 바이와 타겟은 깔끔한 JSON 피드가 됩니다.

베스트 바이와 타겟은 일반적인 제품 페이지처럼 보이지만 가격과 재고를 대규모로 스크래핑하려고 하면 두 가지 답변이 아직 선택하지 않은 매장에 따라 달라진다는 것을 알게 됩니다. 가격은 우편번호가 로컬로 만들기 전까지는 전국적입니다; 가용성은 매장을 범위로 설정하기 전까지는 의미가 없습니다. 매장 선택과 지리적 타겟팅을 정확히 하면 이러한 대형 매장 사이트는 깔끔한 JSON 피드로 변합니다. 잘못하면 전국적인 플레이스홀더 가격과 "주변 매장 확인"만 수집하게 됩니다. 이 가이드는 매장별 재고, 지리적 가격, 숨겨진 엔드포인트 및 전체를 유지하는 프록시 설정을 다룹니다.

첫 번째 장벽: 지역 및 매장

베스트 바이는 미국, 캐나다, 멕시코 세 시장만을 대상으로 하며, 지역 외 IP로 접속하면 제품 대신 국가 선택 페이지를 보여줍니다. 이로 인해 잘못된 출구에서 스크래핑하려는 모든 사람이 차단됩니다. 따라서 첫 번째 단계는 대상 시장 내의 주거용 IP입니다. 두 번째 단계는 매장을 범위로 설정하는 것입니다: 두 소매업체 모두 매장 내 가용성과 가격을 특정 매장이나 우편번호에 맞추어 설정합니다. 이를 설정하지 않으면 전국 기본값을 읽게 되며, 실제로 필요로 하는 재고 보충자나 가격 분석가가 필요로 하는 로컬 진실이 아닙니다.

실용적인 패턴: 스티키 세션을 열고, 하나의 주거용 출구를 고정하여 매장이나 우편번호를 한 번 설정한 후, 동일한 IP로 해당 매장의 모든 SKU를 읽습니다. 다음 매장으로 이동할 때 IP를 회전시키고, 읽기 사이에서는 회전하지 않습니다. 이는 실제 쇼핑객이 행동하는 방식과 유사하며 — 한 위치, 여러 제품 — 사이트가 해당 매장의 재고와 가격을 반환하도록 유지하고 전국적인 뷰로 재설정되지 않도록 합니다.

JSON을 읽고, DOM을 읽지 마세요

두 사이트 모두 가격, 평점 및 가용성을 클라이언트 측에서 렌더링하므로, 일반 요청에서 얻는 HTML은 종종 껍데기일 뿐입니다 — 숫자는 페이지가 호출하는 내부 JSON 엔드포인트에서 나중에 도착합니다. 렌더링된 DOM을 구문 분석하는 것은 취약하고 자주 비어 있습니다. 내구성 있는 접근 방식은 브라우저의 네트워크 탭에서 해당 엔드포인트를 찾아 직접 호출하는 것입니다: 이는 구조화된 필드(SKU, 가격, 매장 내 가용성, 집으로 배송, 픽업 가능성)를 반환하며, HTML 구문 분석이 전혀 필요하지 않으며 페이지 마크업보다 훨씬 덜 자주 변경됩니다. 스크래퍼가 빈 페이지를 반환하는 것을 본 적이 있다면, 이는 보통 그 이유입니다.

import requests

# one sticky residential exit, pinned per store
SESSION_IP = "http://USER:PASS-session-store1841@gate.quantumproxies.io:8000"
proxies = {"http": SESSION_IP, "https": SESSION_IP}

s = requests.Session()
s.proxies = proxies
s.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/122.0.0.0 Safari/537.36",
    "Accept": "application/json",
})

# 1) scope a store (ZIP or store id) on this session first,
#    then 2) read the product/availability endpoint the page calls
r = s.get("https://www.example-retailer.com/api/v2/products/6565837",
          params={"storeId": "1841", "zip": "10001"}, timeout=20)
data = r.json()
print(data["sku"], data["price"], data["inStoreAvailability"])

플레이스홀더를 제외하고, 형태가 핵심입니다: 매장을 설정하고, 데이터 엔드포인트를 타격하고, 텍스트를 스크래핑하는 대신 필드를 읽습니다. 스티키 세션이 있는 주거용 프록시가 매장 범위를 고정하는 데 필요한 것입니다.

소매 데이터 수집을 위한 스티키 주거용 프록시 확보

우편번호 및 매장 ID를 설정한 후 JSON을 읽기 전에 주거용 프록시를 통해 설정된 매장 범위의 베스트 바이 및 타겟 요청 파이프라인 다이어그램
재고와 가격은 매장별로 답변됩니다 — 스티키 세션에서 매장당 하나의 주거용 IP를 고정하고 JSON 엔드포인트를 읽습니다.

지리적 가격: 동일한 SKU, 다른 숫자

대형 매장의 가격은 국가 전역에서 균일하지 않습니다. 할인, 지역 프로모션 및 매장별 가격 인하로 인해 동일한 SKU가 우편번호마다 다른 가격을 가질 수 있으며, 매장 내 가용성은 본질적으로 로컬입니다. 단일 위치에서 스크래핑하면 훨씬 더 큰 그림의 한 조각만 얻을 수 있으며, 이는 댈러스의 쇼핑객과 시애틀의 쇼핑객에게 정확해야 하는 경쟁 가격 모니터링이나 재고 알림에 쓸모가 없습니다.

따라서 위치를 의도적으로 설정하세요. 대상 우편번호 또는 매장 ID 목록을 유지하고, 가능하면 동일한 도시나 주의 지역 내 주거용 출구와 짝지어 사용하세요. 우리의 위치 커버리지는 200개 이상의 국가에 걸쳐 도시 및 주 타겟팅을 포함하며, 이는 동일한 실행에서 베스트 바이의 로스앤젤레스 가격과 타겟의 시카고 재고를 읽을 수 있게 합니다. 이는 진지한 경쟁자 가격 모니터링재고 모니터링의 동일한 원칙입니다.

부하를 분산시키거나 하루 종일 차단당하세요

수천 개의 SKU를 요청하는 단일 IP는 차단, CAPTCHA 또는 서브넷 차단으로 가는 가장 빠른 길입니다. 두 소매업체 모두 IP당 요청 속도를 감시합니다. 해결책은 회전 주거용 풀에 작업을 분산시켜 단일 출구가 의심스러운 볼륨을 처리하지 않도록 하면서도 해당 매장의 읽기 동안 매장당 하나의 IP를 고정하는 것입니다. 동시성은 세션 수준이 아니라 풀 수준에 존재합니다. 각 세션을 쇼핑객처럼 페이스를 맞추고, 많은 IP가 각각 조금씩 작업을 수행하게 하여 처리량을 확보하세요. 이 위에 재고 도구를 구축한다면, 재고 봇을 위한 최고의 프록시에 대한 우리의 요약은 풀 크기를 다룹니다.

IP 회전, 매장 범위 설정 및 JSON 구문 분석을 통해 순진한 대형 매장 스크래퍼와 프로덕션 스크래퍼를 비교하는 체크리스트
순진한 베스트 바이 또는 타겟 스크래퍼를 깨뜨리는 다섯 가지 요소 — 그리고 각 요소에 대한 프로덕션 해결책.

API 경로가 승리할 때

주거용 프록시를 통한 직접 요청은 가장 많은 제어와 가장 낮은 요청당 비용을 제공합니다 — 엔드포인트를 알고 유지할 수 있을 때 이상적입니다. 그러나 대상이 더 강력한 안티봇 방어를 추가하거나 모든 것을 JavaScript로 렌더링하거나 단순히 엔드포인트를 관리하고 싶지 않을 때, Scraper API는 지름길입니다: 제품 URL을 지리적 매개변수와 함께 보내고, IP를 회전시키고, 실제 브라우저 지문을 유지하고, JS를 렌더링하고 구조화된 데이터를 반환합니다. 유지보수가 전혀 필요 없고 어려운 날에 더 높은 성공률을 얻기 위해 약간의 호출당 비용을 교환합니다. 우리의 JavaScript 무거운 사이트에 대한 가이드에 명확히 나와 있는 정직한 분할: 깨끗하고 알려진 엔드포인트를 위한 원시 요청과 주거용 프록시; 방어가 강화될 때 API.

자주 묻는 질문

베스트 바이와 타겟 제품 데이터를 스크래핑할 수 있나요?

예 — 두 사이트 모두 공개 제품, 가격 및 가용성 데이터를 노출하며, 대부분은 페이지가 호출하는 내부 JSON 엔드포인트를 통해 제공됩니다. 지역 내 주거용 IP가 필요합니다 (베스트 바이는 미국, 캐나다, 멕시코만을 대상으로 함) 그리고 매장 또는 우편번호가 범위로 설정되어야 합니다, 왜냐하면 재고와 종종 가격은 제품 URL이 아니라 매장별로 답변되기 때문입니다.

왜 전국 가격을 받고 매장 가격을 받지 못하나요?

세션에 매장이 선택되지 않았기 때문입니다. 대형 매장 사이트는 우편번호나 매장 ID가 요청을 범위로 설정하기 전까지 전국 기본값을 반환합니다. 먼저 스티키 세션에서 위치를 설정하고, 해당 매장의 읽기를 위해 동일한 주거용 IP를 유지하면, 엔드포인트는 로컬 가격과 매장 내 가용성을 반환합니다.

대형 소매 스크래핑에 가장 적합한 프록시는 무엇인가요?

스티키 세션과 도시 또는 주 지리적 타겟팅이 가능한 주거용 프록시입니다. 매장을 범위로 설정하는 동안 일관성을 유지하는 지역 내 출구가 필요하며, SKU 볼륨을 분산시키기 위해 풀 전체에서 회전해야 합니다. 데이터센터 IP는 저렴하지만 이러한 대상에서 더 자주 벽에 부딪히거나 CAPTCHA에 도전받습니다.

베스트 바이 또는 타겟 스크래핑은 합법인가요?

공개적으로 이용 가능한 제품 및 가격 데이터를 수집하는 것은 많은 관할 구역에서 일반적으로 공정 사용으로 간주되지만, 서비스 약관과 현지 법률은 다를 수 있습니다. 이는 정보 제공용이며 법률 자문이 아닙니다 — 대규모 수집 또는 개인 데이터와 관련된 모든 것에 대해 각 사이트의 약관을 검토하고 전문가와 상담하세요.

대형 매장 데이터는 페이지 형태가 아니라 매장 형태입니다. 매장을 범위로 설정하고, 지리를 주도하고, JSON을 읽고, 깨끗한 주거용 풀에 부하를 분산시키세요 — 이 네 가지를 수행하면 베스트 바이와 타겟은 전국적인 플레이스홀더의 벽 대신 신뢰할 수 있는 가격 및 재고 피드가 됩니다.

Scraper API를 사용하여 대규모로 소매 데이터를 스크래핑하세요