eBay 목록 및 판매 데이터를 가격 조사에 활용하는 방법

eBay의 판매 목록 기록은 무료 시장 가격 데이터베이스에 가장 가까운 것입니다. 이를 활용하기 위해 필요한 두 가지 URL 매개변수를 알고 있다면 가능합니다. 대규모로 목록, 변형 및 실제 거래 가격을 스크랩하는 방법을 소개합니다.

eBay는 웹에서 가장 큰 피어 투 피어 마켓플레이스 중 하나로, 가격 조사, 경쟁자 추적 및 재판매 평가에 있어 금광과 같습니다. 공식 개발자 SDK가 있지만 가장 유용한 데이터인 실제로 판매된 항목의 가격은 공개 검색 페이지에서 직접 수집하는 것이 가장 쉽습니다. 이 가이드는 eBay 목록, 변형 데이터 및 실제 판매 가격을 스크랩하는 방법과 스크래퍼가 초기 몇 백 개의 요청을 넘어서도 살아남을 수 있도록 하는 프록시 설정을 보여줍니다.

검색 URL은 API입니다

eBay를 검색할 때 쿼리는 URL에 완전히 인코딩되며, 몇 가지 매개변수가 반환되는 내용을 정확히 제어합니다. 이 다섯 가지를 마스터하면 브라우저를 사용하지 않고도 eBay의 카탈로그를 프로그래밍 방식으로 제어할 수 있습니다.

정렬 매개변수 _sop는 언급할 가치가 있습니다: 이 값들은 결과를 새로 등록된 항목, 배송비 포함 최저 총 가격, 또는 곧 종료될 항목 순으로 정렬하여 타겟 피드를 형성할 수 있게 합니다. _sacat로 제한하면 광범위한 키워드를 적절한 부서로 좁혀서 단일 행을 구문 분석하기 전에 노이즈를 제거합니다. 키워드, 카테고리 및 정렬을 함께 사용하면 대부분의 연구 쿼리를 단일 URL로 표현할 수 있으며, 이는 eBay를 자동화하기 쉽게 만드는 요소입니다.

import requests
from urllib.parse import urlencode

proxy = "http://USER:PASS@gate.quantumproxies.io:8000"
proxies = {"http": proxy, "https": proxy}

def search_url(keyword, page=1, per_page=60, category=0):
    params = {"_nkw": keyword, "_sacat": category,
              "_ipg": per_page, "_pgn": page}
    return "https://www.ebay.com/sch/i.html?" + urlencode(params)

r = requests.get(search_url("vintage seiko watch"),
                 proxies=proxies, timeout=20)
print(r.status_code)  # parse r.text with your HTML library of choice
eBay 스크래핑 파이프라인 다이어그램: 매개변수로 검색 URL을 작성하고, 주거용 프록시를 통해 가져오고, 목록을 구문 분석하고, 행을 저장합니다.
eBay의 공개 검색 페이지는 API처럼 작동합니다 — 매개변수는 쿼리이고, 마크업은 응답입니다.

판매 및 완료된 목록: 실제 시장 가격

이것이 가격에 중요한 엔드포인트입니다. 활성 목록은 판매자가 받고자 하는 가격만 알려줍니다; 많은 항목이 판매되지 않습니다. eBay는 두 가지 추가 매개변수를 통해 동일한 검색 페이지에서 실제 거래 기록을 노출합니다: LH_Complete=1은 모든 완료된 목록을 보여주고, LH_Sold=1은 실제로 판매된 항목으로 좁힙니다. 판매 목록에서는 가격이 최종 판매 가치이며, 이는 요청 가격이 아닙니다 — 이것이 물건의 실제 가치를 가장 깨끗하게 보여주는 무료 소스입니다:

def sold_url(keyword, page=1):
    # append the completed + sold filters to any search
    return ("https://www.ebay.com/sch/i.html?"
            f"_nkw={keyword.replace(' ', '+')}"
            "&LH_Complete=1&LH_Sold=1"
            f"&_ipg=60&_pgn={page}")

# every sold row = a real transaction: use median, not mean,
# to shrug off outliers and shill bids
r = requests.get(sold_url("nike dunk low panda 10"),
                 proxies=proxies, timeout=20)

판매 페이지는 표준 검색과 동일한 마크업을 사용하므로 목록 파서는 변경 없이 처리합니다 — 두 필터를 추가하기만 하면 됩니다. 마지막 30-60개의 판매 가격의 중앙값을 사용하면 평균보다 강력한 시장 가치를 얻을 수 있으며, 이는 재판매 및 경쟁자 가격 모니터링 워크플로우에서 신뢰할 수 있습니다.

목록 구문 분석: 가격, 세부 사항 및 변형

단일 변형 목록은 간단합니다: 가격은 기본 가격 요소에 위치하고, 항목 세부 사항 테이블 (상태, 브랜드, 모델, 크기)은 라벨/값 쌍의 집합이며, 설명은 별도로 가져올 수 있는 iframe에 있습니다. eBay의 지역 가격 변환을 주의하세요 — 일부 지역은 원래 가격과 함께 변환된 가격을 받으므로 둘 다 캡처하세요.

다중 변형 제품 (모델, 저장소 및 색상 옵션이 있는 전화기)은 더 까다롭습니다. 옵션별 가격은 JavaScript에 의해 업데이트되기 때문입니다. 그 데이터는 보이는 HTML에 없습니다 — 웹 데이터로 숨겨져 있으며, <script> 태그 내의 MSKU라는 JavaScript 변수에 저장됩니다. 그 JSON을 추출하면 모든 변형의 가격과 재고를 한 번에 얻을 수 있으며, 페이지를 렌더링하지 않고도 가능합니다:

import re, json

def extract_msku(html):
    # the variant matrix lives in a JS object keyed 'MSKU'
    m = re.search(r'"MSKU"\s*:\s*(\{.*?\})\s*[,}]', html, re.S)
    if not m:
        return {}          # single-variant listing, no matrix
    data = json.loads(m.group(1))
    # data now holds per-variant price, currency and stock flags
    return data

variants = extract_msku(r.text)
활성 eBay 목록을 요청 가격으로, 판매 목록을 실제 최종 거래 가격으로 비교하는 그림
평가를 위해 항상 판매 필터를 스크랩하세요: 활성 가격은 희망 사항이고, 판매 가격은 시장입니다.

대규모로 차단되지 않기

하나의 목록은 간단합니다. 규모가 커지면 eBay는 속도 제한, CAPTCHA 도전 및 자동화 패턴을 플래그하는 동적 콘텐츠로 대응합니다. 데이터센터 IP는 마켓플레이스에서 빠르게 제한됩니다; 신뢰할 수 있는 해결책은 주거용 프록시를 사용하여 일반 쇼핑객처럼 보이게 하고, 단일 IP가 명확한 폭발을 일으키지 않도록 회전시키는 것입니다. 요청 속도를 조절하고, 429를 존중하며, 지역별 가격이 필요할 때는 출구를 현지화하세요. eBay는 지리적으로 결과와 통화를 조정합니다.

대상이 더 강력한 봇 관리를 추가하거나 구문 분석 및 회전 스택을 직접 유지 관리하고 싶지 않은 경우, Scraper API가 IP 회전, JS 렌더링 및 재시도를 하나의 엔드포인트 뒤에서 처리하고 깨끗한 HTML, JSON 또는 markdown을 반환합니다. 더 넓은 마켓플레이스 플레이북을 위해, Amazon, eBay 및 Etsy의 마켓플레이스 자동화에 대한 가이드에서 계정 안전 및 지역 타겟팅을 다룹니다.

깨끗한 주거용 프록시로 eBay 스크랩

스크랩에서 데이터셋으로

