o2o-negosium-original/lps/docs/2026-08-05-session-notes.md
민헌 042e2d3012 docs(lps): 2026-08-05 세션 기록 — 변경 배경·결정 근거·미해결·다음 할 일
다음 세션이 이어받을 수 있게 남긴다.
- docs/2026-08-05-session-notes.md 신규: 왜 네이버가 크롤로 갔는지, 이번에 정한 것
  (추천순 유지·순위는 상품가·신뢰 신호·AI 배치 10건)과 그 근거, 미해결(컨테이너 크롤 차단),
  다음 할 일 5가지, 작업 시 주의(테스트가 실DB를 TRUNCATE 한다)
- architecture.md: IP 회전을 DB 장부·게이트웨이 2개·회전무효 차단 구분·AI 배치로 갱신
- database.md: proxy_port 테이블 추가(6종), price_history 의 신뢰·배송 컬럼 설명과
  '미검증 오퍼 비율' 쿼리
2026-08-05 15:51:19 +09:00

4.7 KiB

2026-08-05 작업 기록 — 네이버 크롤 전환 · IP 장부 DB화 · AI 매칭 수리

다음 세션이 이어받을 수 있도록 무엇이 왜 바뀌었고, 무엇이 남았는지만 적는다. 설계 상세는 각 코드 파일 주석과 architecture.md·operations.md 를 본다.

1. 무슨 일이 있었나

네이버가 쇼핑 검색 오픈API 를 2026-07-31 종료했다(유예·대체 없음). shop.json 은 정상 키로도 404 SE05 만 돌려준다. 후속인 NCP 네이버 API 허브에도 쇼핑 검색은 없다(게이트웨이에서 /search/v1/shop = 404, 문서에도 없음). 즉 네이버 가격을 API 로 얻을 방법이 사라졌다.

→ 쿠팡과 같은 스택(patchright + 실제 Chrome)으로 모바일 msearch 크롤 전환.

2. 지금 상태

항목 상태
네이버 최저가 크롤로 복구. 검색당 40건(무한스크롤 상한)
쿠팡 정상. 단 IP 평판에 따라 간헐적 차단(회전으로 회복)
IP 로테이션 proxy_port DB 장부. 멀티 프로세스 안전
워커 실행 호스트 실행 권장 — 컨테이너는 크롤이 막힌다(아래 4번)
테스트 237 passed

3. 이번에 정한 것 (되돌리려면 근거부터 볼 것)

  • 정렬은 추천순 유지. 가격순(sort=price_asc)은 차단 없이 되지만 A/B(상품 8개)에서 최저가 갱신 0건, 오히려 2건 악화. 후보가 늘면 AI 매칭이 흔들린다.
  • 순위는 상품가 기준. 배송 주체(로켓/판매자로켓/네이버 판매자)가 다르면 배송비 비교가 무의미해서다. 대신 final_shipping_fee/type/label기록은 남긴다 — 나중에 "배송비를 더하면 순위가 뒤집히는 비율"을 데이터로 판단하기 위해.
  • 신뢰 신호 수집(rating/review_count): 리뷰·평점 없는 오퍼는 재고 없는 미끼가격일 수 있다. 최저가는 '가장 싼 값'이 아니라 '실제로 살 수 있는 가장 싼 값'이어야 한다. NULL(정보 없음)과 0(리뷰 0개)은 다른 뜻이라 기본값을 두지 않았다.
  • AI 판정은 10건씩 쪼갠다. 후보 37건을 일괄로 넣으면 gpt-4o-mini 가 전 항목에 같은 점수(70)를 매기고 전부 불일치로 답한다(3회 재현). 쪼개면 같은 모델로 12건 매칭.

4. 미해결 — 컨테이너에서 크롤이 막힌다

같은 코드·같은 공인 IP인데 호스트는 되고 컨테이너만 막힌다(네이버 405+캡차 / 쿠팡 403). 배제한 원인: 공인 IP·TLS 지문(JA4/H2 동일)·HTTP 헤더(HTTPS 에서 구조·순서 동일)·로케일· WebGL·UA 스푸핑·리소스 라우팅. 상세와 배포 시 확인 순서는 operations.md 의 '컨테이너 크롤 차단' 절.

⚠️ 실측 환경이 Apple Silicon 맥이라 컨테이너가 amd64 를 Rosetta 로 에뮬레이션한다. "컨테이너는 안 된다"가 아니라 "이 맥의 컨테이너에서는 안 된다" 로 읽어야 한다. 2026-07-09 에는 같은 컨테이너로 8몰 크롤이 통과한 이력이 있다. 배포 서버(실제 x86)에서 재검증이 필요하다.

기동 직후 docker logs lps-worker | grep warmup 으로 소스별 통과 여부가 바로 찍힌다 (웜업이 크롤 프리플라이트를 겸하고, 3회 실패하면 알림까지 나간다).

5. 다음에 할 일 (우선순위)

  1. AI 매칭 정확도 측정 — 이번엔 상품 3개로 '명백한 붕괴'만 고쳤다. 정답 세트 20~30개로 정확도를 재야 "몇 % 맞나"를 답할 수 있다. 지금 최저가 품질의 최대 병목이다.
  2. 재정제 라운드 검증 — 테팔 사례(검색 결과에 진짜 '프라이팬 26cm'가 없어 매칭 0건)처럼 검색어가 결과를 좌우한다. 정밀→광역 재검색이 실제로 구제하는지 확인된 적 없다.
  3. 쿠팡 광고·품절 필터 — 네이버는 광고를 걸러내는데 쿠팡은 안 한다(비대칭). custom-oos(품절) 클래스도 파서가 쓰지 않는다. 품절 상품이 최저가로 잡히면 '살 수 없는 가격'이 된다.
  4. 소스 결측 표시 — 쿠팡이 막혀 네이버 단독으로 나온 결과가 구분되지 않는다.
  5. 카테고리 확대 검증 — 파싱 검증을 생활용품 위주로만 했다. 가전·의류·식품 스모크 필요.

6. 작업 시 주의

  • 테스트가 실DB를 TRUNCATE 한다(bot_detection·price_history·job·ip_session). 워커를 돌린 뒤 pytest 하면 관측 이력이 지워진다. 테스트 전 pkill -f worker_main.py.
  • DDL 은 migrations/ 에 날짜 파일로 남겼다(2026-08-05-proxy_port.sql, -price_history-trust.sql, -price_history-shipping.sql). dev DB 에는 적용 완료.