"""ESM(G마켓·옥션, eBay Korea 공유 백엔드) 검색결과 셀렉터/설정. 두 사이트는 백엔드를 공유하지만 검색결과 HTML 템플릿은 서로 달라, 카드/이름/가격 셀렉터가 다르다(일부 가격 클래스만 공유). 사이트별 설정을 외부화한다 — 레이아웃 변경 시 여기만. """ from dataclasses import dataclass from services.search.card_parser import CardConfig @dataclass(frozen=True) class EsmSite: search_url: str # {q} 자리표시자 ready_selector: str # 챌린지 통과·렌더 완료 신호 cards: CardConfig GMARKET = EsmSite( search_url="https://browse.gmarket.co.kr/search?keyword={q}", ready_selector="div.box__item-container", cards=CardConfig( source="gmarket", mall_name="G마켓", base_url="https://browse.gmarket.co.kr/", card="div.box__item-container", name="[class*=text__item-title]", price="[class*=box__price-seller]", ), ) AUCTION = EsmSite( search_url="https://browse.auction.co.kr/search?keyword={q}", ready_selector="div.itemcard", cards=CardConfig( source="auction", mall_name="옥션", base_url="https://browse.auction.co.kr/", card="div.itemcard", name="span.text--title", price="strong.text__price-seller", link="a.link--itemcard", ), ) SITES = {"gmarket": GMARKET, "auction": AUCTION}