MX 수집_검토 · 검토요청 확인 리포트

마지막 업데이트: 2026-10-15 19:08 · 작업자 이종은(ai) · 엔진 수정 없음 (확인만)
진행 중0
확인 완료0
확인 중0
대기0
✓ 확인 요청11
완료40
행사이트보드시트 이슈원인 한 줄상태
42mediaworld.it
s_seq 1100427
MOBILE_APPLE 1103417 (동작 중)RPA 오수집 및 "제목 없음" 수집iPhone 18 카드에 button 태그가 없어 Item 정규식이 카드를 삼킴(87→64건)완료
41erosdigitalhome.ae
s_seq
일부 미수집(MOBILE_MOTOROLA)완료
40telenor.se
s_seq 1100310
MOBILE_SAMSUNG (1102748) / MOBILE_APPLE (1102749)전체 미수집 및 오수집Item 정규식에 하드코딩된 CSS 해시가 바뀌어 0건. 해시 의존 제거 필요완료
41btech.com
s_seq 1100133
MOBILE_VIVO (1108021)일부 미수집(MOBILE_VIVO)브라우저 응답 자체를 못 받음. 구조 변경이 아닌 browserless/proxy 장애 추정완료
42mvideo.ru
s_seq 1100089
MOBILE_VIVO (1107849)일부 미수집(MOBILE_VIVO)미수집 아님. 자사 직판 Vivo가 리퍼뿐이라 새상품 조건과 겹치는 게 0건완료
51o2.cz
s_seq 1100326
MOBILE_SAMSUNG (1102839)일부 미수집(MOBILE_SAMSUNG)사이트 이전 이슈와 동일. 2페이지 요청 실패는 일시적 오류, 정규식은 정상완료
50samsung.com/ae(trade_in)
s_seq 1100537
TABLET_ALL_S10 FE+ (1107989)일부 미수집(TABLET_ALL_S10 FE+)(trade-in 활성화 상태 미수집)1step Script에서 재고확인 뒤에 `$stockFlag = 0;`이 다시 0으로 덮어써서 수집 블록이 항상 건너뛰어짐(10/13부터 수집 0건)완료
재확인 해결
50apple.com/cn(trade_in)
s_seq
PN B 오수집B=C 항목은 API가 실제 같은 최저가를 반환해 정상✓ 확인 요청
49samsung.com/in(trade_in)
s_seq
TABLET_ALL_S10 FE+ 미수집패턴변경 후 227/227 전부 채워짐✓ 확인 요청
48alza.cz
s_seq
Z Fold8/Fold8 Ultra 미수집패턴변경 후 전 용량 모두 수집됨✓ 확인 요청
47o2.cz
s_seq
전체 미수집URL 변경(eshop.o2.cz) 후 오늘 4개 보드 모두 15~71건 정상 수집✓ 확인 요청
46apple.com/tw(trade_in)
s_seq
PN B 오수집수정 전 B=C였으나 수정 후 분리됨✓ 확인 요청
45apple.com/au(trade_in)
s_seq
PN B 오수집수정 전 B=A였으나 수정 후 B가 고유값으로 분리됨✓ 확인 요청
44abenson.com
s_seq
MOBILE_HUAWEI 가격 미수집빈 가격 41건은 사이트에서 Sold out 확인, 품절 미수집은 정상✓ 확인 요청
43boulanger.com
s_seq
WATCH_APPLE 가격 미수집55건 중 54건 채워짐(1건만 공백, 미미)✓ 확인 요청
42samsung.com/pt(trade_in)
s_seq
TABLET_ALL_S10 FE+ 미수집패턴변경 후 222/222 가격 채워짐✓ 확인 요청
41telefonika.com
s_seq
SAMSUNG/APPLE/HUAWEI 미수집동일 프록시 수정, 3개 보드 모두 가격 전부 채워짐✓ 확인 요청
40compughana.com
s_seq
MOBILE_HUAWEI 미수집외부프록시 추가 후 5/5 정상 수집, 실제 사이트 상품과 일치✓ 확인 요청
57interdiscount.ch
s_seq 1100450
TABLET_SAMSUNG (1109013)Tab S10+ 512GB C, Tab S10 FE/FE+/Lite 여러 용량 미수집 (6개 모델)미수집 아님. 신고된 모델은 10/13 정상 수집됨. W/C 색상코드만 확인 불가완료
56harveynorman.com.au
s_seq 1100471
TABLET_SAMSUNG (1109071)Tab S10+/FE/FE+/Lite 여러 용량 미수집 (7개 모델)변형 상품이 __NEXT_DATA__ JSON에만 있어 HTML 정규식이 못 잡음완료
54fravega.com
s_seq
Samsung Galaxy Tab S10+ 256GB W 미수집 Samsung Galaxy Tab S10 FE 128GB 미수집 Samsung Galaxy Tab S10 FE 256GB 미수집 Samsung Galaxy Tab S10 FE+ 128GB 미수집 Samsung Galaxy Tab S10 FE+ 256GB 미수집완료
52mediamarkt.com.tr
s_seq
Samsung Galaxy Tab S11 128GB 미수집 Samsung Galaxy Tab S11 256GB 미수집완료
53falabella.com
s_seq
Samsung Galaxy Tab S10 FE 256GB 미수집 / Tab S10 FE+ 256GB 미수집완료
51mxmemoxpress.com
s_seq 1100176
MOBILE_SAMSUNG(1101487)Samsung Galaxy S26 Ultra 1024GB 미수집오수집 아님. 재고 있는 상품만 수집하는데 해당 변형이 전부 품절이라 0건이 정상완료
48o2.cz
s_seq 1100326
MOBILE_SAMSUNG 1102839 / MOBILE_APPLE 1102840 / MOBILE_XIAOMI 1102843 / MOBILE_HONOR 1103685정의서 업데이트 (전체 미수집은 재조사 완료됨)사이트가 eshop.o2.cz로 이전돼 기존 API/구조 사용 불가. 보드 4개 재작성 필요완료
48o2.cz
s_seq 1100326
MOBILE_SAMSUNG 1102839 / MOBILE_APPLE 1102840 / MOBILE_XIAOMI 1102843 / MOBILE_HONOR 1103685수집원 URL 변경 (eshop.o2.cz로 재정의 요청, item 3)사이트가 eshop.o2.cz로 이전돼 기존 API/구조 사용 불가. 보드 4개 재작성 필요완료
52bestbuy.ca
s_seq
Samsung Galaxy Tab S11 128/256/512GB 미수집완료
51interdiscount.ch
s_seq
Samsung Galaxy Tab S11 128/256/512GB, Tab S11 Ultra 256/512GB 미수집완료
50samsung.com/in(trade_in)
s_seq
일부 가격 미수집(TABLET_ALL_S10 FE+)재고 루프가 첫 코드에서 break해 변형 1개만 수집완료
49alza.cz
s_seq
Samsung Galaxy Z Fold8 256/512/1024GB, Z Fold8 Ultra 256/512/1024GB 미수집NextLink 정규식이 "다음" 버튼의 aria-label 추가로 불일치해 1페이지만 수집완료
39backmarket.co.uk(Refur)
s_seq 1100604
MOBILE_SAMSUNG(1104779)/MOBILE_APPLE(1104780)전체 가격 미수집261013 : 봇 챌린지/프록시 간헐 실패 반복, 구조변경 없음 / 재수집시 정상화완료
54apple.com/au(trade_in)
s_seq 1100289
MOBILE_APPLE 1102672pn b항목 가격 오수집(a항목 가격 수집되고 있음)질문이 4개로 줄어 Plan B URL이 깨짐, B가 A와 같은 가격으로 수집됨완료
재확인 해결
51o2.cz
s_seq 1100326
MOBILE_SAMSUNG 1102839 / MOBILE_APPLE 1102840 / MOBILE_XIAOMI 1102843 / MOBILE_HONOR 1103685전체 미수집사이트가 eshop.o2.cz로 이전돼 기존 API/구조 사용 불가. 보드 4개 재작성 필요완료
49samsung.com/pt(trade_in)
s_seq 1100545
TABLET_ALL_S10 FE+(1107969)일부 미수집(TABLET_ALL_S10 FE+)미수집 아님. 해당 모델은 트레이드인 서비스 미지원이라 0건이 정상완료
48backmarket.es(RV)
s_seq 1100848
MOBILE_APPLE(1107934)일부 미수집(MOBILE_APPLE)1step의 $proxyArr1/$proxyArr2 미정의 오류로 매 실행 실패. 정의 위치 확인 필요완료
47telefonika.com
s_seq 1100915
MOBILE_SAMSUNG(1109393)/MOBILE_APPLE(1109394)/MOBILE_HUAWEI(1109395)일부 미수집(MOBILE_SAMSUNG,MOBILE_APPLE,MOBILE_HUAWEI)구조 변경 없음. 일부 실행에서 서버 요청이 무응답(간헐적 차단 의심)완료
46compughana.com
s_seq 1100916
MOBILE_HUAWEI (1109399)일부 미수집(MOBILE_HUAWEI)오수집 아님. HUAWEI 컬렉션에 판매 상품이 0개라 0건이 정상완료
40telstra.com.au(RV)
s_seq
MOBILE_SAMSUNG, MOBILE_APPLE (신규 2개, 수집_수집원(new) 탭 요청)신규 사이트 추가 (trade-in/buyback)단일 JSON API로 전체 기기 수집 가능. 정규식 파싱 불필요완료
43backmarket.co.uk(Refur)
s_seq 1100604
MOBILE_APPLE(1104780) / MOBILE_SAMSUNG(1104779)전체 가격 미수집간헐 실패 아님. SAMSUNG은 검색 API 403, APPLE은 2step 가격이 전부 빔완료
49worten.pt
s_seq 1100112
MOBILE_SAMSUNG 1101189 (+ RC9-05에서 돈 WATCH/MOBILE_APPLE 실행)일부 미수집(MOBILE_SAMSUNG,WATCH_APPLE,WATCH_HUAWEI)스크립트 문제 아님. RC9-05 서버 실행만 실패, 서버 제외 또는 프로필 정리 필요완료
48t-mobile.cz
s_seq 1100125
MOBILE_APPLE 1107534 / MOBILE_HONOR 1107535 / MOBILE_SAMSUNG 1107536 / MOBILE_XIAOMI 1107537전체 미수집listing API 응답 구조 변경으로 Item/Title/Link 0건. 정규식 교체와 APPLE 바디 수정 필요완료
45mediamarkt.es
s_seq 1100084
MOBILE_GOOGLE 1108328 (MOBILE_HONOR 1101079도 같은 현상)일부 미수집(MOBILE_GOOGLE)일시적 실패. 프리뷰는 1·2페이지 정상, 재수집하면 정상화완료
44mvideo.ru
s_seq 1100089
전체 14개 보드 (TWS/WATCH/MOBILE 전 브랜드, 1step이 bff/products API로 전환)전체 미수집mvideo API가 필수 쿠키 없는 요청을 400 거절. 쿠키를 받아 보내도록 수정 필요완료
47samsung.com/in
s_seq 1100041
TWS_SAMSUNG 1108393일부 미수집(TWS_SAMSUNG)URL의 재고 필터가 0건을 반환. 필터 제거 후 스크립트에서 재고 거르기완료
42compughana.com
s_seq 1100916
MOBILE_SAMSUNG 1109397 (MOBILE_TECNO 1109400도 같은 에러)일부 오수집(MOBILE_SAMSUNG)phones-tablets 컬렉션이라 삼성 태블릿이 섞임. 서버 빈 응답은 BrightData로 해결완료
51samsung.com trade_in (28개 국가)
s_seq
TABLET_ALL 계열브랜드 추가(TABLET_ALL_S12 ULTRA, TABLET_ALL_S12+)Tab S12 Ultra·S12+ 트레이드인 보드 신규 추가 요청(28개국, 보드 없음)완료
46trocafone.com(RV)
s_seq 1100772
전체전체 미수집로그 자체가 없음. 스케줄 실행 안 된 인프라성 문제 추정(2주 내 2회 반복)완료
58samsung.com/sg(trade_in)
s_seq 1100880
S25 FE 1108728 / S25 Ultra 1108718 / S26 FE 1109392S25 FE 비활성화 상태 오수집 / S25 Ultra,S26 FE 활성화 상태 미수집S25 FE 오수집은 해결. S25 Ultra·S26 FE 미수집은 트레이드인 가능 여부 확인 필요완료
56samsung.com/nl(trade_in)
s_seq 1100621
WATCH_ALL_7(40MM) 1107419 / WATCH_ALL_7(44MM) 1107420일부 오수집(40MM/44MM, 미판매 상태 수집)1번(W7 40MM)은 해결(0건), 새 2번(W7 44MM)은 판매 종료인데 아직 21건 수집 → 오수집완료
55samsung.com/be(trade_in)
s_seq 1100623
WATCH_ALL_7(40MM) 1107284 / WATCH_ALL_7(44MM) 1107285일부 오수집(44MM/40MM, 미판매 상태 수집)1번(W7 44MM)은 해결(0건), 새 2번(W7 40MM)은 판매 종료인데 아직 21건 수집 → 오수집완료
54fnac.com
s_seq
MOBILE_SAMSUNG수집원교체/URL교체/URL변경수집원 URL 변경 요청, 새 URL 확인 필요완료

#42mediaworld.it완료시트 검토 중 · 2026-10-15 16:01

원인: iPhone 18 카드에 button 태그가 없어 Item 정규식이 카드를 삼킴(87→64건)

기본 정보

시트 행42요청자현규이슈RPA 오수집 및 "제목 없음" 수집사이트번호1100427보드MOBILE_APPLE 1103417 (동작 중)

수정 위치

1step Item 노드 2번째 줄 (보드 1103417)

근거

  • 예시 링크 확인: d_seq 484549117 = iPhone 17 Pro Max 256GB Arancione, 제목 "제목 없음" + ProductInfo 없음 / 484549118 = iPhone 18 Pro Max 256GB Ghiacciaio, 정가 1639 · 판매가 1489
  • 수집 건수: 10/13 87건, 10/14 87건(제목없음 0, 가격이상 0) → 10/15 64건(제목없음 4, 판매가>정가 5건). 10/14에만 있던 23건이 10/15에 없음
  • 엔진 프리뷰(RC11-06, 저장 없음) HISTORY 원본 HTML: 카드(article) 12개. 현재 Item 2번째 줄은 8개만 매칭하고 그중 4개 청크가 상품 2개씩 포함 (594896+389196, 594894+391672, 594925+389195, 594922+594900)
  • 삼켜진 청크의 가격 칸이 ["1489","1129","949"]처럼 3개가 되어 정가=첫 칸(1489), 판매가=둘째 칸(1129)으로 읽힘 → 프리뷰 4번 행(18 Pro 256GB Borgogna)이 정가 1489 / 판매가 1129로 나옴(실제 단독 가격 1489)
  • 1번째 줄(productlist-item)은 현재 0건 매칭, 3번째 줄(article)은 12개 모두 정확히 매칭. 노드는 줄바꿈으로 한 줄씩 정상 입력돼 있음(앞선 "줄바꿈 누락" 진단은 오판)
  • 실제 사이트(mediaworld.it)는 제 브라우저에서 봇 확인에 막혀 직접 열어보지 못함. 원본은 엔진이 받은 HTML 기준

수정 방향

수정 전
!data-test="mms-product-card">(.*?<button type="button".*?)<[^>]+data-test="mms-search-wishlist!s
수정 후
!data-test="mms-product-card">(.*?)<[^>]+data-test="mms-search-wishlist!s
  1. MOBILE_APPLE 1103417: 1step Item 노드에서 3개 fallback 정규식 사이에 줄바꿈 추가(현재 한 줄로 붙어있어 PHP가 통째로 깨진 패턴 1개로 인식)

테스트 결과

  • 같은 원본 HTML에 적용: 수정 전 8개 매칭(상품 2개 묶인 청크 4개) → 수정 후 12개 매칭, 청크마다 상품 1개
  • 수정 후 가격 칸: iPhone 18 계열 카드는 ["1489"] 한 칸 → 정가 비고 판매가 1489(10/14와 동일), 일반 카드는 ["1339","1199,49"] 두 칸으로 정상
  • 엔진에는 저장하지 않음(동작 중 보드 수정 금지). 저장 후 프리뷰로 12건/제목 전부 나오는지 확인 필요

확인할 점

Item 노드 2번째 줄만 위 "수정 후" 한 줄로 교체. 1번째·3번째 줄은 그대로 둠. 제안 처리내역: 261015 : Item 패턴변경(스폰서 카드 button 없음으로 2상품 묶임, 정규식 button 조건 제거)

답장 (보내면 AI가 5분 안에 확인)

#41erosdigitalhome.ae완료시트 검토 중 · 2026-10-15 13:21

원인:

기본 정보

시트 행41요청자보영이슈일부 미수집(MOBILE_MOTOROLA)사이트번호보드

근거

  • 엔진 로그(log/logTaskData.php) 확인: MOBILE_MOTOROLA(sb_seq 1107918)가 10/13·10/14·10/15 3일간 매일 2회(08시대/01시대) 모두 "치명적에러", 수집 0건으로 일관되게 실패
  • 에러 상세(log/logTaskDetailData.php): error_code 210, error_message "Maximum (3) redirects followed (47)" - 사이트의 Link11 WAF가 리다이렉트 루프로 차단
  • 같은 사이트의 다른 보드(TWS_SAMSUNG/TWS_APPLE/MOBILE_HONOR/MOBILE_XIAOMI/MOBILE_OPPO)는 같은 기간 전부 정상 수집(각 1~42건) - 사이트 전체 차단이 아니라 특정 보드(요청 패턴)에 간헐적으로 걸리는 봇 차단
  • 참고로 MOBILE_REALME, MOBILE_VIVO도 같은 3일간 전부 치명적에러(response_time 0, 예약어처리 에러(Item))로 동반 실패 중이나 이번 검토요청 대상은 아님(별도 모니터링 권장)
  • PREG_TEST(az104, 엔진과 동일 서버)로 해당 URL 직접 호출 시 정상 200 응답(122KB JSON, product-item-link 4건 매칭) 확인
  • 엔진 Preview를 실제 할당서버(az104)로 직접 실행한 결과 Motorola Moto G77/G06 등 4개 상품이 가격(Retail_Price_Base/Actual)까지 정상 수집됨(스크린샷 확보) - 정규식/구조 문제 없음, 사이트도 정상 응답

