brunch

You can make anything
by writing

C.S.Lewis

by 앨런 Jun 22. 2020

구글 시트에서 교보문고 정보 긁어오기

Google Sheet 기본기능으로 크롤링(?)하기

사건(?)의 발단은 회사의 도서구매제도를 효율적으로 관리하기 위한 '구매신청/구매목록 시트' 제작.

앞서 도서 구매 시스템(?) 만들기에서 말한 것처럼, 도서구매 및 관리 관리자를 위해 (그리고 궁극적으로 모두를 위해) 도서구매목록 시트를 새로 만들었다. 시트는 '관리자용'과 '열람용'으로 구분했다.




1. 관리자용 (importxml로 끝!)

관리자용 시트는 '슬랙 메시지 log, 신청목록, 구매(대기)목록, 전체 도서목록' 총 4개의 탭으로 구성했다. 각 탭은 데이터가 흘러가는 순서대로 제작했고, 각각의 역할과 포함하는 정보는 아래와 같다.




a. 슬랙 메시지 log

자동화 툴(Zapier와 Integromat)을 이용해 슬랙 메시지를 넘겨받는 탭. 슬랙 메시지와 함께 작성자, 작성 시간 그리고 해당 메시지를 확인할 수 있는 URL값을 받는다.


Zapier 무료계정은 filter를 사용할 수 없어서 일단 모든 메시지를 넘겨받고, 구글 시트에서 filter, left 등을 사용하여 구매신청 건을 필터링했다. (Integromat 무료계정에서는 filter 기능이 기본 제공 구글 시트에서 해당 함수를 쓸 필요가 없어짐)




b. 신청목록

'슬랙 메시지 log' 탭에 신규 구매신청(URL)이 들어오면, 해당 도서의 정보를 교보문고에서 가져와서 보여주는 탭. 구글 시트에서 지원하는 importxml를 사용했다. 시트를 만들기 전에는 importxml이 뭔지 몰라서, 두 가지 삽질을 강행했다.


삽질1_ importxml 예문 무작정 따라 써보기.
importxml을 쓰면 크롤링을 할 수 있다던데, 말만 들어서는 감이 안왔다. 설명 만으로는 뭔지 알 수 없어서, 구글링해서 누군가 이미 사용해본 예문을 따라 써봤다. (여전히 감이 안 오더라..) 내가 가져오고 싶은 정보를 먼저 찾아보고, 다시 시트에서 importxml를 쓰기를 반복. 어느 순간 내가 원하는 정보가 시트로 튀어나오기 시작했다. (만세!)


삽질2_ 교보문고 페이지소스 뒤지기.

내가 가져오고 싶은 정보가 어떤 식으로 정리되어 있는지 확인하기 위해, 교보문고 여러 종류의 책 상세페이지에서 '페이지 소스'를 뒤졌다. 브라우져의 '검색' 기능을 사용해서 내가 원하는 정보가 어디에 숨어있는지 찾았다. importxml을 통해 시트에서 해당 정보를 가져오는 (무한) 시도. 결국 성공. (됐다!!)

크롬을 사용한다면, 마우스 우클릭으로 '페이지 소스 보기'를 선택할 수 있다.
비개발자인 나에겐 외계어로밖에 보이지 않는 문자가 쏟아진다. 그렇지만 천천히 들여다보면 일정한 규칙이 있더라.


이렇게 두 가지 삽질을 마친 후 완성된 '신청목록' 탭의 모습은 아래와 같다. 신청자 이름은 '슬랙 메시지 log' 탭에서 그대로 가져오고, 나머지 정보는 교보문고 페이지에서 자동으로 불러온다.


새로 구매 신청이 들어오면 ISBN을 기준으로 '신청목록'과 '구매목록'에 동일한 정보가 있는지 확인하여 '중복신청' 혹은 '중복구매' 여부를 알려준다. (아래와 같이 ifscountif 사용)

=iferror(ifs(countif('구매목록'!F:F, I2)>1,"중복 구매", countif(I:I, I2)>1,"중복 신청"))


새로운 데이터가 들어오면 자동으로 '담당자 확인' 체크박스가 나타나도록 하고, 담당자가 체크할 경우 '구매(대기)목록'으로 데이터가 넘어가도록 했다.

'담당자 확인' 체크박스는 미리 전체를 만들어놓고, 새로운 데이터가 들어오기 전까지 하얀색으로 보이도록 '조건부 서식'을 걸었다.




c. 구매(대기)목록

신청목록에서 담당자가 확인한 도서목록을 가져오는 탭. (filter 사용)


담당자가 확인한 도서를 바로 구매할 수 있도록 '장바구니 담기' 버튼을 자동생성한다. (아래와 같이 ifhyperlink 사용)

=if(I2=TRUE, "", if(F2>0,hyperlink("http://order.kyobobook.co.kr/cart/addCart?ejkGb=KOR&barcode="&F2, "담기"),""))


구매한 책은 '구매 완료' 버튼을 클릭하여 '장바구니 담기' 버튼을 비활성화하도록 했다.

'구매 완료' 체크박스는 미리 전체를 만들어놓고, 새로운 데이터가 들어오기 전까지 하얀색으로 보이도록 '조건부 서식'을 걸었다. '장바구니 담기'는 반대로, '구매 완료' 버튼이 활성화되면 하얀색으로 보이도록 '조건부 서식'을 걸었다.
'구매 완료' 버튼은 처음에 만든 것은 아니고, 시트를 사용하다 보니 필요할 것 같아서 추가했다.




d. 전체 도서목록

구매목록에서 담당자가 확인한 도서목록을 가져오는 탭. (filter 사용)


새로 구매한 책은 담당자가 해당 도서를 신청한 사람에게 직접 가져다주니까, '전체 도서목록'에 새롭게 입력된 책의 '갖고 있는 사람' 정보는 신청자를 default 값으로 한다.




2. 열람(importrange로 끝!)

'열람용' 시트는 '관리자용'의 '전체 도서목록'의 정보를 그대로 가져오는 방식이다. (아래와 같이 importrange 사용)

=IMPORTRANGE("{인용할 시트의 공유 URL}","{인용할 탭/범위}")





언제나처럼 말이 길어졌다. (반성.. 물론 실제로 삽질한 것에 비하면 꽤 짧게 쓴 거다. )

사소한 이슈들도 발생했다. 역시나 사소하게 해결했다.




글을 쓰고 나니 새삼스럽게 몇 가지 생각이 스친다.


(부지런하면 뭐든지 되겠다. 똑똑하신 분들이 이미 좋은 기술을 많이 만들어 놓았으니, 찾아서 쓰면 되겠다. 역시 일 빼고 다 재밌다... 등등)




암튼 회사의 도서구매제도를 사용하는 모든 사람들이 (특히 관리자가) 조금 더 행복해졌다면, 그것으로 만족.






그러던 어느 날, 문제가 발생했는데…

예상치 못했던 오류 해결 후기

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari