계밥의 작업소

[Topic Alarm Bot] 1. 크롤링부터 차근차근 본문

진행 중

[Topic Alarm Bot] 1. 크롤링부터 차근차근

계밥도문화지 2016. 10. 31. 02:06

우선 공지사항을 긁어오기 위해선 크롤러가 필요하겠죠. 저는 다들 흔하게 만들어 봤다던 크롤러를 사실 만들어본 적도 없고, 심지어 Go Lang으로 코드를 짜본 적도 얼마 없기에 좀 두려웠긴 했습니다. 그래도 어떻해요. 부딪혀야죠. 그래서 자신있게 구글링(....!)을 시도했습니다. 그래서 발견한 것이 바로 이 페이지였습니다.

Jack Danger님(이하, JD님)이 Go Lang으로 간단한 크롤러를 만드는 것을 예제로 올려놓았습니다. 기본적으로 통신이 필요한 부분이기에 "net/http" 패키지와 "io/ioutil" 패키지가 필요했습니다. 그렇게 따라하다보니 결국엔 링크들만 따로 확인하는 부분이 나오더군요. JD님의 경우 본인이 하이퍼링크들만 따로 출력할 수 있는 패키지를 만드셨습니다.

결국 이 패키지는 오로지 하이퍼링크들만을 가져오는 것이니 제가 원하던 바는 아닌 것이죠. 그래서 본 패키지를 수정할 필요가 생겼습니다. 그래서 본격적으로 이 패키지의 내용을 분석해봤습니다. 결국 retrieve() 함수에서 쓰는 All() 메서드는 페이지의 내용을 통째로 읽어오고, 이것을 토큰화하여 차근차근 읽어나가는 것입니다. 읽어나갈 때 페이지를 단순히 Text의 조합으로 보는 것이 아니라 하나의 의미있는 덩어리로 보는 것입니다. 그리고 그렇게 토큰화하는 기준은 여러가지가 있습니다.

원래의 계획은 이거였습니다. JD님의 패키지는 결국 a 태그를 먼저 확인하고, 그 태그 내에 href 속성(attribute)가 존재하는지를 확인하고, 있을 경우 href 속성의 값(attr.val, 결국 링크 주소)를 가져오는 것이었습니다. 저 같은 경우에는

1. 우선 공지사항 테이블에 먼저 접근해야한다.

2. 그 중에서 태이블의 제목들만 뽑아서 표시를 하도록 한다.

3. 그래서 td node를 뽑아내는 형식으로 접근을 한다.

이런 방식으로 접근하려고 했습니다. 물론 이렇게 하다보니.... 그래서 JD님의 패키지에서 a 태그를 확인하던 것을 td 태그를 확인하는 것으로 변경했습니다. 그러나 예상과는 달리 td 아래에 있는 태그들을 접근 못하고 헛돌더군요. 물론 이것을 받고 계속해서 다음으로 넘어가며 content(TokenType 중 TextToken)을 확인하면 됐겠지만, 그 순간 멘붕이 와서 새로운 방법을 시도하기로 했습니다.

먼저 공지사항의 제목들이 가지고 있는 특징들을 살펴봤습니다.

(하필이면 제목이.....ㄷㄷ)

제일 큰 특징 중 하나는 a 태그에 두 개의 속성이 들어가는 것이었습니다. 하나는 href 속성이고, 다른 하나는 screenshot 속성입니다. screenshot 속성에 대해선 처음 들어보기에 실제로 많이 쓰이지는 모르겠지만 우선 들어있더군요. 그래서 결국 a 태그를 확인하고 이 screenshot 속성이 있는지를 확인하고, a 태그가 가지고 있는 내용을 추출하는 방향으로 잡았습니다.

문제는 위에서 링크를 걸었듯이 토큰에도 분류가 존재한다는 것이었습니다. 실제로 코드 내에서 반복문을 돌아가며 걸리는 부분을 확인하면 그 당시에는 모두 시작 태그만 걸리는 현상을 발견했습니다. 그래서 실제 공지사항의 제목에는 접근도 하지 못하는 상황이고요. 그래서 이에 대해 확인하기 위해 구글링을 시도했습니다.

처음에는 html 패키지를 이해못해서 안절부절하며 의미없는 구글링만 해대고 있었습니다. 그러다가 어느 순간 감이 오더라고요. 딱 위에서 걸은 링크 페이지를 봤을 때 영감이 떠올랐습니다. 지금까지 패키지에선 StartTagToken을 사용하고 있던 것입니다. 즉, 태그의 시작점을 의미하는 부분만 걸러서 봤던 것이죠. 그렇게 되면 "a 태그 시작 확인 --> screenshot 속성 유무 확인 --> TextToken(공지사항 제목임을) 확인"하는 과정을 거치면 되는 것이었습니다. 결국 이를 참고해서 코드를 수정해주고, 크롤링된 결과를 콘솔에서 확인해보면....

(뿌듯)

이렇게 됩니다. 이 제목들을 따오기 위해 5시간을 투자했습니다(....) 물론 큰 산을 넘으니 이제 조금 자신감이 생기더라고요. 다음에는 이 내용을 텔레그램 메세지로 실어보내는 것을 해보도록 하겠습니다.

(이번 포스팅의 커밋은 여기서 확인할 수 있습니다.)

'진행 중' 카테고리의 다른 글

[Topic Alarm Bot] 0. 개발 시작  (0) 2016.10.31
Comments