확인할 점

261015 : Link11 WAF 일시적 차단(간헐) 추정, 프리뷰정상 / 재수집시 정상화 기대 (패턴변경 불필요). 참고로 같은 사이트 MOBILE_REALME·MOBILE_VIVO도 같은 기간 동일 패턴으로 치명적에러 발생 중이니 다음에 신고되면 같은 원인으로 먼저 확인할 것.

답장 (보내면 AI가 5분 안에 확인)

#40telenor.se완료시트 검토 중 · 2026-10-15 09:51

원인: Item 정규식에 하드코딩된 CSS 해시가 바뀌어 0건. 해시 의존 제거 필요

기본 정보

시트 행40요청자현규이슈전체 미수집 및 오수집사이트번호1100310보드MOBILE_SAMSUNG (1102748) / MOBILE_APPLE (1102749)

근거

  • 엔진 로그(log/logTaskData.php, s_seq=1100310): MOBILE_SAMSUNG(1102748)은 10/12·10/13·10/14 전부 "정상" 15건이었다가 10/15(오늘) 01:19·08:03 두 번 모두 "치명적에러" 0건으로 급변.
  • 에러 상세(logTaskDetailData.php, tl_seq=2201): error_code 330 "예약어처리 에러(Item)" - 1step Item 정규식이 전혀 매칭되지 않음.
  • 현재 Samsung 페이지(https://www.telenor.se/handla/mobiler/samsung/) 직접 확인: <article> 태그의 data-v-* 해시가 4952cfe1/b4c0e77e/15544276로 바뀌어 있고, 옛 해시 "6c2f030f"는 소스 전체에서 전혀 존재하지 않음(사이트 프론트엔드 재배포로 Vue 빌드 해시가 변경된 것으로 추정).
  • 같은 사이트 MOBILE_APPLE(1102749)의 Item 노드에는 이미 3개 패턴이 들어있는데, 그 중 하나(`!(<article data.*?data-test="grid-item-heading"[^>]*>.*?</article>)!s`)는 해시에 의존하지 않아 Samsung 페이지에도 그대로 적용해보니 15건 전부 정상 매칭됨(실제 페이지의 상품 수 15개와 일치).
  • MOBILE_APPLE 로그(10/12~10/15): 일반에러이지만 완전 0건은 아니고 11건/3건을 날짜별로 오감. 실제 Apple 페이지의 <article> 총 14개 중 data-test="grid-item-heading" 속성이 있는 것은 11개(나머지 3개는 액세서리/배너용 카드로 추정) - 11건이 정상치. 3건만 나온 날은 proxy가 받아온 소스가 다르게 렌더됐을 가능성(프록시측 변동) 의심, 완전한 구조변경은 아닌 것으로 보임.

수정 방향

수정 전
!(<article.*?6c2f030f.*?</article>)!s
수정 후
!(<article data.*?data-test="grid-item-heading"[^>]*>.*?</article>)!s
!(<article data.*?</article>)!s
  1. MOBILE_SAMSUNG(1102748) 1step Item 정규식을 해시에 의존하지 않는 패턴으로 교체: !(<article data.*?data-test="grid-item-heading"[^>]*>.*?</article>)!s (MOBILE_APPLE에 이미 쓰이고 있는 패턴과 동일, 검증 완료: 현재 페이지에서 15건 전부 정상 매칭).
  2. 선택사항: MOBILE_APPLE처럼 기존 해시 패턴(6c2f030f)도 한 줄 더 남겨두면 추후 해시가 또 바뀌어도 fallback 역할은 못하지만 구조 자체가 바뀌는 경우 대비용으로 generic 패턴 `!(<article data.*?</article>)!s`도 추가해두는 것을 권장.

확인할 점

261015 : Vue scoped-css 해시 변경으로 Item 정규식 불일치(패턴변경) / MOBILE_SAMSUNG은 해시 미의존 패턴으로 교체하면 즉시 정상화 예상(현재 페이지 기준 15건 매칭 검증완료). MOBILE_APPLE의 11건/3건 오가는 간헐 부분수집은 별도 모니터링 필요(이번엔 치명적 수준 아님).

답장 (보내면 AI가 5분 안에 확인)

#41btech.com완료시트 확인 요청 · 2026-10-15 09:31

원인: 브라우저 응답 자체를 못 받음. 구조 변경이 아닌 browserless/proxy 장애 추정

기본 정보

시트 행41요청자현규이슈일부 미수집(MOBILE_VIVO)사이트번호1100133보드MOBILE_VIVO (1108021)

근거

  • 엔진 로그(s_seq=1100133, MOBILE_VIVO 1108021): 10/12 정상 24건, 10/13 정상 27건, 10/14 정상이지만 5건으로 급감, 10/15 00:58·08:05 두 번 다 치명적에러 0건.
  • 에러 상세(tl_seq=2227): url은 정상 카테고리 URL(brands=vivo 필터 포함), error_code 330 "예약어처리 에러(Item)", response_time=0 - 즉 페이지 내용을 아예 못 받아온 것으로 보임(스크립트 실행 자체가 실패/타임아웃된 정황).
  • 현재 해당 URL을 직접 열어 확인한 결과 상품 카드(<article data-testid="product-card">) 40개, 상품 링크 패턴(href에 "/p/" 포함)도 40개로 스크립트가 찾는 패턴과 정확히 일치 - 사이트 구조 자체는 바뀌지 않음.
  • 스크립트는 최대 30회 스크롤(최대 약 75초)을 반복하며 로딩 안정화를 기다리는 구조라, 사이트가 느려지거나 proxy가 불안정하면 timeout에 걸려 0건으로 끝날 가능성이 있음. 최근 4일간 건수가 점점 줄어든 추세(24→27→5→0)도 이 가설과 일치.

확인할 점

261015 : 사이트 구조변경 아님(상품 셀렉터 현재도 유효, 직접 확인). browserless/proxy(proxy.realsn.com:24143) 간헐 타임아웃으로 추정 - response_time 0건이 핵심 근거. 재수집시 정상화 가능성 높음. 지속 반복되면 스크립트의 scroll 타임아웃(30회*2.5초)을 늘리거나 proxy 상태를 점검 권장.

답장 (보내면 AI가 5분 안에 확인)

#42mvideo.ru완료시트 확인 요청 · 2026-10-15 09:11

원인: 미수집 아님. 자사 직판 Vivo가 리퍼뿐이라 새상품 조건과 겹치는 게 0건

기본 정보

시트 행42요청자현규이슈일부 미수집(MOBILE_VIVO)사이트번호1100089보드MOBILE_VIVO (1107849)

근거

  • 엔진 로그(s_seq=1100089, MOBILE_VIVO 1107849): 10/12 치명적에러 0건(2회), 10/13 "일반에러"지만 61건 성공, 10/14·10/15 치명적에러 0건 - 재고 상황에 따라 날짜별로 들쭉날쭉.
  • 에러 상세(tl_seq=2228): API 호출 자체는 200대 응답을 받았을 가능성이 있으나(response_time 0으로 표시되는 건 204 No Content 응답 특성으로 추정), error_code 330 Item 매칭 실패.
  • REPL로 브라우저 내 fetch(credentials 포함)로 정확히 같은 POST body(category=205, brand=vivo, prodavec=mvideo, sostoyanie=novyi)를 호출 → 응답 status 204, 본문 길이 0(상품 0건) 직접 재현 확인.
  • 필터를 하나씩 빼고 테스트: category+brand만 넣으면 200건 정상(리퍼비시 2종 + 정식 신품 Vivo X300/X300s 등 포함 88KB 응답). category+brand+prodavec(자사판매)만 넣으면 200건이지만 결과 2건 전부 "Восстановленный"(리퍼비시)만 존재, "신품" 조건과 겹치는 게 하나도 없음을 확인.
  • 같은 사이트 MOBILE_TECNO(1107850, 동일 API/필터 구조)는 10/13~10/15 계속 정상(14~61건) 수집 중 → 스크립트/프록시/구조 문제가 아니라 VIVO 브랜드만 자사 직판 신상품 재고가 일시적으로 바닥난 것으로 결론.

확인할 점

261015 : 오수집/미수집 아님(정상 0건) - mvideo.ru 자사판매(prodavec=mvideo) + 신상품(sostoyanie=novyi) 조건을 만족하는 Vivo 제품이 현재 없음(전부 리퍼비시로만 판매 중). 같은 필터 구조의 TECNO 보드는 정상 작동 중이라 스크립트 수정 불필요. 재고가 돌아오면 자동으로 재수집됨.

답장 (보내면 AI가 5분 안에 확인)

#51o2.cz완료시트 검토 중 · 2026-10-15 08:51

원인: 사이트 이전 이슈와 동일. 2페이지 요청 실패는 일시적 오류, 정규식은 정상

기본 정보

시트 행51요청자보영이슈일부 미수집(MOBILE_SAMSUNG)사이트번호1100326보드MOBILE_SAMSUNG (1102839)

근거

  • 엔진 로그(s_seq=1100326): 10/12·10/13 전부 "정상" 112건(SAMSUNG), 10/14 4개 보드 전부 "치명적에러" 0건(사이트 이전 직후), 10/15 05:12엔 여전히 치명적에러지만 08:04 "일반에러" 15건으로 부분 회복.
  • 에러 상세(logTaskDetailData.php, tl_seq=2213): url이 page=2 요청, error_code 330 "예약어처리 에러(Item, NextLink)" - 2페이지에서 Item/NextLink 둘 다 매칭 실패로 기록됨.
  • REPL 직접 fetch(동일 헤더, 프록시 없음) 및 PREG_TEST(GB108, 엔진과 동일 서버)로 같은 page=2 URL을 호출한 결과 둘 다 grid__item 15개, product-card-o2 38개, "Další stránka" 다음페이지 링크까지 전부 정상 존재. 현재 Item 정규식(`!(<li class="grid__item">\s*<product-card-o2 class="o2-card-wrapper">.*?</product-card-o2>)!s`)과 NextLink 정규식(`!<a\s+href="([^"]+)"[^>]*aria-label="Další stránka"!s`)을 그대로 테스트해도 각각 15건, page3 링크 정상 매칭됨.
  • 즉 정규식·사이트 구조는 현재 정상이며, 어제(10/15 08:04) 그 시점에만 일시적으로 page2 요청이 실패한 것으로 보임(재정의 직후라 아직 완전히 안정화되지 않았을 가능성도 있음).

확인할 점

261015 : 사이트 이전(eshop.o2.cz) 직후 일부 페이지(2페이지 이후) 일시적 수집 실패 - 정규식/구조 재검증 결과 정상(PREG_TEST 동일서버 확인), 재수집시 정상화 예상. 패턴 수정 불필요, 지속 재발 시 재확인 필요.

답장 (보내면 AI가 5분 안에 확인)

#50samsung.com/ae(trade_in)완료시트 확인 요청 · 2026-10-15 08:31

원인: 1step Script에서 재고확인 뒤에 `$stockFlag = 0;`이 다시 0으로 덮어써서 수집 블록이 항상 건너뛰어짐(10/13부터 수집 0건)

기본 정보

시트 행50요청자현규이슈일부 미수집(TABLET_ALL_S10 FE+)(trade-in 활성화 상태 미수집)사이트번호1100537보드TABLET_ALL_S10 FE+ (1107989)

수정 위치

TABLET_ALL_S10 FE+ 1107989 / 1step Script / 재고확인 주석블록 뒤, `if ($stockFlag == 1) {` 바로 앞 (67행 부근)

근거

  • 10/09~12 정상 63건, 10/13부터 3일 연속 수집 0건(치명적에러)
  • 정상 작동하는 자매 보드 TABLET_ALL_S10 FE(1107990)와 비교하면 FE+에만 `$stockFlag = 0;` 한 줄이 더 있음
  • 사이트는 모델 6개 중 3개가 트레이드인 활성 상태라 수집돼야 정상

수정 방향

수정 전
// }

$stockFlag = 0;
if ($stockFlag == 1) {
수정 후
// }

// $stockFlag = 0;   <- 삭제 또는 주석
if ($stockFlag == 1) {
  1. TABLET_ALL_S10 FE+ 1107989: 1step Script에서 `if ($stockFlag == 1) {` 바로 앞의 `$stockFlag = 0;` 한 줄을 삭제(또는 `//`로 주석)
  2. 적용 상태(10/14 재확인): 엔진 스크립트에 이미 `// $stockFlag = 0;`로 주석 처리돼 있음. 추가 수정 없음
  3. 남은 확인: 다음 수집(10/15 이후)에서 FE+ 수집 건수가 0이 아닌지 확인
전체 소스 보기 (드롭인)
<?
$responseBody = "";

$PN = "Galaxy Tab S10 FE+";
// $productCode = "SM-X626BZSEMEA";
$stockFlag = 0;

$this->arrCurlOption[CURLOPT_URL] = $this->baseURL;
$pageSource = $this->classRequestURL->getHtmlObj($this->arrCurlOption);

if (preg_match('!/tablets/|/watches/!', $this->baseURL)) {
    $prefixPattern = '!^(SM-[A-Z][0-9]{2})!'; 
} else {
    $prefixPattern = '!^(SM-[A-Z][0-9]{3})!'; 
}

if (preg_match('!"displayName":"' . preg_quote($PN, '!') . '","englishName":"[^"]+","[^"]+":"[^"]+","modelCode":"(SM-[A-Z0-9]+)"!s', $pageSource, $tempPNCode)) {
    $pnModelCode = $tempPNCode[1];
    if (preg_match($prefixPattern, $pnModelCode, $tempFamily)) {
        $familyPrefix = $tempFamily[1];
        if (preg_match_all('!"(' . preg_quote($familyPrefix, '!') . '[A-Z0-9]+)"!s', $pageSource, $tempAllCodes)) {
            $allModelCodes = array_unique($tempAllCodes[1]);
        } else {
            $allModelCodes = array($pnModelCode);
        }
    } else {
        $allModelCodes = array($pnModelCode);
    }
} elseif (preg_match_all('!"(SM-[A-Z0-9]+)"!s', $pageSource, $tempAllCodes)) {
    $allModelCodes = array_unique($tempAllCodes[1]);
} else {
    $allModelCodes = array();
}

foreach ($allModelCodes as $checkCode) {
    $this->arrCurlOption[CURLOPT_URL] = "https://shop.samsung.com/tokocommercewebservices/v2/ae/servicesv2/getTradeInSimpleInfo?productCode=" . $checkCode;
    $stockSource = $this->classRequestURL->getHtmlObj($this->arrCurlOption);

    if (!preg_match('!Service List is Empty!s', $stockSource) && !preg_match('!(?:UnknownIdentifierError|IllegalArgumentError)!s', $stockSource)) {
        $stockFlag = 1;
        $productCode = $checkCode;
        break;
    }
    sleep(1);
}
if ($stockFlag == 0) {
    $productCode = 'SM-A077FLVDMEA';
    $this->arrCurlOption[CURLOPT_URL] = "https://shop.samsung.com/tokocommercewebservices/v2/ae/servicesv2/getTradeInSimpleInfo?productCode=" . $productCode;
    $stockSource = $this->classRequestURL->getHtmlObj($this->arrCurlOption);
    if (preg_match('!"provider"\s*:\s*"NORTHLADDER"!s', $stockSource)) {
        $stockFlag = 1;
    }
}
// $productCode = 'SM-X626BZSAMEA';
$this->arrDefaultSet['CRAWLER']['TEMP']['CAT']  ='';
$this->arrDefaultSet['CRAWLER']['TEMP']['CAT'] = $productCode;
// $stockFlag = 1;

// $stockFlag = 0;
// $this->arrCurlOption[CURLOPT_URL] = "https://shop.samsung.com/tokocommercewebservices/v2/ae/servicesv2/getTradeInSimpleInfo?productCode=" . $productCode;
// $stockSource = $this->classRequestURL->getHtmlObj($this->arrCurlOption);

// if (!preg_match('!Service List is Empty!s', $stockSource) && !preg_match('!IllegalArgumentError!s', $stockSource) && !preg_match('!UnknownIdentifierError!s', $stockSource)) {
//     $stockFlag = 1;
// }

// $stockFlag = 0;
if ($stockFlag == 1) {

$this->arrCurlOption[CURLOPT_URL] = "https://shop.samsung.com/ae/tradeinv2/filterDevices?q=&mainProductCode=" .$productCode. "&provider=NORTHLADDER";
$catSource = $this->classRequestURL->getHtmlObj($this->arrCurlOption);

if (preg_match('!"category":"deviceType","value":"(Tablet)",!s', $catSource, $tempCategory)) {
    $catId = rawurlencode($tempCategory[1]);
} else {
    $catId = "";
}

$this->arrCurlOption[CURLOPT_URL] = "https://shop.samsung.com/ae/tradeinv2/filterDevices?q=deviceType:" .$catId. "&mainProductCode=" .$productCode. "&provider=NORTHLADDER";
$brandSource = $this->classRequestURL->getHtmlObj($this->arrCurlOption);

if (preg_match_all('!("category":"brandName","value":"[^"]+","displayName":".*?",)!s', $brandSource, $tempBrandArr)) {
    foreach($tempBrandArr[1] as $tempBrandSource) {
        
        if (preg_match('!"value":"([^"]+)"!s', $tempBrandSource, $tempBrandKey)) {
            $brandKey = rawurlencode($tempBrandKey[1]);
        } else {
            $brandKey = "";
        }
        
        if (preg_match('!"displayName":"(.*?)",!s', $tempBrandSource, $tempBrand)) {
            $brand = $tempBrand[1];
        } else {
            $brand = "";
        }
        
        if ($brand == "Samsung" || $brand == "Apple") {
            
            $this->arrCurlOption[CURLOPT_URL] = "https://shop.samsung.com/ae/tradeinv2/filterDevices?q=deviceType:" .$catId. ":brandName:" .$brandKey. "&mainProductCode=" .$productCode. "&provider=NORTHLADDER";
            $this->arrHeader = array(
            'sec-ch-ua-platform: "Windows"',
            'Referer: https://www.samsung.com/',
            'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
            'Accept: application/json, text/javascript, */*; q=0.01',
            'sec-ch-ua: "Not A(Brand";v="8", "Chromium";v="132", "Google Chrome";v="132"',
            'sec-ch-ua-mobile: ?0'
            );
            $this->arrCurlOption[CURLOPT_HTTPHEADER] = $this->arrHeader;
            $modelNameSource = $this->classRequestURL->getHtmlObj($this->arrCurlOption);
            $modelNameJson = json_decode($modelNameSource, true);
            $modelNameSource = json_encode($modelNameJson['children'], JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
            
            if (preg_match_all('!("category":".*?","value":".*?","displayName":".*?",)!s', $modelNameSource, $tempModelNameArr)) {
                foreach($tempModelNameArr[1] as $tempModelNameSource) {
                    
                    if (preg_match('!"category":"(.*?)",!s', $tempModelNameSource, $tempModelNameCat)) {
                        $modelNameCat = rawurlencode($tempModelNameCat[1]);
                    } else {
                        $modelNameCat = "";
                    }
                    
                    if (preg_match('!"value":"(.*?)",!s', $tempModelNameSource, $tempModelNameKey)) {
                        $modelNameKey = rawurlencode($tempModelNameKey[1]);
                    } else {
                        $modelNameKey = "";
                    }
                    
                    if (preg_match('!"displayName":"(.*?)",!s', $tempModelNameSource, $tempModelName)) {
                        $modelName = $tempModelName[1];
                    } else {
                        $modelName = "";
                    }
                    
                    $this->arrCurlOption[CURLOPT_URL] = "https://shop.samsung.com/ae/tradeinv2/filterDevices?q=deviceType:" .$catId. ":brandName:" .$brandKey. ":" .$modelNameCat. ":" .$modelNameKey. "&mainProductCode=" .$productCode. "&provider=NORTHLADDER";
                    $modelSource = $this->classRequestURL->getHtmlObj($this->arrCurlOption);
                    $modelJson = json_decode($modelSource, true);
                    $modelSource = json_encode($modelJson['children'], JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
                    
                    if (preg_match_all('!("category":".*?","value":".*?","displayName":".*?",)!is', $modelSource, $tempModelArr)) {
                        foreach($tempModelArr[1] as $tempModelSource) {
                            
                            if (preg_match('!"category":"(.*?)",!s', $tempModelSource, $tempModelCat)) {
                                $modelCat = rawurlencode($tempModelCat[1]);
                            } else {
                                $modelCat = "";
                            }
                            
                            if (preg_match('!"value":"(.*?)",!s', $tempModelSource, $tempModelKey)) {
                                $modelKey = rawurlencode($tempModelKey[1]);
                            } else {
                                $modelKey = "";
                            }
                            
                            if (preg_match('!"displayName":"(.*?)",!s', $tempModelSource, $tempModel)) {
                                $model = $tempModel[1];
                            } else {
                                $model = "";
                            }
                            
                            $this->arrCurlOption[CURLOPT_URL] = "https://shop.samsung.com/ae/tradeinv2/filterDevices?q=deviceType:" .$catId. ":brandName:" .$brandKey. ":" .$modelNameCat. ":" .$modelNameKey. ":" .$modelCat. ":" .$modelKey. "&mainProductCode=" .$productCode. "&provider=NORTHLADDER";
                            $screenSource = $this->classRequestURL->getHtmlObj($this->arrCurlOption);
                            $screenJson = json_decode($screenSource, true);
                            $screenSource = json_encode($screenJson['children'], JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
                            
                            if (preg_match_all('!("category":".*?","value":".*?","displayName":".*?",)!is', $screenSource, $tempScreenArr)) {
                                foreach($tempScreenArr[1] as $tempScreenSource) {
                                    
                                    if (preg_match('!"category":"(.*?)",!s', $tempScreenSource, $tempScreenCat)) {
                                        $screenCat = rawurlencode(str_replace('\\', '', $tempScreenCat[1]));
                                    } else {
                                        $screenCat = "";
                                    }
                                    
                                    if (preg_match('!"value":"(.*?)",!s', $tempScreenSource, $tempScreenKey)) {
                                        $screenKey = rawurlencode(str_replace('\\', '', $tempScreenKey[1]));
                                        $screenParam = rawurlencode($tempScreenKey[1]);
                                    } else {
                                        $screenkey = "";
                                    }
                                    
                                    if (preg_match('!"displayName":"(.*?)",!s', $tempScreenSource, $tempScreen)) {
                                        $screen = $tempScreen[1];
                                    } else {
                                        $screen = "";
                                    }
                                    
                                    $this->arrCurlOption[CURLOPT_URL] = "https://shop.samsung.com/ae/tradeinv2/filterDevices?q=deviceType:" .$catId. ":brandName:" .$brandKey. ":" .$modelNameCat. ":" .$modelNameKey. ":" .$modelCat. ":" .$modelKey. ":" .$screenCat. ":" .$screenKey. "&mainProductCode=" .$productCode. "&provider=NORTHLADDER";
                                    $variantSource = $this->classRequestURL->getHtmlObj($this->arrCurlOption);
                                    $variantJson = json_decode($variantSource, true);
                                    $variantSource = json_encode($variantJson['children'], JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
                                    
                                    if (preg_match_all('!("category":".*?","value":".*?","displayName":".*?",)!is', $variantSource, $tempVariantArr)) {
                                        foreach($tempVariantArr[1] as $tempVariantSource) {
                                            
                                            if (preg_match('!"category":"(.*?)",!s', $tempVariantSource, $tempVariantCat)) {
                                                $variantCat = rawurlencode(str_replace('\\', '', $tempVariantCat[1]));
                                            } else {
                                                $variantCat = "";
                                            }
                                            
                                            if (preg_match('!"value":"(.*?)",!s', $tempVariantSource, $tempVariantKey)) {
                                                $variantKey = rawurlencode(str_replace('\\', '', $tempVariantKey[1]));
                                                $variantParam = rawurlencode($tempVariantKey[1]);
                                            } else {
                                                $variantkey = "";
                                            }
                                            
                                            if (preg_match('!"displayName":"(.*?)",!s', $tempVariantSource, $tempVariant)) {
                                                $variant = $tempVariant[1];
                                            } else {
                                                $variant = "";
                                            }
                                            
                                            $this->arrCurlOption[CURLOPT_URL] = "https://shop.samsung.com/ae/tradeinv2/filterDevices?q=deviceType:" .$catId. ":brandName:" .$brandKey. ":" .$modelNameCat. ":" .$modelNameKey. ":" .$modelCat. ":" .$modelKey. ":" .$screenCat. ":" .$screenKey. ":" .$variantCat. ":" .$variantKey. "&mainProductCode=" .$productCode. "&provider=NORTHLADDER";
                                            $memorySource = $this->classRequestURL->getHtmlObj($this->arrCurlOption);
                                            $memoryJson = json_decode($memorySource, true);
                                            $memorySource = json_encode($memoryJson['children'], JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
                                            
                                            if (preg_match_all('!("category":".*?","value":".*?","displayName":".*?",)!is', $memorySource, $tempMemoryArr)) {
                                                foreach($tempMemoryArr[1] as $tempMemorySource) {
                                                    
                                                    if (preg_match('!"category":"(.*?)",!s', $tempMemorySource, $tempMemoryCat)) {
                                                        $memoryCat = rawurlencode(str_replace('\\', '', $tempMemoryCat[1]));
                                                    } else {
                                                        $memoryCat = "";
                                                    }
                                                    
                                                    if (preg_match('!"value":"(.*?)",!s', $tempMemorySource, $tempMemoryKey)) {
                                                        $memoryKey = rawurlencode(str_replace('\\', '', $tempMemoryKey[1]));
                                                        $memoryParam = rawurlencode($tempMemoryKey[1]);
                                                    } else {
                                                        $memoryKey = "";
                                                    }
                                                    
                                                    
                                                    if (preg_match('!"displayName":"(.*?)",!s', $tempMemorySource, $tempMemory)) {
                                                        $memory = $tempMemory[1];
                                                    } else {
                                                        $memory = "";
                                                    }

                                                    $responseBody .= "@#RSNSTART@#" . "Title:" . $brand . " " . $modelName . " " . $model . " " . $screen . " " . $variant . " " . $memory . "Link:" . $brand . "#" . $modelName . "#" . $model . "#" . $screen . "#" . $variant . "#" . $memory . "Param:deviceType:" .$catId. ":brandName:" .$brandKey. ":" .$modelNameCat. ":" .$modelNameKey.":" .$modelCat. ":" .$modelKey.":" .$screenCat. ":" .$screenParam. ":" .$variantCat. ":" .$variantParam. ":" .$memoryCat. ":" .$memoryParam. "@#RSNEND@#";
                                                    
                                                    $this->arrCurlOption[CURLOPT_POST] = false;
                                                    unset($this->arrCurlOption[CURLOPT_POSTFIELDS]);
                                                    
                                                }
                                            }
                                            
                                        }
                                    }
                                    
                                }
                            }
                            
                        }
                    }
                    
                }
            }
            
        }                                        

    }
}

}

$this->requestChk = true;


if( isset($this->arrDefaultSet['CRAWLER']['p_seq']) ){
	$this->insertTable('PREVIEW_HISTORY', array('ph_url' => "'".changeSQL($this->baseURL)."'", 'ph_http_header' => "''", 'ph_html_source' => "'".changeSQL($responseBody)."'", 'ph_step' => $step, 'p_seq' => $this->arrDefaultSet['CRAWLER']['p_seq']));
}

수정 후 재확인

해결됨 · 조건: TABLET_ALL_S10 FE+ 보드(1107989) 수집 건수가 0이 아님
결과: 오늘 08:32:38 GB11 정상 63건 (2026-10-15 19:08)

테스트 결과

  • 엔진에서 현재 스크립트 확인: 해당 줄이 이미 주석 처리됨
  • getTradeInSimpleInfo 확인: 모델 6개 중 3개 활성(200), 3개는 not found

확인할 점

261015 : FE+ 보드 1step 스크립트에 "$stockFlag = 0;" 중복 줄 발견(정상 작동 중인 FE 보드엔 없음) - 그 한 줄 삭제가 수정안. 정의서 변경 불필요, 패턴변경(1줄 삭제)만 하면 됨.

답장 (보내면 AI가 5분 안에 확인)

#50apple.com/cn(trade_in)✓ 확인 요청2026-10-15 08:05

원인: B=C 항목은 API가 실제 같은 최저가를 반환해 정상

기본 정보

시트 행50요청자(자동 확인 루틴)이슈PN B 오수집사이트번호보드

근거

  • 엔진 스크립트가 Apple API를 조건별로 실제 호출하는 구조. B=C 항목(구형 저가 아이폰)은 API가 반환한 실제 최저가 동일값으로 정상 판단

답장 (보내면 AI가 5분 안에 확인)

#49samsung.com/in(trade_in)✓ 확인 요청2026-10-15 08:05

원인: 패턴변경 후 227/227 전부 채워짐

기본 정보

시트 행49요청자(자동 확인 루틴)이슈TABLET_ALL_S10 FE+ 미수집사이트번호보드

근거

  • 패턴변경 후 227/227 전부 채워짐

답장 (보내면 AI가 5분 안에 확인)

#48alza.cz✓ 확인 요청2026-10-15 08:05

원인: 패턴변경 후 전 용량 모두 수집됨

기본 정보

시트 행48요청자(자동 확인 루틴)이슈Z Fold8/Fold8 Ultra 미수집사이트번호보드

근거

  • 패턴변경 후 전 용량 모두 수집됨

답장 (보내면 AI가 5분 안에 확인)

#47o2.cz✓ 확인 요청2026-10-15 08:05

원인: URL 변경(eshop.o2.cz) 후 오늘 4개 보드 모두 15~71건 정상 수집

기본 정보

시트 행47요청자(자동 확인 루틴)이슈전체 미수집사이트번호보드

근거

  • URL 변경(eshop.o2.cz) 후 오늘 4개 보드 모두 15~71건 정상 수집

답장 (보내면 AI가 5분 안에 확인)

#46apple.com/tw(trade_in)✓ 확인 요청2026-10-15 08:05

원인: 수정 전 B=C였으나 수정 후 분리됨

기본 정보

시트 행46요청자(자동 확인 루틴)이슈PN B 오수집사이트번호보드

근거

  • 수정 전 B=C였으나 수정 후 분리됨

답장 (보내면 AI가 5분 안에 확인)

#45apple.com/au(trade_in)✓ 확인 요청2026-10-15 08:05

원인: 수정 전 B=A였으나 수정 후 B가 고유값으로 분리됨

기본 정보

시트 행45요청자(자동 확인 루틴)이슈PN B 오수집사이트번호보드

근거

  • 수정 전 B=A였으나 수정 후 B가 고유값으로 분리됨

답장 (보내면 AI가 5분 안에 확인)

#44abenson.com✓ 확인 요청2026-10-15 08:05

원인: 빈 가격 41건은 사이트에서 Sold out 확인, 품절 미수집은 정상

기본 정보

시트 행44요청자(자동 확인 루틴)이슈MOBILE_HUAWEI 가격 미수집사이트번호보드

근거

  • 빈 가격 41건 전부 사이트에서 "Sold out" 확인, 채워진 24건은 "Available online" - 품절 미수집은 정상

답장 (보내면 AI가 5분 안에 확인)

#43boulanger.com✓ 확인 요청2026-10-15 08:05

원인: 55건 중 54건 채워짐(1건만 공백, 미미)

기본 정보

시트 행43요청자(자동 확인 루틴)이슈WATCH_APPLE 가격 미수집사이트번호보드

근거

  • 55건 중 54건 채워짐(1건만 공백, 미미)

답장 (보내면 AI가 5분 안에 확인)

#42samsung.com/pt(trade_in)✓ 확인 요청2026-10-15 08:05

원인: 패턴변경 후 222/222 가격 채워짐

기본 정보

시트 행42요청자(자동 확인 루틴)이슈TABLET_ALL_S10 FE+ 미수집사이트번호보드

근거

  • 패턴변경 후 222/222 가격 채워짐

답장 (보내면 AI가 5분 안에 확인)

#41telefonika.com✓ 확인 요청2026-10-15 08:05

원인: 동일 프록시 수정, 3개 보드 모두 가격 전부 채워짐

기본 정보

시트 행41요청자(자동 확인 루틴)이슈SAMSUNG/APPLE/HUAWEI 미수집사이트번호보드

근거

  • 동일 프록시 수정, 3개 보드 모두 가격 전부 채워짐

답장 (보내면 AI가 5분 안에 확인)

#40compughana.com✓ 확인 요청2026-10-15 08:05

원인: 외부프록시 추가 후 5/5 정상 수집, 실제 사이트 상품과 일치

기본 정보

시트 행40요청자(자동 확인 루틴)이슈MOBILE_HUAWEI 미수집사이트번호보드

근거

  • 외부프록시 추가 후 5/5 정상 수집, 실제 사이트 상품과 일치

답장 (보내면 AI가 5분 안에 확인)

#57interdiscount.ch완료시트 행 삭제됨(시트에서 확인 불가) · 2026-10-15 08:01

원인: 미수집 아님. 신고된 모델은 10/13 정상 수집됨. W/C 색상코드만 확인 불가

기본 정보

시트 행57요청자한올이슈Tab S10+ 512GB C, Tab S10 FE/FE+/Lite 여러 용량 미수집 (6개 모델)사이트번호1100450보드TABLET_SAMSUNG (1109013)

근거

  • 수집정보검색(10/13) TABLET_SAMSUNG 86건 중 Tab S10 계열 29건 전부 Retail_Price_Actual 값 존재(빈 값 없음).
  • 예: Tab S10 FE WiFi 128GB(Grau/Blau/Silber) 379.95, Tab S10 FE+ WiFi 256GB(Grau) 702, Tab S10 Lite(Silber/Koralle/Grau) 256GB 329.95~489.8 등 전부 정상.
  • Tab S10+ 512GB은 Grau(1116)/5G Silber(1443.6) 둘 다 수집됨. "C"로 표기된 색상이 사이트 실제 색상명(Grau/Silber)과 직접 매칭되지 않아 어떤 색상을 가리키는지 특정 불가.

확인할 점

261014 : 신고된 모델명 전부 확인 결과 정상 수집 중. 색상코드(W/C) 표기가 실제 사이트 색상명과 다르게 보여 혼선이 있었을 가능성. 추가 확인 필요하면 정확한 SKU/색상 알려달라고 요청 권장.

답장 (보내면 AI가 5분 안에 확인)

#56harveynorman.com.au완료시트 행 삭제됨(시트에서 확인 불가) · 2026-10-15 08:01

원인: 변형 상품이 __NEXT_DATA__ JSON에만 있어 HTML 정규식이 못 잡음

기본 정보

시트 행56요청자한올이슈Tab S10+/FE/FE+/Lite 여러 용량 미수집 (7개 모델)사이트번호1100471보드TABLET_SAMSUNG (1109071)

수정 위치

1step Script (URL: .../computers-tablets/ipads-surface-tablets/samsung-tablets/tablets/samsung/1065-993)

근거

  • PREG_TEST(ZONE1, 엔진과 동일 BrightData Unlocker 소스)로 받은 서버 HTML에 grid-item 19개, pagination 없음 — 실제 수집 결과(19건)와 정확히 일치, 페이징 문제 아님.
  • 같은 소스의 __NEXT_DATA__ JSON parsing 결과 productsData.total_count=19(parent 상품 기준)이지만 각 parent의 configurable_variants.variants[]에 추가 SKU가 더 있음.
  • 예: Tab S10+ 5G/Wi-Fi 변형에 256GB(Moonstone Grey, IN_STOCK, $2049/$1799)가 있는데 HTML 카드는 512GB만 노출 → 256GB는 Item 정규식에 안 잡힘.
  • 예: Tab S10 FE 5G 128GB(Grey, IN_STOCK, $897), Tab S10 FE/FE+ Wi-Fi 128GB의 Blue/Grey 색상(Silver만 카드로 노출)도 같은 구조로 누락.

수정 방향

수정 전
// 1step Script 마지막 부분
$this->requestChk = true;
// 프리뷰 보이게 하기
if( isset($this->arrDefaultSet['CRAWLER']['p_seq'])){ ... }
수정 후
// 1step Script 마지막 부분 뒤에 추가
if (preg_match('!<script id="__NEXT_DATA__" type="application/json">(.*?)</script>!s', $responseBody, $tempNext)) {
    $nextData = json_decode($tempNext[1], true);
    $items = isset($nextData['props']['pageProps']['pageProps']['pageData']['productsData']['items']) ? $nextData['props']['pageProps']['pageProps']['pageData']['productsData']['items'] : array();
    $existingLinks = array();
    foreach ($this->arrData as $tempRow) { $existingLinks[$tempRow['Link']] = true; }
    foreach ($items as $tempItem) {
        if (!isset($tempItem['configurable_variants']['variants'])) continue;
        foreach ($tempItem['configurable_variants']['variants'] as $variant) {
            $variantUrl = 'https://www.harveynorman.com.au/' . $variant['url_key'] . '.html';
            if (isset($existingLinks[$variantUrl])) continue;
            if ($variant['stock_status'] !== 'IN_STOCK') continue;
            $this->arrData[] = array('Title' => $variant['name'], 'Link' => $variantUrl);
            $existingLinks[$variantUrl] = true;
        }
    }
}
$this->requestChk = true;
  1. TABLET_SAMSUNG 1109071 (및 같은 템플릿을 쓰는 harveynorman MOBILE_* 보드들 전수 확인 필요): 1step Script에서 $responseBody 확보 후, <script id="__NEXT_DATA__" type="application/json">(.*?)</script> 로 JSON을 추출해 $next['props']['pageProps']['pageProps']['pageData']['productsData']['items']를 순회. 각 item의 configurable_variants.variants[] 중 이미 HTML Item으로 잡힌 parent sku를 제외한 나머지를 $this->arrData에 Title/Link로 추가 삽입(Link는 "https://www.harveynorman.com.au/" + url_key + ".html").
  2. 기존 Item/Link Title 정규식은 그대로 두고(이미 정상 동작), 위 JSON 보강 로직을 병행 실행해 변형 SKU만 보충하는 방식 권장(기존 19건 깨지 않음).

확인할 점

261014 : 실제 미수집(구조적) - 카테고리 페이지 configurable_variants 변형 SKU가 Item 정규식에 안 잡힘. 수정안은 __NEXT_DATA__ JSON 보강 로직(위 코드) 추가 필요. 2step ProductInfo 스크립트는 그대로 사용 가능(변형 Link도 동일한 상세페이지 구조).

답장 (보내면 AI가 5분 안에 확인)

#54fravega.com완료시트 행 삭제됨(시트에서 확인 불가) · 2026-10-15 08:01

원인:

기본 정보

시트 행54요청자한올이슈Samsung Galaxy Tab S10+ 256GB W 미수집 Samsung Galaxy Tab S10 FE 128GB 미수집 Samsung Galaxy Tab S10 FE 256GB 미수집 Samsung Galaxy Tab S10 FE+ 128GB 미수집 Samsung Galaxy Tab S10 FE+ 256GB 미수집사이트번호보드

근거

  • 10/14 149건 수집, Tab S10+ 256GB 등 가격 정상
  • 로그는 "일반에러"(error_code 350 숫자 경고)지만 수집은 막지 않음
  • 사이트에는 Tab S10+ 256GB 흰색 상품이 확인되지 않음("W" 표기 의미 불명)

수정 방향

  1. 패턴/스크립트 수정 불필요. 다만 2step ProductInfo Script(시나리오 1102351)의 `A non well formed numeric value encountered` 경고(가격 비교 `<=`, 메모리 비교 `>= 32`에서 문자열-숫자 암묵적 변환)는 근본 원인은 아니지만 추후 PHP 상위버전에서 fatal로 격상될 수 있어 개선 권장: `(float)` 캐스팅 추가.

확인할 점

261014 : Tab S10+/FE/FE+ 128·256GB 전부 정상 가격 포함 수집 확인(마켓플레이스 복수 판매자 중복 등록 구조), 오수집 아님 / 패턴변경 불필요. 보고된 "W" 표기 색상(화이트)은 사이트에서 미확인 - 재확인 필요시 구체적 색상/URL 요청

답장 (보내면 AI가 5분 안에 확인)

#52mediamarkt.com.tr완료시트 행 삭제됨(시트에서 확인 불가) · 2026-10-15 08:01

원인:

기본 정보

시트 행52요청자수환이슈Samsung Galaxy Tab S11 128GB 미수집 Samsung Galaxy Tab S11 256GB 미수집사이트번호보드

근거

  • 10/14 로그 정상, 36건 수집. Tab S11 256GB(Gri/Gümüş)·128GB Gümüş 없음
  • 사이트에는 세 상품 모두 판매 중(배송 가능)
  • NextLink가 3페이지(36건)에서 멈춘 것으로 보임. 서버 소스 재현은 못 함(앱 셸만 수신)

수정 방향

  1. TABLET_SAMSUNG 1109019: NextLink Script에서 `loading-test` 카운트 배지 파싱이 실제 총 상품수(36개 초과분, Tab S11 256GB 2종 + 128GB Silver 포함)를 못 받아오고 있을 가능성 높음. 사용자가 직접 페이지를 열어 실제 "N / TOTAL" 표시값과 전체 상품 수를 확인하고, TOTAL이 36보다 큰지 비교 필요.
  2. 같은 사이트의 TABLET_HUAWEI/TABLET_XIAOMI/TABLET_LENOVO/TABLET_APPLE 보드도 동일 NextLink 스크립트를 쓰므로 같은 문제가 있을 수 있음(이번 신고 범위는 SAMSUNG만 확인).

확인할 점

261014 : TABLET_SAMSUNG 보드 Tab S11 256GB(Gri/Gümüş)·128GB Gümüş 미수집 확인, 실제 재고 있는 정상 상품. NextLink 페이징 카운트(loading-test 배지) 파싱이 실제 전체 상품수보다 적게 멈추는 것으로 추정 / 재정의 필요(페이징 로직 점검)

답장 (보내면 AI가 5분 안에 확인)

#53falabella.com완료시트 확인 요청 · 2026-10-14 16:15

원인:

기본 정보

시트 행53요청자한올이슈Samsung Galaxy Tab S10 FE 256GB 미수집 / Tab S10 FE+ 256GB 미수집사이트번호보드

근거

  • 10/13·10/14 로그 정상, 33건 수집(변경 없음)
  • 공식 판매자(samsung) 256GB 상품은 가격 포함 정상 수집됨
  • 미수집 2건은 "Vendido por next core"(리셀러)라 스크립트가 의도적으로 제외(셀러가 samsung일 때만 수집)

확인할 점

필요시 사용자가 신고자(한올)에게 "공식 Samsung 셀러 상품은 정상 수집 중이며, 미수집으로 보인 상품은 가격이 더 비싼 서드파티 리셀러(next core) 중복 리스팅이라 설계상 제외됨"으로 안내 가능.

답장 (보내면 AI가 5분 안에 확인)

#51mxmemoxpress.com완료시트 검토 중 · 2026-10-14 15:40

원인: 오수집 아님. 재고 있는 상품만 수집하는데 해당 변형이 전부 품절이라 0건이 정상

기본 정보

시트 행51요청자정은이슈Samsung Galaxy S26 Ultra 1024GB 미수집사이트번호1100176보드MOBILE_SAMSUNG(1101487)

근거

  • 수집정보검색 상세(d_seq=484075055, 10/13 19:51): ProductInfo에 256GB(4색) + 512GB(1색)만 존재, 1TB(1024GB) 없음
  • 실제 상품페이지(mxmemoxpress.com/product/samsung-galaxy-s26-ultra/) Buy Now 모달에서 Storage 옵션 3개(512GB/1TB/256GB) 확인, 1TB 선택 시 Black/Cobalt Violet/Silver Shadow/Sky Blue/White 5개 색상 전부 "Out of Stock" 표시
  • 엔진 로그(10/13 19:51, MOBILE_SAMSUNG sb_seq=1101487): 1step 요청 URL이 https://mxmemoxpress.com/wp-json/mxm/v1/wc/products?status=publish&stock_status=instock&... 로 재고 있는 상품만 API에서 필터링하는 구조. 상태 "정상", 18건 수집(에러 없음)

확인할 점

제안 처리내역: 261014 : 1024GB 변형 전체 색상 품절 확인, stock_status=instock 필터로 인한 정상 미수집 / 패턴변경 불필요(재입고 시 자동 수집됨)

답장 (보내면 AI가 5분 안에 확인)

#48o2.cz완료시트 검토 중 · 2026-10-14 15:40

원인: 사이트가 eshop.o2.cz로 이전돼 기존 API/구조 사용 불가. 보드 4개 재작성 필요

기본 정보

시트 행48요청자보영이슈정의서 업데이트 (전체 미수집은 재조사 완료됨)사이트번호1100326보드MOBILE_SAMSUNG 1102839 / MOBILE_APPLE 1102840 / MOBILE_XIAOMI 1102843 / MOBILE_HONOR 1103685

수정 위치

MOBILE_SAMSUNG 1102839 / MOBILE_APPLE 1102840 / MOBILE_XIAOMI 1102843 / MOBILE_HONOR 1103685 : 보드 URL 아랫칸, 1step Script(POST 부분), Item/Link/Title 정규식, 링크 후 Script, 2step Script

근거

  • 10/14 4개 보드 수집 0건(10/13까지 정상)
  • www.o2.cz/... 가 eshop.o2.cz/... 로 301 이동
  • 새 사이트: 브랜드 필터 적용, 15개씩 페이징(Samsung 8페이지)

수정 방향

⚠ 재정의 필요: 기존 접속 URL 리다이렉션 (기존 → 이동)
https://www.o2.cz/telefony-a-zarizeni/samsung  ->  https://eshop.o2.cz/collections/samsung
https://www.o2.cz/telefony-a-zarizeni/telefony?sort=RECOMMENDED&f3=samsung&f1=skladem-na-e-shopu  ->  https://eshop.o2.cz/collections/telefony?sort=RECOMMENDED&f3=samsung&f1=skladem-na-e-shopu
수정 전
Item : !"_index":"[^"]+",(.*?)"campaigns"!s
Link : !"image".*?"seoUrl":"([^"]+)",!s
Script: $responseBody = 'http://www.o2.cz/telefony-a-zarizeni/produkt/' . $responseBody;
Title: !"model":"(.*?)",!s!"name":.*?"cs":"(.*?)"!s
수정 후
Item : !(<li class="grid__item">\s*<product-card-o2 class="o2-card-wrapper">.*?</product-card-o2>)!s
Link : !<a\s+href="(/products/[^"?]+)!s
Script: $responseBody = 'https://eshop.o2.cz' . $responseBody;
Title: !o2-card__title-link"\s*>\s*(.*?)\s*</a>!s
  1. 4개 보드 공통: 보드 URL 아랫칸(요청 URL)을 윗칸과 같은 새 컬렉션 URL로 교체 (예 SAMSUNG: https://eshop.o2.cz/collections/telefony?filter.v.availability=1&filter.v.price.gte=&filter.v.price.lte=&filter.p.m.losParameters.Brand=Samsung&sort_by=manual)
  2. 4개 보드 공통: 1step Script에서 `$this->arrCurlOption[CURLOPT_POST] = true;` 줄부터 끝(`CURLOPT_HTTPHEADER` 줄)까지를 아래 "1step 교체 부분"으로 교체. 위쪽 요금제 조회부는 그대로 유지 (POST 바디 2개, Accept: application/json/Origin/X-Forwarded-* 헤더 삭제)
  3. 4개 보드 공통: 1step Item 노드 정규식 교체 -> !(<li class="grid__item">\s*<product-card-o2 class="o2-card-wrapper">.*?</product-card-o2>)!s
  4. 4개 보드 공통: Link 노드 정규식 교체 -> !<a\s+href="(/products/[^"?]+)!s
  5. 4개 보드 공통: 링크 뒤 Script 교체 -> $responseBody = 'https://eshop.o2.cz' . $responseBody;
  6. 4개 보드 공통: Title 노드 정규식 교체 -> !o2-card__title-link"\s*>\s*(.*?)\s*</a>!s (기존 줄 삭제)
  7. 4개 보드 공통: ProductInfo 노드 정규식은 기존 !^(.*?)$!s 그대로 유지
  8. 4개 보드 공통: 2step Script 전체를 아래 "2step 전체 소스"로 교체 (옛 JSON 필드 _id/stockStatus/priceType 대신 상품 페이지 HTML 사용, 품절은 "available":true로 판별)
  9. 4개 보드 공통: 1step 아래에 NextLink 노드 추가 (참고: excelestore.com.bd 시나리오). NextLink 정규식 -> !<a\s+href="([^"]+)"[^>]*aria-label="Další stránka"!s (다음 페이지 화살표 링크, 마지막 페이지에는 없어서 자동 종료)
  10. 4개 보드 공통: NextLink 아래 Script 추가 -> 상대주소를 절대주소로 변환 (아래 "NextLink Script")
  11. 보드 Page 값: 15 이상 유지 (Samsung 8페이지, Apple 5, Xiaomi 3, Honor 2)
