Skip to content

og:price 폴백 추가로 Shopify 계열 상품 페이지를 파서로 처리 #51

Description

@m-a-king

StructuredDataExtractor 의 OpenGraph 경로는 가격을 product:price:amount 에서만 읽는다. 그런데 Shopify 계열 상품 페이지는 구형 OG product 네임스페이스인 og:price:amount 를 쓴다. 이름(og:title)과 이미지(og:image)는 읽히지만 가격이 null 이라 MISSING_FIELD 로 미스한다.

JSON-LD 경로도 함께 미스한다. 이 사이트들의 최상위 노드가 @type=ProductGroup 이라 isProductTypeProduct 매칭에 걸리지 않고, 실제 Product 들은 hasVariant 배열 안에 있는데 collectProductNodesInto 가 그 키를 재귀하지 않는다.

두 경로가 모두 미스해 매 요청이 Gemini fallback 으로 간다. LLM 경로는 비결정적이라 같은 사이트에서 상품명이 매번 갈린다.

prod 실측 (토너먼트 1350, postarchivefaction.com 20건): 전부 source=SERVER_LLM 이었고 이름이 두 갈래로 나왔다.

  • og:title 을 그대로 베낀 영어: Stream Pants (Archive) - Charcoal
  • 한글 상품명에 LLM 이 번역한 색상을 붙인 것: 러너 자켓 (Archive) 차콜

한글 색상(차콜, 스노우 블랙)은 페이지에 존재하지 않는 값으로, LLM 이 영어를 번역해 만든 것이다 (본문 검색 결과 0건). 본문 DOM 의 개행이 그대로 이름에 박힌 건도 있었다: 러너 자켓 (Archive)\n \n 차콜.

무엇을

OpenGraph 경로의 가격 해석에 og:price:amount / og:price:currency 폴백을 추가한다. 표준 태그(product:price:*)를 먼저 보고, 없을 때 구형 네임스페이스를 본다. 그러면 og:title(이름) + og:price(가격)로 파서가 완결되어 이 사이트들이 결정론적 경로로 내려간다.

상품명은 og:title 을 그대로 쓴다. 색상이 포함돼 있어(Cut Out Boots (2026) - Black) 같은 상품의 다른 색상이 한 토너먼트에 올라와도 구분된다. 실제로 토너먼트 1350 에 - Black- Beige 가 함께 올라와 있다.

검증한 것

  • extractor 가 보내는 Accept-Language: ko,en;q=0.9 로 fetch 하면 가격이 680,000 KRW 로 정상 수신된다. 헤더가 없으면 같은 페이지가 84,100 JPY 를 내주므로, 통화 회귀 위험은 현재 헤더 설정에서 없다.
  • og:price:amount 는 천단위 콤마를 포함한다(680,000). 기존 parsePricePRICE_NOISE 정규식이 콤마를 제거하므로 추가 처리는 불필요하다.
  • 이 사이트에는 product:price:amount 가 아예 없다. 표준 태그 우선 순서가 회귀를 만들지 않는다.

범위 밖

JSON-LD ProductGroup 인식 추가는 이 이슈에서 하지 않는다. OG 경로만으로 대상 사이트가 풀리고, ProductGroup 을 지원하면 JSON-LD 가 우선순위상 먼저 이겨 이름이 컷 아웃 부츠 처럼 색상 없는 한글로 바뀌어 색상 구분이 사라진다. 한글 표기가 필요해지면 그때 별도로 판단한다.

Metadata

Metadata

Assignees

Labels

fix외부 가시적 결함 수정

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions