o2o-negosium-original/lps/tests
민헌 23c1c48634 feat(lps): 네이버 최저가를 모바일 크롤로 복구(오픈API 종료 대체)
shop.json 이 2026-07-31 종료(404 SE05)되고 NCP API HUB 에도 승계되지 않아
가격을 얻을 공식 경로가 사라졌다 → 쿠팡과 같은 스택(patchright+실제 Chrome)으로 크롤 전환.

경로: msearch.shopping.naver.com (PC 는 405/418 로 막힘). 7/9 스파이크 때 모바일은
로그인 리다이렉트였는데 그 사이 열렸다.

통과 조건 3개 — 하나라도 빠지면 WTM 캡차(실측):
- **한국 IP**: 해외 residential 은 즉시 하드차단(2.6KB) → kr.decodo.com 게이트웨이
  ([DecodoConfig].kr_host, DecodoProxy(host=...) 로 주입. 쿠팡은 기존 월드와이드 유지)
- **ko-KR 로케일/시간대**: KR IP + en-US 조합을 봇으로 본다
  (BrowserSearchAdapter.context_options 훅 추가)
- **리소스 차단 금지**: route 를 걸면 즉시 캡차. image/media/font 만 막아도 동일 →
  '무엇을 막느냐'가 아니라 요청 가로채기 자체가 탐지 신호. 대신 검색당 ~3MB(~$0.009)

파서는 '정확한 상품의 최저가'를 기준으로 취사선택한다:
- 광고/슈퍼적립/브랜드블록 카드 제외(멤버십·쿠폰 조건부 가격)
- 쿠폰할인가를 price 로 쓰지 않음(조건부라 실구매가보다 싸게 잡힘)
- 가격비교('최저 N원') 카드는 유지하고 mall_name="네이버"(옛 lprice 와 같은 의미)
- **배송비 확보** — 옛 오픈API 는 필드 자체가 없어 전 소스 None 이었다
- 가격 함정 3종 회귀 테스트: 단위가격(548원)·가격노드 안의 배송비(3,900원)·정상가/할인율

source 는 "naver" 유지 — price_history.naver_lowest·MALL_BY_SOURCE·프론트 그래프 계약이
구현(API→크롤) 교체와 무관하게 살아야 한다.

테스트 12건 추가(축약 픽스처 + 합성 함정) · 전체 182 passed.
2026-08-05 09:05:38 +09:00
..
fixtures feat(lps): 네이버 최저가를 모바일 크롤로 복구(오픈API 종료 대체) 2026-08-05 09:05:38 +09:00
test_admin_api.py feat(lps): 관리자 FE 용 API 6종 — 잡 목록/재큐·상품 목록·IP세션/차단/비용 통계 2026-07-13 21:42:38 +09:00
test_alerts.py feat(lps): 알림 룰 4종 추가 — 데드라인·검색원가·포트 고갈·예산 누수 2026-07-13 17:29:08 +09:00
test_api_guard.py refactor(lps): 설정을 TOML 단일 소스로 통합 — env/.env 이중 관리 제거 2026-07-13 21:11:31 +09:00
test_bot_detection.py feat(lps): 봇 감지 시 IP 회전+재시도 + 감지 이력 기록 2026-07-09 11:04:07 +09:00
test_browser_base.py feat(lps): 네이버 최저가를 모바일 크롤로 복구(오픈API 종료 대체) 2026-08-05 09:05:38 +09:00
test_coupang_parser.py fix(lps): 쿠팡 차단 감지 다종화 — Edge Deny·권한제한·짧은HTML 폴백 2026-07-09 13:59:43 +09:00
test_health.py feat(lps): 인터넷 최저가 검색 솔루션 프레임워크 골격 추가 2026-07-08 15:18:27 +09:00
test_ip_session.py feat(lps): IP 선제 로테이션 — 요청 예산·포트 쿨다운·ip_session 관측 2026-07-13 16:35:44 +09:00
test_job_queue.py feat(lps): 알림 룰 4종 추가 — 데드라인·검색원가·포트 고갈·예산 누수 2026-07-13 17:29:08 +09:00
test_lps_api.py feat(lps): 알림 룰 4종 추가 — 데드라인·검색원가·포트 고갈·예산 누수 2026-07-13 17:29:08 +09:00
test_naver_hub.py feat(lps): NCP NAVER API HUB 쇼핑 인사이트 클라이언트 추가 2026-08-04 11:23:26 +09:00
test_naver_shop_parser.py feat(lps): 네이버 최저가를 모바일 크롤로 복구(오픈API 종료 대체) 2026-08-05 09:05:38 +09:00
test_naver_transform.py feat(lps): 네이버 어댑터 + 다중 소스 병합 검색 2026-07-09 08:38:15 +09:00
test_negative_cache.py feat(lps): 재시도/못찾음 완결 로직 — 재정제 루프 + not_found + 네거티브 캐시 2026-07-09 09:12:47 +09:00
test_openmarket_parser.py perf(lps): Step2/3 — Turnstile 웜업·동적 차단 + 유휴 브라우저 정리 2026-07-09 20:20:58 +09:00
test_pipeline.py feat(lps): 네이버 몰별 최저가 분해(by_mall) — 오픈마켓 가시화 2026-07-09 13:59:15 +09:00
test_pool_autosize.py feat(lps): process_count 기반 커넥션 풀 자동 산정 — 멀티코어 풀 오버서브스크립션 방지 2026-07-09 23:59:05 +09:00
test_price_history.py feat(lps): 최저가 이력(price_history) — 트리거 기반 시계열 그래프 2026-07-09 11:13:28 +09:00
test_proxy.py feat(lps): IP 선제 로테이션 — 요청 예산·포트 쿨다운·ip_session 관측 2026-07-13 16:35:44 +09:00
test_search_handler.py fix(lps): 워커 로그 노이즈 2건 제거 — 리퍼 네이버 스킵 + 폴백 데드라인 cancel 제거 2026-07-10 08:50:12 +09:00
test_worker.py fix(lps): 워커 행(hang) 3중 방어 — 잡 데드라인·웜업 타임아웃·정리 루프 격리 2026-07-10 11:27:03 +09:00