전체 소스 보기 (드롭인)
===== 1step 교체 부분 (CURLOPT_POST = true 줄부터 끝까지 이 내용으로) =====
$this->arrCurlOption[CURLOPT_POST] = false;
unset($this->arrCurlOption[CURLOPT_POSTFIELDS]);
$this->arrHeader = array(
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language: cs',
'Referer: https://eshop.o2.cz/',
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36'
);
$this->arrCurlOption[CURLOPT_HTTPHEADER] = $this->arrHeader;

===== 2step 전체 소스 =====
$tempResultData = array();
$tempResultIdx = 0;

// 품절 상품 제외 (상품 페이지의 available 값)
if (preg_match('!"available":\s*true!s', $responseBody)) {

    // 색상: 상품명 마지막 콤마 뒤 (예: Samsung Galaxy S26 Ultra 5G 256GB, fialová)
    if (preg_match('!"title":\s*"[^"]*,\s*([^,"]+)",\s*"image"!s', $responseBody, $tempColor)) {
        $color = trim($tempColor[1]);
    } else {
        $color = "";
    }

    if (preg_match('!"name":"Celková paměť \(GB\)","value":"([^"]+)"!s', $responseBody, $tempMemory)) {
        $memory = $tempMemory[1]."GB";
    } else {
        $memory = "NA";
    }

    if (preg_match('!"name":"Operační paměť RAM \(MB\)","value":"([^"]+)"!s', $responseBody, $tempRam)) {
        $tempRam = $tempRam[1]/1024;
        $ram = $tempRam."GB";
    } else {
        $ram = "NA";
    }

    // 판매가: 코드 할인 적용가(표시가) 우선, 없으면 일반가
    if (preg_match('!data-o2-displayed-price-label="([^"]+)"!s', $responseBody, $tempRPA)) {
        $tempResultData[$tempResultIdx]['Retail_Price_Actual'] = preg_replace('![^0-9]!', '', $tempRPA[1]);
    } else if (preg_match('!"price_at_add":\s*([0-9]+)!s', $responseBody, $tempRPA)) {
        $tempResultData[$tempResultIdx]['Retail_Price_Actual'] = $tempRPA[1] / 100;
    } else {
        $tempResultData[$tempResultIdx]['Retail_Price_Actual'] = "";
    }

    // 월 할부금 (MDA)
    if (preg_match('!installments-o2__monthly">\s*pak\s*<strong>([^<]+)</strong>!s', $responseBody, $tempMDA)) {
        $tempResultData[$tempResultIdx]['Monthly_Device_Actual'] = preg_replace('![^0-9]!', '', $tempMDA[1]);
    } else {
        $tempResultData[$tempResultIdx]['Monthly_Device_Actual'] = "0";
    }

    // 선납금 (Upfront)
    if (preg_match('!installments-o2__pay-now">\s*Teď zaplatíte\s*<strong>([^<]+)</strong>!s', $responseBody, $tempUA)) {
        $tempResultData[$tempResultIdx]['Upfront_Actual'] = preg_replace('![^0-9]!', '', $tempUA[1]);
    } else {
        $tempResultData[$tempResultIdx]['Upfront_Actual'] = "0";
    }

    $tempResultData[$tempResultIdx]['Plan_Name'] = $this->arrDefaultSet['CRAWLER']['TEMP']['PN'];
    $tempResultData[$tempResultIdx]['Tariff_Actual'] = $this->arrDefaultSet['CRAWLER']['TEMP']['TA'];
    $tempResultData[$tempResultIdx]['Memory'] = $memory . "/" . $ram;
    $tempResultData[$tempResultIdx]['Url'] = $this->arrData[$listNumber]['Link'] . "#" . $color . "#" . $memory;
    $tempResultIdx += 1;
}