행이 흐르기 시작하면, 중복 제거와 기록이 중요합니다. eBay 항목 ID로 모든 기록을 키로 설정하여 재스크랩 시 기존 행을 업데이트하고 중복되지 않도록 하며, 가격을 타임스탬프와 항목 상태와 함께 저장하세요 — 판매 가격은 날짜와 항목이 새 것이었는지 중고였는지와 함께 있어야 의미가 있습니다. 각 제품에 대한 최근 판매 데이터를 롤링 윈도우로 유지하면, 스스로 갱신되는 실시간 평가가 됩니다. 이는 모든 재판매, 재가격 책정 또는 차익 거래 도구의 기초입니다. 갑작스러운 가격 변동에 대한 경고와 결합하면 데이터셋이 스스로 감시하게 됩니다.

eBay 스크랩은 합법인가요?

이는 일반 정보이며, 법률 자문이 아닙니다. 공개적으로 이용 가능한 목록 데이터 — 가격, 조건, 판매 기록 — 를 존중하는 속도로 수집하는 것은 널리 합법적으로 간주됩니다. 주의해야 할 선은 개인 데이터입니다: 판매자 이름, 위치 및 연락처 정보는 EU의 GDPR 및 기타 유사한 법률에 따라 보호되므로, 합법적인 근거 없이 저장하지 마세요. 시장 신호를 스크랩하고, 사람을 스크랩하지 마세요.

자주 묻는 질문

eBay 판매 목록을 어떻게 스크랩하나요?

어떤 eBay 검색 URL이든 가져와 LH_Complete=1&LH_Sold=1을 추가하세요. 그러면 결과가 실제로 판매된 완료된 목록으로 전환되며, 표시된 가격은 최종 거래 가치입니다. 페이지는 일반 검색과 동일한 마크업을 사용하므로 동일한 파서가 제목, 가격 및 판매 날짜를 추출하여 가격 조사를 할 수 있습니다.

공식 API 없이 eBay 가격을 스크랩할 수 있나요?

네. 공개 검색 및 목록 페이지는 구매자가 보는 모든 것을 반환하며, 쿼터나 OAuth가 없습니다. 검색 매개변수 (_nkw, _sacat, _pgn, _ipg)가 쿼리와 페이지네이션을 구동하며, 제품 페이지는 가격, 항목 세부 사항 및 변형 데이터를 포함합니다. 회전하는 주거용 프록시가 필요하여 속도 제한 없이 볼륨을 유지할 수 있습니다.

eBay 변형 가격을 어떻게 얻나요?

다중 옵션 목록은 각 변형의 가격과 재고를 MSKU라는 JavaScript 객체에 저장하며, 이는 보이는 HTML에 포함되어 있지 않습니다. 그 JSON 블록을 추출하면 페이지를 렌더링하거나 각 옵션을 클릭하지 않고도 모든 조합의 가격을 얻을 수 있습니다 — 브라우저를 구동하는 것보다 훨씬 빠르고 신뢰할 수 있습니다.

내 eBay 스크래퍼가 차단되는 이유는 무엇인가요?

eBay는 자동화된 것으로 보이는 트래픽에 속도 제한 및 CAPTCHA 도전을 적용하며, 데이터센터 IP 범위는 빠르게 제한됩니다. 회전하는 주거용 IP에 요청을 분산시키고, 지연을 두어 속도를 조절하며, 429에 대해 백오프하고, 헤더를 일관되게 유지하세요. 도전이 계속되면, IP를 회전시키고 JavaScript를 렌더링하는 Scraper API가 유지 관리 부담을 제거합니다.

검색 페이지를 API처럼 스크랩하고, 두 매개변수로 판매 기록을 해제하며, 포함된 JSON에서 변형 매트릭스를 채굴하고, 모든 것을 깨끗한 주거용 IP로 라우팅하세요. 그렇게 하면 eBay는 당신이 제어하는 실시간 가격 데이터셋이 됩니다.

스택을 관리하지 않고 eBay 데이터를 추출하세요