게시판 수집기 설계에 공백이 있어서 분류 목록이 정확한지를 확인해야 했다. 기존 CRAWLER.md 에는 대상별 분류가 합쳐서 여섯 개라고 적혀 있었다.
Table of contents
Open Table of contents
검증 — 세 배였던 실제 개수
확인 방법은 두 가지가 있었는데 시험 계정으로 로그인해 보는 것과 브라우저로 비로그인 상태에서 여는 것이다. 뒤쪽을 골랐다. 이유는 목록은 전부 보이고 본문만 잠겨 있어서 구조 검증에는 계정이 필요 없어서다. 대신 본문 구조는 이번에 확인하지 못하는 것을 감수했다. 각 대상의 분류를 세어 보니 합계가 열여덟 개로 기존 기록의 세 배였다.
기존 CRAWLER.md 가 축소돼 있었던 것인데 처음 볼 때 눈에 띄는 것만 적었을 가능성이 크다. 화면에 몇 개가 먼저 보이고 나머지는 스크롤하거나 다른 탭에 있으므로 주요 분류를 적고 그것을 전체로 착각하기 쉬운 구조였다.
조치 — 직접 진입이 바꾼 설계
같이 확인한 것이 ?category_id= 로 목록에 직접 진입할 수 있다는 점이었다. 홈에 들어가 탭을 클릭할 필요가 없다.
수집기가 훨씬 단순해지는데 홈 진입과 탭 클릭이라는 두 단계가 없어져 Guzzle 요청 하나로 끝나기 때문이다. 이 하나로 수집 흐름 설계가 바뀌었다.
원인 — 틀렸던 이전 비판
기존 코드에 대해 article_id 를 자체 생성해서 원본과 매칭이 안 될 수 있다는 비판이 적혀 있었다. 실제 식별자와 원본 페이지 주소를 대조하니 같았다.
자체 생성이 아니라 원본 article_id 였으므로 이전 비판이 틀린 것이었다. 그 형식을 뜯어보니 YYYYMMDDHHmmssSSS 에 두 글자가 붙은 형태여서 문자열 정렬이 곧 시간순이 된다. PHP 매뉴얼대로 strcmp 는 앞이 작으면 음수를 돌려주므로 증분 판정을 날짜 파싱 없이 문자열 비교만으로 할 수 있었다.
주의 — 계정 위험 없는 검증
이 확인을 전부 비로그인으로 했다는 점이 중요했다. 목록은 전부 보이고 본문만 잠겨 있어서 구조 검증에는 계정이 필요 없었다.
로그인해서 하면 계정에 접근 이력이 남고 잘못하면 제재 위험도 생긴다. 기존 기록 중 .locked 클래스로 잠김을 판정하는 신호는 확인해 보니 그대로 유효했으므로 틀린 것만 정정하고 맞는 것은 그대로 뒀다.
배경 — 정본과 미결
분류 필터는 category_id 를 정본으로 하고 제목의 [태그] 접두는 보조로만 쓰기로 했다. 태그는 사람이 붙이는 것이라 빠지거나 표기가 다를 수 있다.
열여덟 개 중 의뢰 범위 밖으로 보이는 넷은 수집 안 하기로 했지만 TODO.md 에 그것을 내가 정할 일이 아니므로 목록은 다 적고 추가 여부는 확인이 필요하다고 남겼다. 이 확인 하나가 분류 개수와 진입 방식과 article_id 판단 셋을 바꿨고 DESIGN.md 를 다시 써야 할 만큼이었다.
정리
- 기존 기록의 개수가 실제보다 작을 수 있다
- 눈에 띄는 것만 적고 전체로 착각하기 쉽다
- 직접 진입 주소가 있으면 수집이 단순해진다
- 식별자가 자체 생성인지 원본인지 확인한다
- 형식이 시각 기반이면 문자열 정렬이 시간순이다
- 비로그인으로 구조를 검증하면 계정 위험이 없다
- 틀린 것만 정정하고 맞는 것은 그대로 둔다
- 범위 밖 판단은 목록만 남기고 넘긴다