if (sizeof($tempResultData) > 0) {
    $responseBody = $tempResultData;
} else {
    $responseBody = "";
}

===== NextLink Script (NextLink 노드 아래 Script) =====
if ($responseBody != "") {
    $responseBody = 'https://eshop.o2.cz' . str_replace('&amp;', '&', $responseBody);
}

테스트 결과

  • 로컬 검증(새 사이트 직접 요청, 엔진 프리뷰 전): Samsung 8페이지 Item 119건/중복 0, Link/Title 전부 매칭
  • 2step 로직 검증: Xiaomi 38 + Honor 17 상품 상세 55건 파싱 -> 가격/용량/RAM/색상 전부 추출, 할부 없는 저가 모델 6건은 MDA/Upfront 0 (기존 기본값과 동일)
  • 예) Galaxy S26 Ultra 256GB 보라: RPA 34589(코드할인가), MDA 559, Upfront 17689, 256GB/12GB, 색상 fialová
  • NextLink 정규식 검증: Samsung 1~7페이지에서 다음 페이지 링크(&page=N+1) 추출, 8페이지(마지막)는 매칭 없음 -> 종료
  • 미검증: 엔진 프리뷰(NextLink가 $responseBody로 목록 HTML을 받는지, 페이지 반복 동작), 서버 소스(PREG_TEST)와의 차이

확인할 점

제안 처리내역: 261014 : 사이트 이전(eshop.o2.cz) - 1step(GET 방식)/Item/Link/Title/2step 재작성 + NextLink 페이징 추가 (4개 보드 공통) [확인 필요 1 - 페이징] excelestore.com.bd 방식(NextLink)을 참고해 다음 페이지 화살표 링크를 따라가도록 작성. 엔진 프리뷰로 8페이지(Samsung 119개)까지 도는지 확인 필요. [확인 필요 2 - 검증 범위] 엔진 프리뷰/PREG_TEST 서버 소스 검증 전. 로컬(내 PC)에서 새 사이트를 직접 받아 검증한 결과만 있음. [확인 필요 3 - 보드 URL] 실제 접속 URL은 아랫칸(sb_url). 윗칸(sb_confirm_url)만 새 주소로 바뀌어 있고 아랫칸은 옛 API 주소이므로 아랫칸을 새 컬렉션 URL로 교체.

답장 (보내면 AI가 5분 안에 확인)

#48o2.cz완료시트 검토 중 · 2026-10-14 15:40

원인: 사이트가 eshop.o2.cz로 이전돼 기존 API/구조 사용 불가. 보드 4개 재작성 필요

기본 정보

시트 행48요청자보영이슈수집원 URL 변경 (eshop.o2.cz로 재정의 요청, item 3)사이트번호1100326보드MOBILE_SAMSUNG 1102839 / MOBILE_APPLE 1102840 / MOBILE_XIAOMI 1102843 / MOBILE_HONOR 1103685

수정 위치

MOBILE_SAMSUNG 1102839 / MOBILE_APPLE 1102840 / MOBILE_XIAOMI 1102843 / MOBILE_HONOR 1103685 : 보드 URL 아랫칸, 1step Script(POST 부분), Item/Link/Title 정규식, 링크 후 Script, 2step Script

근거

  • 10/14 4개 보드 수집 0건(10/13까지 정상)
  • www.o2.cz/... 가 eshop.o2.cz/... 로 301 이동
  • 새 사이트: 브랜드 필터 적용, 15개씩 페이징(Samsung 8페이지)

수정 방향

⚠ 재정의 필요: 기존 접속 URL 리다이렉션 (기존 → 이동)
https://www.o2.cz/telefony-a-zarizeni/samsung  ->  https://eshop.o2.cz/collections/samsung
https://www.o2.cz/telefony-a-zarizeni/telefony?sort=RECOMMENDED&f3=samsung&f1=skladem-na-e-shopu  ->  https://eshop.o2.cz/collections/telefony?sort=RECOMMENDED&f3=samsung&f1=skladem-na-e-shopu
수정 전
Item : !"_index":"[^"]+",(.*?)"campaigns"!s
Link : !"image".*?"seoUrl":"([^"]+)",!s
Script: $responseBody = 'http://www.o2.cz/telefony-a-zarizeni/produkt/' . $responseBody;
Title: !"model":"(.*?)",!s!"name":.*?"cs":"(.*?)"!s
수정 후
Item : !(<li class="grid__item">\s*<product-card-o2 class="o2-card-wrapper">.*?</product-card-o2>)!s
Link : !<a\s+href="(/products/[^"?]+)!s
Script: $responseBody = 'https://eshop.o2.cz' . $responseBody;
Title: !o2-card__title-link"\s*>\s*(.*?)\s*</a>!s
  1. 4개 보드 공통: 보드 URL 아랫칸(요청 URL)을 윗칸과 같은 새 컬렉션 URL로 교체 (예 SAMSUNG: https://eshop.o2.cz/collections/telefony?filter.v.availability=1&filter.v.price.gte=&filter.v.price.lte=&filter.p.m.losParameters.Brand=Samsung&sort_by=manual)
  2. 4개 보드 공통: 1step Script에서 `$this->arrCurlOption[CURLOPT_POST] = true;` 줄부터 끝(`CURLOPT_HTTPHEADER` 줄)까지를 아래 "1step 교체 부분"으로 교체. 위쪽 요금제 조회부는 그대로 유지 (POST 바디 2개, Accept: application/json/Origin/X-Forwarded-* 헤더 삭제)
  3. 4개 보드 공통: 1step Item 노드 정규식 교체 -> !(<li class="grid__item">\s*<product-card-o2 class="o2-card-wrapper">.*?</product-card-o2>)!s
  4. 4개 보드 공통: Link 노드 정규식 교체 -> !<a\s+href="(/products/[^"?]+)!s
  5. 4개 보드 공통: 링크 뒤 Script 교체 -> $responseBody = 'https://eshop.o2.cz' . $responseBody;
  6. 4개 보드 공통: Title 노드 정규식 교체 -> !o2-card__title-link"\s*>\s*(.*?)\s*</a>!s (기존 줄 삭제)
  7. 4개 보드 공통: ProductInfo 노드 정규식은 기존 !^(.*?)$!s 그대로 유지
  8. 4개 보드 공통: 2step Script 전체를 아래 "2step 전체 소스"로 교체 (옛 JSON 필드 _id/stockStatus/priceType 대신 상품 페이지 HTML 사용, 품절은 "available":true로 판별)
  9. 4개 보드 공통: 1step 아래에 NextLink 노드 추가 (참고: excelestore.com.bd 시나리오). NextLink 정규식 -> !<a\s+href="([^"]+)"[^>]*aria-label="Další stránka"!s (다음 페이지 화살표 링크, 마지막 페이지에는 없어서 자동 종료)
  10. 4개 보드 공통: NextLink 아래 Script 추가 -> 상대주소를 절대주소로 변환 (아래 "NextLink Script")
  11. 보드 Page 값: 15 이상 유지 (Samsung 8페이지, Apple 5, Xiaomi 3, Honor 2)
전체 소스 보기 (드롭인)
===== 1step 교체 부분 (CURLOPT_POST = true 줄부터 끝까지 이 내용으로) =====
$this->arrCurlOption[CURLOPT_POST] = false;
unset($this->arrCurlOption[CURLOPT_POSTFIELDS]);
$this->arrHeader = array(
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language: cs',
'Referer: https://eshop.o2.cz/',
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36'
);
$this->arrCurlOption[CURLOPT_HTTPHEADER] = $this->arrHeader;

===== 2step 전체 소스 =====
$tempResultData = array();
$tempResultIdx = 0;

// 품절 상품 제외 (상품 페이지의 available 값)
if (preg_match('!"available":\s*true!s', $responseBody)) {

    // 색상: 상품명 마지막 콤마 뒤 (예: Samsung Galaxy S26 Ultra 5G 256GB, fialová)
    if (preg_match('!"title":\s*"[^"]*,\s*([^,"]+)",\s*"image"!s', $responseBody, $tempColor)) {
        $color = trim($tempColor[1]);
    } else {
        $color = "";
    }

    if (preg_match('!"name":"Celková paměť \(GB\)","value":"([^"]+)"!s', $responseBody, $tempMemory)) {
        $memory = $tempMemory[1]."GB";
    } else {
        $memory = "NA";
    }

    if (preg_match('!"name":"Operační paměť RAM \(MB\)","value":"([^"]+)"!s', $responseBody, $tempRam)) {
        $tempRam = $tempRam[1]/1024;
        $ram = $tempRam."GB";
    } else {
        $ram = "NA";
    }

    // 판매가: 코드 할인 적용가(표시가) 우선, 없으면 일반가
    if (preg_match('!data-o2-displayed-price-label="([^"]+)"!s', $responseBody, $tempRPA)) {
        $tempResultData[$tempResultIdx]['Retail_Price_Actual'] = preg_replace('![^0-9]!', '', $tempRPA[1]);
    } else if (preg_match('!"price_at_add":\s*([0-9]+)!s', $responseBody, $tempRPA)) {
        $tempResultData[$tempResultIdx]['Retail_Price_Actual'] = $tempRPA[1] / 100;
    } else {
        $tempResultData[$tempResultIdx]['Retail_Price_Actual'] = "";
    }

    // 월 할부금 (MDA)
    if (preg_match('!installments-o2__monthly">\s*pak\s*<strong>([^<]+)</strong>!s', $responseBody, $tempMDA)) {
        $tempResultData[$tempResultIdx]['Monthly_Device_Actual'] = preg_replace('![^0-9]!', '', $tempMDA[1]);
    } else {
        $tempResultData[$tempResultIdx]['Monthly_Device_Actual'] = "0";
    }

    // 선납금 (Upfront)
    if (preg_match('!installments-o2__pay-now">\s*Teď zaplatíte\s*<strong>([^<]+)</strong>!s', $responseBody, $tempUA)) {
        $tempResultData[$tempResultIdx]['Upfront_Actual'] = preg_replace('![^0-9]!', '', $tempUA[1]);
    } else {
        $tempResultData[$tempResultIdx]['Upfront_Actual'] = "0";
    }

    $tempResultData[$tempResultIdx]['Plan_Name'] = $this->arrDefaultSet['CRAWLER']['TEMP']['PN'];
    $tempResultData[$tempResultIdx]['Tariff_Actual'] = $this->arrDefaultSet['CRAWLER']['TEMP']['TA'];
    $tempResultData[$tempResultIdx]['Memory'] = $memory . "/" . $ram;
    $tempResultData[$tempResultIdx]['Url'] = $this->arrData[$listNumber]['Link'] . "#" . $color . "#" . $memory;
    $tempResultIdx += 1;
}

if (sizeof($tempResultData) > 0) {
    $responseBody = $tempResultData;
} else {
    $responseBody = "";
}

===== NextLink Script (NextLink 노드 아래 Script) =====
if ($responseBody != "") {
    $responseBody = 'https://eshop.o2.cz' . str_replace('&amp;', '&', $responseBody);
}

테스트 결과

  • 로컬 검증(새 사이트 직접 요청, 엔진 프리뷰 전): Samsung 8페이지 Item 119건/중복 0, Link/Title 전부 매칭
  • 2step 로직 검증: Xiaomi 38 + Honor 17 상품 상세 55건 파싱 -> 가격/용량/RAM/색상 전부 추출, 할부 없는 저가 모델 6건은 MDA/Upfront 0 (기존 기본값과 동일)
  • 예) Galaxy S26 Ultra 256GB 보라: RPA 34589(코드할인가), MDA 559, Upfront 17689, 256GB/12GB, 색상 fialová
  • NextLink 정규식 검증: Samsung 1~7페이지에서 다음 페이지 링크(&page=N+1) 추출, 8페이지(마지막)는 매칭 없음 -> 종료
  • 미검증: 엔진 프리뷰(NextLink가 $responseBody로 목록 HTML을 받는지, 페이지 반복 동작), 서버 소스(PREG_TEST)와의 차이

확인할 점

제안 처리내역: 261014 : 사이트 이전(eshop.o2.cz) - 1step(GET 방식)/Item/Link/Title/2step 재작성 + NextLink 페이징 추가 (4개 보드 공통) [확인 필요 1 - 페이징] excelestore.com.bd 방식(NextLink)을 참고해 다음 페이지 화살표 링크를 따라가도록 작성. 엔진 프리뷰로 8페이지(Samsung 119개)까지 도는지 확인 필요. [확인 필요 2 - 검증 범위] 엔진 프리뷰/PREG_TEST 서버 소스 검증 전. 로컬(내 PC)에서 새 사이트를 직접 받아 검증한 결과만 있음. [확인 필요 3 - 보드 URL] 실제 접속 URL은 아랫칸(sb_url). 윗칸(sb_confirm_url)만 새 주소로 바뀌어 있고 아랫칸은 옛 API 주소이므로 아랫칸을 새 컬렉션 URL로 교체.

답장 (보내면 AI가 5분 안에 확인)

#52bestbuy.ca완료시트 행 삭제됨(시트에서 확인 불가) · 2026-10-14 14:41

원인:

기본 정보

시트 행52요청자수환이슈Samsung Galaxy Tab S11 128/256/512GB 미수집사이트번호보드

근거

  • 엔진 수집정보검색(site 1100510, board 1108941 TABLET_SAMSUNG) 10/13·10/14 결과에 Tab S11 11-inch 128/256/512GB(Grey/Silver) 전부 Retail_Price_Actual 포함 확인(예: 128GB Grey $1399.99).

확인할 점

261014 : 재확인 결과 Tab S11 128/256/512GB 전부 오늘(10/14)·어제(10/13) 모두 정상 수집됨(가격 포함). 미수집 아님, 오보고로 판단.

답장 (보내면 AI가 5분 안에 확인)

#51interdiscount.ch완료시트 행 삭제됨(시트에서 확인 불가) · 2026-10-14 14:41

원인:

기본 정보

시트 행51요청자수환이슈Samsung Galaxy Tab S11 128/256/512GB, Tab S11 Ultra 256/512GB 미수집사이트번호보드

근거

  • 엔진 수집정보검색(site 1100450, board 1109013 TABLET_SAMSUNG) 10/13·10/14 결과에 Tab S11 Wi-Fi 128/256/512GB, Tab S11 Ultra 256/512GB 전부 Retail_Price_Actual 포함 확인(예: Tab S11 128GB Silber 649.95CHF). API(interdiscount.ch/api/v1/search/products, brand=SAMSUNG)에서도 92개 상품 중 S11/S11 Ultra 전 용량 확인됨.

확인할 점

261014 : 재확인 결과 Tab S11 128/256/512GB, Tab S11 Ultra 256/512GB 전부 오늘(10/14)·어제(10/13) 모두 정상 수집됨(가격 포함). 미수집 아님, 오보고로 판단.

답장 (보내면 AI가 5분 안에 확인)

#50samsung.com/in(trade_in)완료시트 검토 중 · 2026-10-14 14:12

원인: 재고 루프가 첫 코드에서 break해 변형 1개만 수집

기본 정보

시트 행50요청자현규이슈일부 가격 미수집(TABLET_ALL_S10 FE+)사이트번호보드

수정 위치

1step Script (유일한 노드, PHP 전체)

근거

  • engine 사이트 1100527/보드 1107961(TABLET_ALL_S10 FE+) 스크립트: $allModelCodes를 순회하며 getTradeInSimpleInfo 성공 시 $productCode=$checkCode; break; 로 가장 먼저 성공한 코드 1개만 저장
  • https://www.samsung.com/in/tablets/galaxy-tab-s10-fe/buy/?modelCode=SM-X520NLBEINS 페이지에서 PN="Galaxy Tab S10 FE+" 매칭 -> familyPrefix "SM-X62"(X620/X626 공용) -> 후보 코드 25개
  • getTradeInSimpleInfo로 25개 코드 직접 호출 결과: X620NZAE, X620NZSE, X626BLBA, X626BZAA, X626BZAE 5개가 유효(트레이드인 서비스 존재), 나머지는 UnknownIdentifierError(미존재 SKU)
  • 어제(10/13) 수집 로그(log/logTaskData.php, s_seq=1100527,sb_seq=1107961): 정상, 수집건수=1건, 소요 676초 -> 5개 유효 변형 중 1개만 수집된 것과 일치

수정 방향

수정 전
$stockFlag = 0; ... foreach ($allModelCodes as $checkCode) { ...; if (...유효...) { $stockFlag = 1; $productCode = $checkCode; break; } sleep(1); } if ($stockFlag == 1) { ...단일 $productCode로 offers~trade-in까지 1회만 처리... }
수정 후
$validProductCodes = array(); foreach ($allModelCodes as $checkCode) { ...; if (...유효...) { $validProductCodes[] = $checkCode; } sleep(1); } foreach ($validProductCodes as $productCode) { ...offers~trade-in 처리(기존과 동일 로직)를 코드마다 반복... }
  1. TABLET_ALL_S10 FE+ 1107961 (1step Script): 재고확인 foreach 루프에서 break 제거, 유효 코드를 $validProductCodes 배열에 전부 모은 뒤, 이후 offers/brands/products/variants/trade-in 처리 블록 전체를 $validProductCodes로 foreach 하도록 변경(단일 $productCode 변수 대신 루프 변수로 사용)

확인할 점

261014 : 1step 재고확인 루프 break 제거(유효 변형 전부 수집하도록 수정) / 정의서 변경 불필요(요건은 FE+ 전체 변형 수집, 코드만 1개로 제한되던 버그)

답장 (보내면 AI가 5분 안에 확인)

#49alza.cz완료시트 검토 중 · 2026-10-14 14:12

원인: NextLink 정규식이 "다음" 버튼의 aria-label 추가로 불일치해 1페이지만 수집

기본 정보

시트 행49요청자나래이슈Samsung Galaxy Z Fold8 256/512/1024GB, Z Fold8 Ultra 256/512/1024GB 미수집사이트번호보드

수정 위치

1step NextLink 노드(정규식)

근거

  • 10/14 MOBILE_SAMSUNG 24건만 수집, 에러 "예약어처리 에러(NextLink)"
  • "다음" 링크에 aria-label 속성이 추가돼 NextLink 정규식 불일치 -> 1페이지에서 멈춤
  • 사이트 직접 호출: Fold8은 2~5페이지에 있어 전부 미수집

수정 방향

수정 전
!class=\"next fa[^>]+id=\"pgby([0-9]+)\">!s
수정 후
!class=\"next fa[^>]+id=\"pgby([0-9]+)\"[^>]*>!s
  1. MOBILE_SAMSUNG 1101241 (1step NextLink): 정규식을 `!class=\"next fa[^>]+id=\"pgby([0-9]+)\">!s` -> `!class=\"next fa[^>]+id=\"pgby([0-9]+)\"[^>]*>!s` 로 교체(id 속성과 닫는 `>` 사이에 다른 속성이 더 있어도 매칭되도록 관용)
  2. 같은 사이트의 TWS_SAMSUNG(1108560)/WATCH_SAMSUNG(1102236)/TABLET_SAMSUNG(1102230) 등 같은 NextLink 패턴을 쓰는 다른 보드도 동일 증상일 가능성 높음 - 전수 확인 필요(이번엔 신고된 MOBILE_SAMSUNG만 확정 확인)

확인할 점

261014 : NextLink 정규식에 aria-label 속성 허용(관용 패턴)으로 수정 필요 / Alza가 "다음" 버튼에 aria-label 속성 추가하면서 페이지네이션이 1페이지에서 멈춤 -> Z Fold8 등 2페이지 이후 상품 전체 미수집. 정의서 변경 불필요.

답장 (보내면 AI가 5분 안에 확인)

#39backmarket.co.uk(Refur)완료시트 검토 중 · 2026-10-14 14:01

원인: 261013 : 봇 챌린지/프록시 간헐 실패 반복, 구조변경 없음 / 재수집시 정상화

기본 정보

시트 행39요청자현규이슈전체 가격 미수집사이트번호1100604보드MOBILE_SAMSUNG(1104779)/MOBILE_APPLE(1104780)

근거

  • 로그 비교(10/08~10/14, 7일): MOBILE_SAMSUNG 정상/치명적에러 혼재(10/08 69건, 10/09 69건, 10/12 71건 성공 vs 10/10,10/11,10/13,10/14 치명적에러 0건). MOBILE_APPLE은 대부분 19건 정상, 간헐적으로 치명적에러(10/08, 10/13, 10/14 1회씩).
  • 이전 세션(2026-10-13 13:20) 조사: 봇 챌린지(/testchallengepage) 통과 전 payload를 읽다가 실패하는 간헐 실패로 판정. 실제 상품페이지는 정상 로드되고 payload·pickers API도 정상 확인됨(구조변경 아님).
  • 이번 재조사(2026-10-14 11:20): 같은 패턴 재현(오늘 SAMSUNG 4회 모두 치명적에러, APPLE 1회 정상 19건). 시트에서 '검토 중'→'검토 요청'으로 다시 돌아온 것으로 보아 재발 이슈지만 원인은 동일.

확인할 점

261014 : 봇 챌린지/프록시 간헐 실패 재발(패턴 동일), 구조변경 없음. 개선안: #__nuxt waitForFunction으로 챌린지 통과 대기 추가 권장. 재수집시 정상화 가능성 높음.

답장 (보내면 AI가 5분 안에 확인)

#54apple.com/au(trade_in)완료시트 검토 중 · 2026-10-14 11:32

원인: 질문이 4개로 줄어 Plan B URL이 깨짐, B가 A와 같은 가격으로 수집됨

기본 정보

시트 행54요청자보영이슈pn b항목 가격 오수집(a항목 가격 수집되고 있음)사이트번호1100289보드MOBILE_APPLE 1102672

수정 위치

1step Script > foreach($tempResultIdxArr) > $planIdx == 1 (Plan_Name "B") 분기 > $nextUrl2 파라미터

근거

  • Plan B URL이 파라미터 5개를 쓰지만 응답에는 4개뿐 -> `&=2`로 깨짐
  • 재현: B가 A와 같은 가격(iPhone 16 128GB $675), 4개로 쓰면 $200
  • 10/13 수집분은 34건 모두 A==B (수정 전)

수정 방향

수정 전
                $nextUrl2 = $nextUrl . "&" . $paramArr[0] . "=2&" . $paramArr[1] . "=1&" . $paramArr[2] . "=1&" . $paramArr[3] . "=1&" . $paramArr[4] . "=2";
                $nextUrl2 = str_replace('module=verify', 'module=questions', $nextUrl2);
                $planName = "B";
수정 후
                $nextUrl2 = $nextUrl . "&" . $paramArr[0] . "=2&" . $paramArr[1] . "=1&" . $paramArr[2] . "=1&" . $paramArr[3] . "=2";
                $nextUrl2 = str_replace('module=verify', 'module=questions', $nextUrl2);
                $planName = "B";
  1. MOBILE_APPLE 1102672: 1step Script의 Plan B 분기($planIdx == 1)에서 $nextUrl2 조립 시 5번째 파라미터 `&$paramArr[3]=1&$paramArr[4]=2` 부분을 제거하고 4번째를 `$paramArr[3]=2`로 교체 (파라미터 5개 -> 4개)
  2. 이유: 현재 tradein-module 응답에 keyPrefix/key 조합이 4개뿐이라 $paramArr[4]가 비어 `&=2`가 붙고, 그 결과 B가 A와 같은 가격으로 수집됨
  3. 적용 상태(10/14 재확인): 엔진 스크립트에 이미 반영됨(4파라미터 줄 적용, 5파라미터 줄은 // 주석 처리, 끝에 & 하나 더 붙음). 추가 수정 없음
  4. 남은 확인: 10/14 이후 수집분에서 Plan B 가격이 A와 다른지 확인 (10/13 17:52 수집분은 수정 전이라 34건 모두 A==B)

수정 후 재확인

해결됨 · 조건: MOBILE_APPLE(1102672)에서 Plan B 가격이 A와 다른 상품이 있음
결과: 오늘 수집 194건 중 A와 B 가격이 다른 건 194건 (2026-10-15 19:08)

테스트 결과

  • 10/13 17:52 수집분은 MOBILE_APPLE 1페이지 34건 모두 A==B (버그 상태)
  • 현재 엔진 스크립트: B 분기가 이미 4파라미터로 수정됨(끝에 & 하나 더 붙음), 5파라미터 줄은 주석 처리됨
  • 10/14 오늘 수집분은 아직 없음 -> 다음 수집 후 A!=B 확인 필요

확인할 점

261014 : Apple tradein 질문흐름 변경(5문항→4문항)으로 Plan B 파라미터 수 불일치, B가 A와 동일 가격으로 오수집됨 - 패턴변경(B URL을 4파라미터로 수정) / 재정의 불필요

답장 (보내면 AI가 5분 안에 확인)

#51o2.cz완료시트 확인 요청 · 2026-10-14 11:32

원인: 사이트가 eshop.o2.cz로 이전돼 기존 API/구조 사용 불가. 보드 4개 재작성 필요

기본 정보

시트 행51요청자보영이슈전체 미수집사이트번호1100326보드MOBILE_SAMSUNG 1102839 / MOBILE_APPLE 1102840 / MOBILE_XIAOMI 1102843 / MOBILE_HONOR 1103685

수정 위치

MOBILE_SAMSUNG 1102839 / MOBILE_APPLE 1102840 / MOBILE_XIAOMI 1102843 / MOBILE_HONOR 1103685 : 보드 URL 아랫칸, 1step Script(POST 부분), Item/Link/Title 정규식, 링크 후 Script, 2step Script

근거

  • 10/14 4개 보드 수집 0건(10/13까지 정상)
  • www.o2.cz/... 가 eshop.o2.cz/... 로 301 이동
  • 새 사이트: 브랜드 필터 적용, 15개씩 페이징(Samsung 8페이지)

수정 방향

⚠ 재정의 필요: 기존 접속 URL 리다이렉션 (기존 → 이동)
https://www.o2.cz/telefony-a-zarizeni/samsung  ->  https://eshop.o2.cz/collections/samsung
https://www.o2.cz/telefony-a-zarizeni/telefony?sort=RECOMMENDED&f3=samsung&f1=skladem-na-e-shopu  ->  https://eshop.o2.cz/collections/telefony?sort=RECOMMENDED&f3=samsung&f1=skladem-na-e-shopu
수정 전
Item : !"_index":"[^"]+",(.*?)"campaigns"!s
Link : !"image".*?"seoUrl":"([^"]+)",!s
Script: $responseBody = 'http://www.o2.cz/telefony-a-zarizeni/produkt/' . $responseBody;
Title: !"model":"(.*?)",!s!"name":.*?"cs":"(.*?)"!s
수정 후
Item : !(<li class="grid__item">\s*<product-card-o2 class="o2-card-wrapper">.*?</product-card-o2>)!s
Link : !<a\s+href="(/products/[^"?]+)!s
Script: $responseBody = 'https://eshop.o2.cz' . $responseBody;
Title: !o2-card__title-link"\s*>\s*(.*?)\s*</a>!s
  1. 4개 보드 공통: 보드 URL 아랫칸(요청 URL)을 윗칸과 같은 새 컬렉션 URL로 교체 (예 SAMSUNG: https://eshop.o2.cz/collections/telefony?filter.v.availability=1&filter.v.price.gte=&filter.v.price.lte=&filter.p.m.losParameters.Brand=Samsung&sort_by=manual)
  2. 4개 보드 공통: 1step Script에서 `$this->arrCurlOption[CURLOPT_POST] = true;` 줄부터 끝(`CURLOPT_HTTPHEADER` 줄)까지를 아래 "1step 교체 부분"으로 교체. 위쪽 요금제 조회부는 그대로 유지 (POST 바디 2개, Accept: application/json/Origin/X-Forwarded-* 헤더 삭제)
  3. 4개 보드 공통: 1step Item 노드 정규식 교체 -> !(<li class="grid__item">\s*<product-card-o2 class="o2-card-wrapper">.*?</product-card-o2>)!s
  4. 4개 보드 공통: Link 노드 정규식 교체 -> !<a\s+href="(/products/[^"?]+)!s
  5. 4개 보드 공통: 링크 뒤 Script 교체 -> $responseBody = 'https://eshop.o2.cz' . $responseBody;
  6. 4개 보드 공통: Title 노드 정규식 교체 -> !o2-card__title-link"\s*>\s*(.*?)\s*</a>!s (기존 줄 삭제)
  7. 4개 보드 공통: ProductInfo 노드 정규식은 기존 !^(.*?)$!s 그대로 유지
  8. 4개 보드 공통: 2step Script 전체를 아래 "2step 전체 소스"로 교체 (옛 JSON 필드 _id/stockStatus/priceType 대신 상품 페이지 HTML 사용, 품절은 "available":true로 판별)
  9. 4개 보드 공통: 1step 아래에 NextLink 노드 추가 (참고: excelestore.com.bd 시나리오). NextLink 정규식 -> !<a\s+href="([^"]+)"[^>]*aria-label="Další stránka"!s (다음 페이지 화살표 링크, 마지막 페이지에는 없어서 자동 종료)
  10. 4개 보드 공통: NextLink 아래 Script 추가 -> 상대주소를 절대주소로 변환 (아래 "NextLink Script")
  11. 보드 Page 값: 15 이상 유지 (Samsung 8페이지, Apple 5, Xiaomi 3, Honor 2)
전체 소스 보기 (드롭인)
===== 1step 교체 부분 (CURLOPT_POST = true 줄부터 끝까지 이 내용으로) =====
$this->arrCurlOption[CURLOPT_POST] = false;
unset($this->arrCurlOption[CURLOPT_POSTFIELDS]);
$this->arrHeader = array(
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language: cs',
'Referer: https://eshop.o2.cz/',
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36'
);
$this->arrCurlOption[CURLOPT_HTTPHEADER] = $this->arrHeader;

===== 2step 전체 소스 =====
$tempResultData = array();
$tempResultIdx = 0;

// 품절 상품 제외 (상품 페이지의 available 값)
if (preg_match('!"available":\s*true!s', $responseBody)) {

    // 색상: 상품명 마지막 콤마 뒤 (예: Samsung Galaxy S26 Ultra 5G 256GB, fialová)
    if (preg_match('!"title":\s*"[^"]*,\s*([^,"]+)",\s*"image"!s', $responseBody, $tempColor)) {
        $color = trim($tempColor[1]);
    } else {
        $color = "";
    }

    if (preg_match('!"name":"Celková paměť \(GB\)","value":"([^"]+)"!s', $responseBody, $tempMemory)) {
        $memory = $tempMemory[1]."GB";
    } else {
        $memory = "NA";
    }

    if (preg_match('!"name":"Operační paměť RAM \(MB\)","value":"([^"]+)"!s', $responseBody, $tempRam)) {
        $tempRam = $tempRam[1]/1024;
        $ram = $tempRam."GB";
    } else {
        $ram = "NA";
    }

    // 판매가: 코드 할인 적용가(표시가) 우선, 없으면 일반가
    if (preg_match('!data-o2-displayed-price-label="([^"]+)"!s', $responseBody, $tempRPA)) {
        $tempResultData[$tempResultIdx]['Retail_Price_Actual'] = preg_replace('![^0-9]!', '', $tempRPA[1]);
    } else if (preg_match('!"price_at_add":\s*([0-9]+)!s', $responseBody, $tempRPA)) {
        $tempResultData[$tempResultIdx]['Retail_Price_Actual'] = $tempRPA[1] / 100;
    } else {
        $tempResultData[$tempResultIdx]['Retail_Price_Actual'] = "";
    }

    // 월 할부금 (MDA)
    if (preg_match('!installments-o2__monthly">\s*pak\s*<strong>([^<]+)</strong>!s', $responseBody, $tempMDA)) {
        $tempResultData[$tempResultIdx]['Monthly_Device_Actual'] = preg_replace('![^0-9]!', '', $tempMDA[1]);
    } else {
        $tempResultData[$tempResultIdx]['Monthly_Device_Actual'] = "0";
    }

    // 선납금 (Upfront)
    if (preg_match('!installments-o2__pay-now">\s*Teď zaplatíte\s*<strong>([^<]+)</strong>!s', $responseBody, $tempUA)) {
        $tempResultData[$tempResultIdx]['Upfront_Actual'] = preg_replace('![^0-9]!', '', $tempUA[1]);
    } else {
        $tempResultData[$tempResultIdx]['Upfront_Actual'] = "0";
    }

    $tempResultData[$tempResultIdx]['Plan_Name'] = $this->arrDefaultSet['CRAWLER']['TEMP']['PN'];
    $tempResultData[$tempResultIdx]['Tariff_Actual'] = $this->arrDefaultSet['CRAWLER']['TEMP']['TA'];
    $tempResultData[$tempResultIdx]['Memory'] = $memory . "/" . $ram;
    $tempResultData[$tempResultIdx]['Url'] = $this->arrData[$listNumber]['Link'] . "#" . $color . "#" . $memory;
    $tempResultIdx += 1;
}

if (sizeof($tempResultData) > 0) {
    $responseBody = $tempResultData;
} else {
    $responseBody = "";
}

===== NextLink Script (NextLink 노드 아래 Script) =====
if ($responseBody != "") {
    $responseBody = 'https://eshop.o2.cz' . str_replace('&amp;', '&', $responseBody);
}

테스트 결과

  • 로컬 검증(새 사이트 직접 요청, 엔진 프리뷰 전): Samsung 8페이지 Item 119건/중복 0, Link/Title 전부 매칭
  • 2step 로직 검증: Xiaomi 38 + Honor 17 상품 상세 55건 파싱 -> 가격/용량/RAM/색상 전부 추출, 할부 없는 저가 모델 6건은 MDA/Upfront 0 (기존 기본값과 동일)
  • 예) Galaxy S26 Ultra 256GB 보라: RPA 34589(코드할인가), MDA 559, Upfront 17689, 256GB/12GB, 색상 fialová
  • NextLink 정규식 검증: Samsung 1~7페이지에서 다음 페이지 링크(&page=N+1) 추출, 8페이지(마지막)는 매칭 없음 -> 종료
  • 미검증: 엔진 프리뷰(NextLink가 $responseBody로 목록 HTML을 받는지, 페이지 반복 동작), 서버 소스(PREG_TEST)와의 차이

확인할 점

제안 처리내역: 261014 : 사이트 이전(eshop.o2.cz) - 1step(GET 방식)/Item/Link/Title/2step 재작성 + NextLink 페이징 추가 (4개 보드 공통) [확인 필요 1 - 페이징] excelestore.com.bd 방식(NextLink)을 참고해 다음 페이지 화살표 링크를 따라가도록 작성. 엔진 프리뷰로 8페이지(Samsung 119개)까지 도는지 확인 필요. [확인 필요 2 - 검증 범위] 엔진 프리뷰/PREG_TEST 서버 소스 검증 전. 로컬(내 PC)에서 새 사이트를 직접 받아 검증한 결과만 있음. [확인 필요 3 - 보드 URL] 실제 접속 URL은 아랫칸(sb_url). 윗칸(sb_confirm_url)만 새 주소로 바뀌어 있고 아랫칸은 옛 API 주소이므로 아랫칸을 새 컬렉션 URL로 교체.

답장 (보내면 AI가 5분 안에 확인)

#49samsung.com/pt(trade_in)완료시트 검토 중 · 2026-10-14 10:41

원인: 미수집 아님. 해당 모델은 트레이드인 서비스 미지원이라 0건이 정상

기본 정보

시트 행49요청자?이슈일부 미수집(TABLET_ALL_S10 FE+)사이트번호1100545보드TABLET_ALL_S10 FE+(1107969)

근거

  • 보드 URL: https://www.samsung.com/pt/tablets/galaxy-tab-s10-fe/buy/?modelCode=SM-X520NZAREUB
  • shop.samsung.com/pt/servicesv2/getSimpleProductsInfo?productCodes=SM-X520NZAREUB 응답: stockLevelStatus=inStock, salesStatus=ON_SALE, supportedAvailableServices=["BENEFIT","ACCESSORIES"] (TRADE_IN 없음)
  • 수집로그: 10/13·10/14 모두 "정상" 상태로 0건(에러 아님, 실제로 trade-in 미제공이라 Item 자체가 없는 것으로 추정)

확인할 점

