여러 곳에서 데이터를 모으는 수집기를 만들면서 브라우저를 띄워야 하는지가 계속 걸렸다. 브라우저는 무겁고 느리고 잘 깨지는데 확인할 수 있는 것은 다 하라는 지적을 받았다.
Table of contents
Open Table of contents
소스별 직접 검증
추측하지 않고 각 소스에 직접 요청해서 응답 크기와 찾는 요소의 존재를 확인했다. 결과가 예상과 달랐다.
대부분이 서버에서 완성된 HTML을 주고 있어서 브라우저가 필요 없었다. 정말 필요한 곳은 스크립트가 그려서 문서 객체에만 존재하는 동적 차트 이력과 로그인 유지 둘뿐이었다.
쿠키만 필요했던 유료 소스
한 소스가 유료 회원제라 브라우저가 필수로 보였다. 비로그인으로 받으니 미리보기와 결제 안내만 담긴 응답이 왔다.
쿠키를 실어 다시 요청하니 전문이 왔다. 브라우저로 페이지를 열 필요가 없고 브라우저는 쿠키를 얻는 데만 쓰면 되는 구조였다.
지표 페이지도 마찬가지였다. 인증 없이 요청해도 값마다 식별자 선택자가 붙은 완성된 문서가 왔으므로 그것을 직접 파싱하게 바꿨다.
화면 읽기와 구조 파싱
이 전환이 정확도까지 바꿨다. 전에는 화면 이미지를 읽어서 값을 뽑았는데 단위가 붙은 숫자에서 단위가 소실되는 오류가 났다.
선택자로 파싱하니 그 오류가 없어졌다. 구조화된 소스가 있으면 그것을 쓰고 화면을 읽는 것은 최후 수단이다.
헤더가 거짓인 경우
이미지를 받는 소스에서 함정을 만났다. 주소가 특정 확장자로 끝나고 응답 헤더의 콘텐츠 타입도 그것을 가리켰다.
실제 바이트를 열어 보니 다른 형식의 시그니처였다. 확장자와 콘텐츠 타입이 둘 다 틀린 것이고 후처리 라이브러리가 헤더를 믿고 열려다 실패할 수 있어서 바이트 시그니처로 판별하게 했다.
브라우저 역할의 축소
식별 코드를 어떻게 뽑을지도 확인했는데 본문에 괄호 표기와 링크 양쪽으로 들어 있었다. 별도 매칭이 필요 없어서 추출을 1순위로 두고 예외 채널 하나만 따로 적었다.
이 조사의 결론은 브라우저로 다 열어서 긁던 것을 브라우저는 쿠키 공급원으로 두고 나머지는 요청으로 처리하는 형태로 바꾼 것이다. 브라우저는 하나씩 열어야 하지만 요청은 병렬로 던질 수 있으므로 직렬화 제약이 사실상 해소됐다.
이 조사에서 한 소스의 인코딩을 잘못 기록했다가 나중 실측에서 정정됐다. 원문을 지우지 않고 이후 실측에서 정정됐다는 사실을 붙였는데 틀린 기록을 지우면 왜 정정됐는지가 함께 사라지기 때문이다.
정리
- 추측하지 말고 소스별로 직접 요청해 본다
- 서버 렌더링이 생각보다 많고 브라우저가 필요한 곳은 몇 안 된다
- 유료 콘텐츠도 쿠키만 실으면 되는 경우가 있다
- 구조화된 소스가 있으면 그것을 쓴다
- 화면 읽기는 단위 오류가 난다
- 확장자와 콘텐츠 타입이 둘 다 틀릴 수 있다
- 식별 코드가 본문에 있으면 추출이 1순위이고 예외는 따로 적는다
- 틀린 기록은 지우지 말고 정정 사실을 붙인다