제안 처리내역: 261014 : 재고는 있으나 trade-in 서비스 미지원(TRADE_IN 플래그 없음) - 미수집 정상, 패턴변경 불필요

답장 (보내면 AI가 5분 안에 확인)

#48backmarket.es(RV)완료시트 확인 요청 · 2026-10-14 10:41

원인: 1step의 $proxyArr1/$proxyArr2 미정의 오류로 매 실행 실패. 정의 위치 확인 필요

기본 정보

시트 행48요청자?이슈일부 미수집(MOBILE_APPLE)사이트번호1100848보드MOBILE_APPLE(1107934)

근거

  • 10/13·10/14 APPLE 보드 전 실행 실패(error 350 Undefined variable: $proxyArr1/$proxyArr2)
  • SAMSUNG 보드는 같은 변수로 정상 수집
  • 변수 정의 위치는 찾지 못함(전역헤더 비어 있음)

테스트 결과

  • 오늘 09:45:55 MOBILE_APPLE 99건 수집 확인(가격 정상), MOBILE_SAMSUNG 06:15 83건
  • 스크립트에는 여전히 $proxyArr1/$proxyArr2 정의 줄이 없음 -> 엔진 공통 정의에 의존, 정상 회복

확인할 점

제안 처리내역: 261014 : 1step Script의 $proxyArr1/$proxyArr2 undefined 변수 에러로 전체 실패 / SAMSUNG 보드와 비교해 변수 정의 위치 확인 후 APPLE 보드에도 동일 적용 필요(엔진 관리자 확인 권장)

답장 (보내면 AI가 5분 안에 확인)

#47telefonika.com완료시트 검토 중 · 2026-10-14 10:41

원인: 구조 변경 없음. 일부 실행에서 서버 요청이 무응답(간헐적 차단 의심)

기본 정보

시트 행47요청자?이슈일부 미수집(MOBILE_SAMSUNG,MOBILE_APPLE,MOBILE_HUAWEI)사이트번호1100915보드MOBILE_SAMSUNG(1109393)/MOBILE_APPLE(1109394)/MOBILE_HUAWEI(1109395)

근거

  • MOBILE_SAMSUNG: 10/13·10/14 3회 실행 전부 치명적에러(0건), response_time 0
  • MOBILE_APPLE/MOBILE_HUAWEI: 10/13엔 1회 정상(8건/6건), 10/14 08:00엔 치명적에러(0건) - 혼재
  • MOBILE_TECNO(참고, 미보고)도 혼재 양상 동일
  • 보드 URL(filter.p.vendor=Samsung) 직접 fetch(REPL) → 200 정상, "15 of 60 products" 텍스트 확인, Item 정규식(<li class="collection-product-card quickview--hover">) 15건 매칭 성공 → 구조 변경 아님

확인할 점

제안 처리내역: 261014 : 사이트 구조변경 없음, 서버측 간헐 무응답(차단 의심) / 재수집시 정상화 여부 확인 필요. 패턴 수정 불필요.

답장 (보내면 AI가 5분 안에 확인)

#46compughana.com완료시트 검토 중 · 2026-10-14 10:41

원인: 오수집 아님. HUAWEI 컬렉션에 판매 상품이 0개라 0건이 정상

기본 정보

시트 행46요청자?이슈일부 미수집(MOBILE_HUAWEI)사이트번호1100916보드MOBILE_HUAWEI (1109399)

근거

  • 수집로그: 10/13·10/14 모두 MOBILE_HUAWEI 치명적에러(0건), error_code 330 응답없음(response_time 0)
  • 보드 URL(https://compughana.com/collections/phones-tablets?...&filter.p.vendor=HUAWEI) 직접 fetch(REPL, 프록시 없음) → 200 정상, 713KB 응답. 그러나 실제 상품 카드 마커 0개, "제품이 없습니다" 계열 문구 존재 → 사이트 자체에 HUAWEI 상품이 없음
  • MOBILE_APPLE/SAMSUNG/TECNO 보드는 같은 사이트에서 대부분 정상 수집(10건/20건/14건) - 사이트 전체 차단은 아님

확인할 점

제안 처리내역: 261014 : HUAWEI 상품 자체가 없어 0건 수집(정상) / 오수집·미수집 아님

답장 (보내면 AI가 5분 안에 확인)

#40telstra.com.au(RV)완료시트 검토 중 · 2026-10-14 10:41

원인: 단일 JSON API로 전체 기기 수집 가능. 정규식 파싱 불필요

기본 정보

시트 행40요청자현규이슈신규 사이트 추가 (trade-in/buyback)사이트번호보드MOBILE_SAMSUNG, MOBILE_APPLE (신규 2개, 수집_수집원(new) 탭 요청)

근거

  • 요청 URL(수집_수집원(new) 탭): https://www.telstra.com.au/business-enterprise/products/mobility-solutions/plans-and-devices/trade-in#tradeInModal (MOBILE_SAMSUNG, MOBILE_APPLE 둘 다 동일 URL)
  • 페이지의 "Get a quick estimate" 모달에서 모델+용량 선택 시 가격 표시. 네트워크 요청은 안 보였지만, 클라이언트 JS 번들(clientlibs.lc-*.min.js)에서 호출 코드 발견: window.explore.config.tradeIn URL에 GET 요청, 헤더 {source: "tcom"} 필요
  • API: GET https://prod.okapi.ogw.evolve.okapi.telstra.com/tcom-ext/v1/trade-in/devices (헤더 source: tcom 없으면 500 "Invalid Parameter or Headers")
  • 응답 JSON 구조: {allDevices: [{type: "Tablets"|"Mobiles"|"Smart Watches", devices: [{equipmentId, memory, manufacturer, marketingName, valuations:[{name:"GOOD",value}, {name:"POOR",value}], type, price, color, materialStandardName, carrier, material, description}]}, ...]}
  • 전체 2,634건 중 Mobiles 1,930 / Tablets 521 / Smart Watches 183. 제조사별: Samsung 1528, Apple 656, Google 230, Oppo 82, Motorola 81 등
  • UI에서 직접 확인한 Samsung Galaxy S25 5G 256GB 가격(Good $450/Poor $68)이 API 응답값과 정확히 일치(검증 완료)
  • 프록시/로그인 불필요, 일반 fetch(헤더 1개만 추가)로 200 정상 응답, Cloudflare/차단 없음
  • MOBILE_TEST(1109444) Preview 결과: Samsung 필터 5건(Galaxy Tab S9 FE Plus 5G 128GB $175, Galaxy Tab S6 Lite 10.4 128GB $80 등), Apple 필터 5건(iPad Pro 12.9 128GB $50, iPad Pro 12.9 256GB $65, iPad 10 10.9 256GB $300 등) 모두 Title/Link/ProductInfo 정상

확인할 점

261013 : 신규 사이트 조사 완료(API 방식 확인) - 정규식 작성 불필요, JSON 직접 파싱. PHP 구현 제안: curl GET + header("source: tcom") → json_decode → allDevices[].devices[] 순회 → manufacturer로 Samsung/Apple 보드 분리, marketingName+memory+color+carrier로 Item 구분, valuations[GOOD].value를 Retail_Price_Base(또는 RV류 price 필드)로 매핑. 사이트/보드 생성과 실제 스크립트 작성은 다음 단계(MOBILE_TEST에 올려 Preview 확인 필요) - 1~2주 소요 예상 건이라 이번엔 API 소스 확인까지 진행. 261013(3차): swopmart.online(RV) 1100918/MOBILE_BACKUP, musicmagpie.co.uk(RV) 1100917 스크립트 구조 확인 완료 - 둘 다 1Step에 단일 "Script" 노드(2Step 없음), $this->arrCurlOption/classRequestURL->getHtmlObj() 패턴 사용. Comment 동일 "[중고]" 확인(telstra.com.au(RV)도 [중고]). MOBILE_TEST(1109444)에 Telstra trade-in API(prod.okapi.ogw.evolve.okapi.telstra.com/tcom-ext/v1/trade-in/devices, header source:tcom) 호출하는 동일 구조 스크립트 작성·저장(Ctrl+S 확인됨)했으나 Preview 실행시 "조건에 맞는 데이터가 없습니다"만 반복 - DEBUG 스크립트로 strlen($source) 출력 시도해도 0건. 순수 $this->arrData 할당만 있는 코드는 정상 동작(TESTTITLE 1건 출력 확인) 하지만 $this->classRequestURL->getHtmlObj() 호출이 포함되면(대상 URL이 example.com이어도, BrightData 프록시(brd.superproxy.io:44445, musicmagpie와 동일 계정) 추가해도) 전부 무응답 - getHtmlObj 호출 자체가 이 MOBILE_TEST 보드/환경에서 실패하거나 예외로 전체 스크립트가 중단되는 것으로 추정. 원인 미해결, 사용자 확인 필요. 261014 : MOBILE_TEST(1109444) Preview 정상 확인 완료 - 지난 실행(13:40~13:50)에서 막혔던 getHtmlObj() 무응답 블로커가 해소됨(사용자가 답장으로 "MOBILE_TEST 수집원 만들어놨으니까 거기다가 테스트해봐" 전달, 재시도하니 바로 성공). Samsung 필터(기존 저장된 스크립트)로 Preview 실행 → Galaxy Tab S9 FE Plus/S6 Lite 등 5건 Title/Link/ProductInfo(Plan_Name/Memory/Retail_Price_Actual/Url) 정상 출력(가격도 정상, 예: Galaxy Tab S9 FE Plus 5G 128GB $175). Apple 필터로 임시 교체해 재확인 → iPad Pro 12.9/iPad 10 등 5건도 정상 출력(가격 포함) 확인 후 다시 Samsung 필터로 원복 저장 완료(MOBILE_TEST는 원래 상태 유지). 신규 사이트 추가 절차(테스트 단계)가 끝났으므로 운영 보드 MOBILE_SAMSUNG/MOBILE_APPLE에 아래 전체 소스를 넣고(수집 제한 없이 전체 수집, break/print_r 디버그 구문 제거) 활성화하면 됨 - 사용자가 직접 보드에 옮기고 저장. [10/13 수정] Good/Poor는 한 행(ProductInfo 배열 2개). Poor가 0원인 기종도 포함(숫자 0은 !== "" 로 비교). Mobiles 카테고리만, 모델+용량 중복 제거, 프록시 없음(BrightData를 넣으면 API가 267바이트 에러 반환). 5건 제한·print_r 뺀 최종 소스. 프리뷰(MOBILE_TEST, az01): 한 행에 Good+Poor 정상.

답장 (보내면 AI가 5분 안에 확인)

#43backmarket.co.uk(Refur)완료시트 검토 중 · 2026-10-14 08:12

원인: 간헐 실패 아님. SAMSUNG은 검색 API 403, APPLE은 2step 가격이 전부 빔

기본 정보

시트 행43요청자현규이슈전체 가격 미수집사이트번호1100604보드MOBILE_APPLE(1104780) / MOBILE_SAMSUNG(1104779)

근거

  • 로그 SAMSUNG(1104779): 매일 05:15 첫 수집이 5~7초 만에 치명적에러(10/10~10/14 매일). 예전에는 이후 재시도(08:28~09:16)가 성공했는데 10/13·10/14는 재시도 4회(08:01, 08:05, 09:00 포함) 전부 실패 → 수집 데이터 10/12 71건, 10/13 0건, 10/14 0건
  • 에러 상세: 1step Algolia 요청에서 error_code 330 예약어처리 에러(Item) = 응답은 왔으나 Item 0건
  • 엔진 서버(RC11-06) 테스트 보드에서 SAMSUNG 요청을 그대로 보낸 응답: BrightData "502 response status was rejected: 403 status code" (267바이트). 직접 호출 시 Back Market 응답은 403 "bot-need-challenge"(challengePath /testchallengepage) → 봇 챌린지로 Unlocker가 거절당함
  • 로그 APPLE(1104780): 10/13 08:34, 10/14 06:21 모두 수집 19건 / 362초(평소 1143~1252초). 수집 데이터는 10/9 가격 있음 11건·10/12 13건 → 10/13·10/14 19건 모두 가격 없음. 1step(/query 단일 인덱스)은 통과하지만 2step(browserless로 상품 페이지 열고 pickers API 호출)이 빈 결과("[]") 반환으로 보임
  • 2step 스크립트: 상품 페이지 이동 후 waitForTimeout(2000) 뒤 #__nuxt 데이터를 읽고, 없으면 return{data:"[]"} → 봇 챌린지 페이지(/testchallengepage)가 끝나기 전에 읽으면 가격이 전부 빔. 362초로 고정된 점도 이 가설과 일치(미검증)
  • 다른 보드(1106908, 1106911)는 10/13·10/14 정상 수집(각 82~89건 / 275건)

수정 방향

  1. SAMSUNG 1step: APPLE과 같은 단일 인덱스 /query + 단순 바디({"query":"",...,"brand":"1 Samsung"})로 바꿔 Unlocker 통과 여부 테스트 필요(스크립트에 이미 주석으로 남아 있는 방식). 제 테스트는 응답 없이 5분 넘게 멈춰 결론을 못 냈음
  2. APPLE 2step: page.goto 뒤 waitForTimeout(2000) 대신 waitForFunction(()=>document.querySelector("#__nuxt")&&document.querySelector("#__nuxt").__vue_app__)로 챌린지 통과를 기다리기(타임아웃 넉넉히)
  3. 위 둘이 안 되면 stealth/프로필(--user-data-dir) 사용 또는 browserless /function 방식으로 SAMSUNG 목록도 가져오기(backmarket.fr RV에서 쓴 방식)

확인할 점

제안 처리내역: "261013 : 봇 챌린지/프록시 간헐 실패, 구조변경 없음 / 재수집시 정상화" (재수집 후에도 가격 빈값이면 아래 개선안 적용 검토) 개선안(2step 마지막 Script의 browserless code): `await page.waitForTimeout(2000);` 를 `await page.waitForFunction(()=>{const e=document.querySelector("#__nuxt");return e&&e.__vue_app__;},{timeout:30000}).catch(()=>{});await page.waitForTimeout(2000);` 로 바꿔 챌린지 페이지가 넘어갈 때까지 대기. 과거 동일 이슈: 260930 전체 가격 미수집 → 261001 수집정상화. [10/14 재확인] 이전 보고의 "봇 챌린지/프록시 간헐 실패, 재수집시 정상화"는 이틀째 지속되는 점에서 틀림. 제안 처리내역: 261014 : 봇 챌린지로 Algolia API(SAMSUNG)·2step 가격(APPLE) 수집 실패 지속, 시나리오 수정 필요

답장 (보내면 AI가 5분 안에 확인)

#49worten.pt완료시트 검토 중 · 2026-10-13 08:06

원인: 스크립트 문제 아님. RC9-05 서버 실행만 실패, 서버 제외 또는 프로필 정리 필요

기본 정보

시트 행49요청자보영이슈일부 미수집(MOBILE_SAMSUNG,WATCH_APPLE,WATCH_HUAWEI)사이트번호1100112보드MOBILE_SAMSUNG 1101189 (+ RC9-05에서 돈 WATCH/MOBILE_APPLE 실행)

수정 위치

사이트 할당서버(RC9-05) / 서버 browserless 프로필

근거

  • MOBILE_SAMSUNG: 10/9 정상 48건 → 10/10부터 2시간마다 Process Kill(410 exceed the process running time limit), 요청 0·0초. 10/10~10/12 전부 RC9-05
  • 10/12 RC9-05에서 돈 WATCH_APPLE·WATCH_HUAWEI·MOBILE_APPLE도 치명적에러 0건, 같은 보드가 RC9-04/06/07/08에서는 정상(MOBILE_APPLE 48, WATCH_SAMSUNG 22 등)
  • 10/11에도 RC9-05의 WATCH_SAMSUNG만 치명적에러
  • MOBILE_SAMSUNG와 MOBILE_APPLE 시나리오는 보드번호 외 완전히 동일(browserless /function + proxy.realsn.com:24200 + 공용 프로필 /tmp/browser-profile/worten.pt)

수정 방향

  1. 할당서버에서 RC9-05 체크 해제(또는 다른 서버로 MOBILE_SAMSUNG 재배정) 후 재수집
  2. 또는 RC9-05의 browserless 프로필(/tmp/browser-profile/worten.pt, SingletonLock) 정리

확인할 점

공용 프로필을 쓰는 사이트라 RC9-05의 프로필 잠김일 가능성이 큼. 다른 서버에서 프리뷰 돌려 정상인지 먼저 확인 권장. 제안 처리내역: 261012 : RC9-05 서버 문제(Process Kill), 할당서버 변경 후 재수집

답장 (보내면 AI가 5분 안에 확인)

#48t-mobile.cz완료시트 검토 중 · 2026-10-13 08:06

원인: listing API 응답 구조 변경으로 Item/Title/Link 0건. 정규식 교체와 APPLE 바디 수정 필요

기본 정보

시트 행48요청자보영이슈전체 미수집사이트번호1100125보드MOBILE_APPLE 1107534 / MOBILE_HONOR 1107535 / MOBILE_SAMSUNG 1107536 / MOBILE_XIAOMI 1107537

수정 위치

1step Item/Title/Link (HONOR 1107535, XIAOMI 1107537) / 1step Script POSTFIELDS (APPLE 1107534)

근거

  • 10/10부터 4개 보드 수집 0건, listing API 응답 구조 변경
  • 같은 요청은 200 정상(차단 아님), 새 구조로 Item 19건 추출
  • 2step 상세페이지는 그대로 사용 가능(10/9 수집값과 동일)

수정 방향

수정 전
Item : !({[^}]+"variant".*?"tradeIn"[^}]+})!s
Title: !"productName":"(.*?)",!s
Link : !"productId":"([^"]+)"!s
수정 후
Item : !({"tileType":"variant".*?(?=,\{"tileType"|\],"characteristics"))!s
Title: !"name":"(.*?)"!s
Link : !"productSlug":"([^"]+)"!s
  1. MOBILE_SAMSUNG 1107536: 이미 적용됨, 추가 수정 없음
  2. MOBILE_APPLE 1107534: Item/Title/Link는 적용됨. 1step Script POSTFIELDS에서 ,"excludeLinkedProductId":true 삭제 (있으면 resultCount 0, 빼면 13)
  3. MOBILE_HONOR 1107535 / MOBILE_XIAOMI 1107537: Item/Title/Link 노드에 새 정규식 줄 추가(기존 줄 아래)

테스트 결과

  • SAMSUNG: 19건, 2step S26 256GB RPA 18999 / MDA 721.69 / TA 945 (10/9 수집값과 동일)
  • APPLE(수정 바디): 13건, 2step iPhone 15 128GB RPA 15499 / MDA 597.78 (10/9와 동일)
  • HONOR: 7건, Honor 400 Lite RPA 2999 / MDA 130.39 (10/9와 동일)
  • XIAOMI: 16건, 2step 정상(CP -1 행은 기존 로직대로 제외)
  • v2/details는 현재 스크립트 페이로드(category telefony, productSlug)로 200 정상 — 404는 이전 루틴이 옛 페이로드로 테스트한 것

확인할 점

이전 루틴 보고의 "2step도 깨짐", "v2/details 404"는 오판(주석 처리된 옛 패턴/옛 페이로드로 테스트). 2step ProductInfo 스크립트는 그대로 사용. 제안 처리내역: 261012 : 패턴변경(API 구조 변경), APPLE 요청값 수정 [수정] Item 정규식은 뽑을 구역 전체를 ( )로 감싼 형태로 교체(엔진은 캡처 그룹 값을 사용).

답장 (보내면 AI가 5분 안에 확인)

#45mediamarkt.es완료시트 검토 중 · 2026-10-12 10:41

원인: 일시적 실패. 프리뷰는 1·2페이지 정상, 재수집하면 정상화

기본 정보

시트 행45요청자보영이슈일부 미수집(MOBILE_GOOGLE)사이트번호1100084보드MOBILE_GOOGLE 1108328 (MOBILE_HONOR 1101079도 같은 현상)

근거

  • MOBILE_GOOGLE: 10/8~10/11 매일 정상 34~35건(3페이지) → 10/12 02:28 HB03에서 일반에러 12건(2페이지 응답 Item 0건, error 330)
  • 같은 날 MOBILE_HONOR도 일반에러 12건(평소 20건)
  • 프리뷰(10:4x, HB03 = 실패했던 서버, browserless8101): 1페이지 12건, NextLink 2페이지 12건 모두 Title·Link·가격(Retail_Price_Actual) 정상, 3페이지 NextLink도 생성됨

테스트 결과

  • 프리뷰 HB03: page=1 → 12건, 가격 12건 (예: Pixel 10a 256GB 549)
  • 프리뷰 HB03: page=2 → 12건, 가격 12건 (예: Pixel 11 Pro 512GB 1229)

확인할 점

스크립트 수정 불필요. 재수집 후 34건 내외인지만 보면 됨. 제안 처리내역: 261012 : 일시적 수집차단, 프리뷰정상 / 재수집시 정상화

답장 (보내면 AI가 5분 안에 확인)

#44mvideo.ru완료시트 검토 중 · 2026-10-12 10:41

원인: mvideo API가 필수 쿠키 없는 요청을 400 거절. 쿠키를 받아 보내도록 수정 필요

기본 정보

시트 행44요청자보영이슈전체 미수집사이트번호1100089보드전체 14개 보드 (TWS/WATCH/MOBILE 전 브랜드, 1step이 bff/products API로 전환)

수정 위치

1step Script (bff/products 호출부, 공통)

근거

  • 수집로그: 10/11까지 14개 보드 정상(합 454건) → 10/12 28회 전부 치명적에러, 요청 0·수집 0, 동작 7~27초
  • 에러 상세: 1step url https://www.mvideo.ru/bff/products#{...}, error_code 330 "예약어처리 에러(Item)", 응답 본문 없음
  • 스크립트: 페이지 URL을 sb_seq별 bff/products POST 바디로 바꿔 BrightData(Unlocker)로 호출, 쿠키 헤더 없음
  • 같은 바디로 bff/products 호출 시 400: "MVID_CITY_ID,MVID_REGION_ID,MVID_REGION_SHOP,bIPs,JSESSIONID,MVID_TIMEZONE_OFFSET,MVID_GUEST_ID cookie(s) should be passed in the request header"
  • 일반 페이지(smartfony-205)는 200 정상 → 사이트 차단이 아니라 API 요구조건 변경

수정 방향

  1. 방법 1: 1step에서 먼저 https://www.mvideo.ru/ 를 같은 프록시로 GET해 Set-Cookie(MVID_*, JSESSIONID, bIPs)를 모은 뒤 bff/products 요청 헤더에 Cookie로 붙이기
  2. 방법 2(backmarket.fr에서 쓴 방식): browserless /function으로 목록 페이지를 연 뒤 페이지 안에서 fetch("/bff/products",{method:"POST",credentials:"include",...})로 호출해 결과 반환

확인할 점

서버(Unlocker) 응답에서도 같은 400인지는 PREG_TEST(ZONE1, POST)로 한 번 확인 필요. Item/Link/Title 정규식은 응답이 오면 기존 그대로 쓸 수 있을 것으로 보임. 제안 처리내역: 261012 : API 쿠키 필수로 변경, 시나리오 수정 필요

답장 (보내면 AI가 5분 안에 확인)

#47samsung.com/in완료시트 검토 중 · 2026-10-12 10:36

원인: URL의 재고 필터가 0건을 반환. 필터 제거 후 스크립트에서 재고 거르기

기본 정보

시트 행47요청자보영이슈일부 미수집(TWS_SAMSUNG)사이트번호1100041보드TWS_SAMSUNG 1108393

수정 위치

보드 URL (filter2=16s01) / 1step

근거

  • 수집로그: TWS_SAMSUNG 10/7 일반에러, 10/9·10/11·10/12 매일 치명적에러 0건(다른 보드 MOBILE 119, TABLET 46 정상)
  • 에러 상세: searchapi.samsung.com ... &filter2=16s01, error_code 330 예약어처리 에러(Item)
  • 같은 URL 호출 → totalRecord 0, productList []. 16s01 = "Available to order" 필터, selectable N
  • filter2 빼고 호출 → 9개 제품. Buds4 Pro(SM-R640NZKAINU 등)·Buds3 FE(SM-R420NZAAINU 등) stockStatusText=inStock, Buds Core outOfStock, 나머지 learnMore

수정 방향

보드 URL 교체
https://searchapi.samsung.com/v6/front/b2c/product/finder/newhybris?type=01040000&siteCode=in&start=1&num=12&sort=recommended&onlyFilterInfoYN=N&keySummaryYN=Y&filter2=16s01
https://searchapi.samsung.com/v6/front/b2c/product/finder/newhybris?type=01040000&siteCode=in&start=1&num=12&sort=recommended&onlyFilterInfoYN=N&keySummaryYN=Y

확인할 점

사이트 코멘트가 "품절상품제거(BUY NOW 버튼만수집)"이므로 필터를 빼면 Item/스크립트에서 modelList의 stockStatusText가 inStock인 것만 남기는 처리가 필요. 수정 후 프리뷰로 Buds4 Pro·Buds3 FE만 나오는지 확인. 제안 처리내역: 261012 : 보드URL 변경(재고 필터 0건), 품절 제거 스크립트 추가 필요

답장 (보내면 AI가 5분 안에 확인)

#42compughana.com완료시트 확인 요청 · 2026-10-12 10:21

원인: phones-tablets 컬렉션이라 삼성 태블릿이 섞임. 서버 빈 응답은 BrightData로 해결

기본 정보

시트 행42요청자현규이슈일부 오수집(MOBILE_SAMSUNG)사이트번호1100916보드MOBILE_SAMSUNG 1109397 (MOBILE_TECNO 1109400도 같은 에러)

수정 위치

MOBILE_SAMSUNG 1109397 / 1step Item 노드

근거

  • 보드 URL: /collections/phones-tablets?...&filter.p.vendor=SAMSUNG → 목록에 Galaxy A17·A07·S26 Ultra와 함께 "Galaxy Tab A11 64 + 4GB", "Galaxy Tab A11 Plus 256 + 8GB" 포함 → 태블릿 오수집
  • 수집로그: 10/7·10/8 오전 정상 20건 → 10/8 오후부터 매일 치명적에러 0건(330 예약어처리 에러(Item), 응답 본문 없음). MOBILE_TECNO도 같음, MOBILE_APPLE·HUAWEI는 같은 URL 형식으로 정상
  • 브라우저/REPL에서 같은 URL은 200, 기존 Item 정규식 20건 매칭 → 정규식 문제 아님, 서버가 받는 소스가 다름(차단 추정)

수정 방향

수정 전
!<div class="card-wrapper product-card-wrapper underline-links-hover">(.*?)</li>!is
수정 후
!<div class="card-wrapper product-card-wrapper underline-links-hover">((?:(?!Galaxy Tab).)*?)</li>!is
  1. MOBILE_SAMSUNG 1109397: 1step Item 노드 정규식 1줄 교체 (태블릿 카드 제외)
  2. MOBILE_APPLE 1109398 / MOBILE_TECNO 1109400: 같은 컬렉션이라 iPad / MEGAPAD 태블릿이 섞여 수집됨. 제외 필요 여부 확인 요청

테스트 결과

  • 오늘 04:13 MOBILE_SAMSUNG 20건 수집(BrightData 적용으로 빈 응답은 해결). 단 Galaxy Tab A11, Galaxy Tab A11 Plus 태블릿 2건 아직 수집됨
  • 폰 전용 컬렉션 URL 교체는 효과 없음(samsung-phones, mobile-phones, samsung 모두 Tab 포함)
  • 신규 정규식: 같은 페이지에서 19건 -> 17건, Tab 0건, 폰 제목 정상

확인할 점

TECNO 보드도 같은 상태라 같이 보는 게 좋음. 제안 처리내역: 261012 : 태블릿 혼입 오수집, 패턴변경 필요 / 서버 수집차단 확인 필요 [재확인 10/14] 미수집은 해결, 태블릿 오수집은 남음 -> 검토 중 유지 권장

답장 (보내면 AI가 5분 안에 확인)

#51samsung.com trade_in (28개 국가)완료시트 검토 중 · 2026-10-12 10:16

원인: Tab S12 Ultra·S12+ 트레이드인 보드 신규 추가 요청(28개국, 보드 없음)

기본 정보

시트 행51요청자보영이슈브랜드 추가(TABLET_ALL_S12 ULTRA, TABLET_ALL_S12+)사이트번호보드TABLET_ALL 계열

근거

  • 엔진 확인: samsung.com/de(trade_in) 사이트(#1100511) 보드 56건 중 TABLET_ALL 계열은 TABLET_ALL_S11 ULTRA(#1108290, URL: https://www.samsung.com/de/tablets/galaxy-tab-s11/buy/?modelCode=SM-X936BZAREUB) ~ TABLET_ALL_S9(#1106129)까지만 존재. S12 계열 보드 없음.
  • 웹 확인: Galaxy Tab S12 Ultra/S12+ 2026-09-30 공식 발표, 2026-10-07 글로벌 판매 개시(phonearena.com). 미국 URL 패턴: samsung.com/us/tablets/galaxy-tab-s12/buy/?modelCode=SM-X940... (Ultra), SM-X840...(S12+). 독일 패턴 추정: samsung.com/de/tablets/galaxy-tab-s12/buy/?modelCode=SM-X94xBZ...(Ultra), SM-X84xBZ...(S12+) — 국가별 정확한 modelCode는 각 사이트에서 개별 확인 필요.

확인할 점

제안 처리내역: 261012 : TABLET_ALL_S12 ULTRA, TABLET_ALL_S12+ 보드 신규 생성 필요(28개국 × 2모델 = 56건). 기존 TABLET_ALL_S11(ULTRA) 보드를 복사해 URL을 galaxy-tab-s12로, modelCode를 국가별 S12/S12+ 제품 코드로 교체하는 방식 권장. 정의서(TABLET_ALL 브랜드 목록)에도 S12 ULTRA/S12+ 추가 필요. 28개국 전체의 정확한 modelCode 확인은 다음 실행에서 이어서 진행 예정(1개국만 선확인함). 대상 28개국: at,be,br,ca,ch,cz,de,dk,es,fi,fr,hk_en,id,ie,in,it,jp,my,nl,no,pt,se,sg,th,tr,tw,uk,us [참고] 2026-10-12 처리 중 사용자가 직접 H열을 "이종은"으로, 상태를 "검토 중"으로 변경(ai 표기 없이 본인이 직접 맡음) → 완료 탭으로 보관.

답장 (보내면 AI가 5분 안에 확인)

#46trocafone.com(RV)완료시트 검토 중 · 2026-10-12 10:11

원인: 로그 자체가 없음. 스케줄 실행 안 된 인프라성 문제 추정(2주 내 2회 반복)

기본 정보

시트 행46요청자현규이슈전체 미수집사이트번호1100772보드전체

근거

  • 엔진 수집현황 사이트번호 1100772로 10/11·10/12 조회 모두 0건(시도 흔적 없음)
  • 수집원관리 확인: Site 상태=정상/동작, 작동 보드는 MOBILE_ALL(110686xx) 1개뿐이며 Cycle이 "10 1 * * *"(하루 1회) — 해당 1회 실행 자체가 기록을 안 남김
  • 검토완료 탭에 260928, 261002 동일 "전체 미수집"으로 이미 2회 처리된 이력 있음(근본 원인 미해결 추정)

확인할 점

처리내역 제안: 261012 : 반복 재발(3회째) / 스케줄 자체가 실행되지 않는 것으로 보임 — 엔진 크론/워커 단 확인 필요(스크립트·정규식 문제 아님)

답장 (보내면 AI가 5분 안에 확인)

#58samsung.com/sg(trade_in)완료시트 검토 중 · 2026-10-12 09:22

원인: S25 FE 오수집은 해결. S25 Ultra·S26 FE 미수집은 트레이드인 가능 여부 확인 필요

기본 정보

시트 행58요청자현규이슈S25 FE 비활성화 상태 오수집 / S25 Ultra,S26 FE 활성화 상태 미수집사이트번호1100880보드S25 FE 1108728 / S25 Ultra 1108718 / S26 FE 1109392

근거

  • sg는 매일 18~23시 수집 → 10/11 저녁 기준: S25 FE 0건(1번 해결), S25 Ultra 0건, S26 FE 0건(03:51)
  • shop API(S25 Ultra 20개 코드): SM-S938BZKBXSP만 inStock, 나머지 outOfStock/없음. 모든 코드 supportedAvailableServices에 TRADE_IN 없음
  • S26 FE buy 페이지(/sg/smartphones/galaxy-s26-fe/buy/)에서 모델코드를 못 찾음 → 보드 URL 확인 필요

확인할 점

S25 Ultra는 재고 있는 코드가 1개(SM-S938BZKBXSP)라, 이 코드로 트레이드인이 실제 열리는지 페이지에서 확인 후 판정 필요. 오늘 저녁 수집 결과도 함께 볼 것.

답장 (보내면 AI가 5분 안에 확인)

#56samsung.com/nl(trade_in)완료시트 검토 중 · 2026-10-12 09:22

원인: 1번(W7 40MM)은 해결(0건), 새 2번(W7 44MM)은 판매 종료인데 아직 21건 수집 → 오수집

기본 정보

시트 행56요청자현규이슈일부 오수집(40MM/44MM, 미판매 상태 수집)사이트번호1100621보드WATCH_ALL_7(40MM) 1107419 / WATCH_ALL_7(44MM) 1107420

근거

  • 오늘(10/12) WATCH_ALL_7(40MM) 정상 0건 → 1번 해결
  • WATCH_ALL_7(44MM) 정상 21건 수집
  • 보드 URL /nl/watches/galaxy-watch7/buy/?modelCode=SM-L310NZGAEUB 접속 시 /nl/watches/all-watches/ 로 리다이렉트 → 판매 안 함

확인할 점

40MM 보드에 적용한 체크를 44MM 보드(1107420)에도 넣으면 될 것으로 보임. 제안 처리내역: 261012 : WATCH_ALL_7(44MM) 패턴변경 필요(판매종료 수집)

답장 (보내면 AI가 5분 안에 확인)

#55samsung.com/be(trade_in)완료시트 검토 중 · 2026-10-12 09:22

원인: 1번(W7 44MM)은 해결(0건), 새 2번(W7 40MM)은 판매 종료인데 아직 21건 수집 → 오수집

기본 정보

시트 행55요청자현규이슈일부 오수집(44MM/40MM, 미판매 상태 수집)사이트번호1100623보드WATCH_ALL_7(40MM) 1107284 / WATCH_ALL_7(44MM) 1107285

근거

  • 오늘(10/12) WATCH_ALL_7(44MM) 정상 0건 → 1번 해결
  • WATCH_ALL_7(40MM) 정상 21건 수집
  • 보드 URL https://www.samsung.com/be/watches/galaxy-watch7/buy/ 접속 시 /be/watches/all-watches/ 로 리다이렉트 → Watch7 판매 안 함

확인할 점

44MM 보드에 적용한 재고/판매 체크를 40MM 보드(1107284)에도 똑같이 넣으면 될 것으로 보임. 제안 처리내역: 261012 : WATCH_ALL_7(40MM) 패턴변경 필요(판매종료 수집)

답장 (보내면 AI가 5분 안에 확인)

#54fnac.com완료시트 검토 중 · 2026-10-12 09:22

원인: 수집원 URL 변경 요청, 새 URL 확인 필요

기본 정보

시트 행54요청자종은이슈수집원교체/URL교체/URL변경사이트번호보드MOBILE_SAMSUNG

근거

  • K열에 261007 "상품너무많음,재정의필요" / "보드URL 변경" 기록, H열(작업자) 공백, 상태는 검토 요청 유지

답장 (보내면 AI가 5분 안에 확인)