본문 바로가기
프로그래밍

애니메이션 검색 웹 애플리케이션 1

by 기이한날개 2022. 3. 14.

이전 글

크롤링과 데이터 수집

라프텔에서 공식적으로 API를 제공하지 않고 있기 때문에 크롤링을 통해 사이트에서 얻을 수 있는 정보를 수집해야 했다. 찾아보니 이전에 라프텔에서 API를 제공한 적이 있는 것 같은데, 2022년 3월 기준으로는 더 이상 제공하지 않는 모양이다. 

 

1. Selenium을 이용한 크롤링(실패)

가장 먼저 시도한 것은 selenium 라이브러리를 이용해 모든 작품의 상세보기 페이지 링크를 받아온 후, 각 상세보기 페이지에서 더 보기 버튼을 클릭한 후 표시되는 모든 html 정보를 불러와 필요한 정보를 가공해 csv로 저장하는 것이었다. 

https://laftel.net/finder
https://laftel.net/item/39431

하지만 이런 방식에는 여러 문제점들이 있었다.

 

(1) 너무나도 느리다

실제로 브라우저를 켜서 버튼을 누르고 로딩되는 정보를 가져와야 했기 때문에 6643개의 애니메이션 데이터를 가져오기에는 너무 느렸다. 속도 개선과 cpu 사용률 감소를 위해 selenium을 firefox로 그리고 headless로 돌렸지만 며칠을 돌려도 모든 데이터를 가져오기에는 터무니없이 부족했다. 또 한 번에 너무 많은 request를 보내면 라프텔 홈페이지에서 too many requests 오류를 내보내며 응답하지 않았기 때문에 생각했던 것보다 훨씬 시간이 오래 걸렸다.

 

(2) 오류가 너무 많이 뜨고 결측치가 많다

오래 걸려 모은 데이터였음에도 불구하고 오류가 많았는데, 중간에 인터넷 연결 오류가 나거나 selenium 작동 상 오류가 자주 나면서 원하는 만큼의 정확한 데이터를 모을 수 없었다. 특히 작품 상세 설명 페이지마다 html 구조가 다르거나 눌러야 하는 버튼이나 원하는 정보가 없는 경우도 많아서 도저히 원하는 정보를 모으기가 힘들었다. 코드를 효율적으로 짜지 못한 탓도 있겠지만 100시간 넘게 코드를 계속 돌렸음에도 원하는 정보의 반 정도밖에 얻지 못한 것을 보고 이 방법이 나의 능력으로는 현실적으로 어렵겠다는 것을 깨달았다.

 

2. LAFTEL 라이브러리

그때 도움을 받은 것이 바로 이 파이썬 라프텔 라이브러리였는데, 이걸 접하지 못했더라면 나는 아마 라프텔이 아닌 다른 데이터를 사용했을 것을 고려했을 것 같다.

https://pypi.org/project/laftel/

 

laftel

파이썬 라프텔 라이브러리, Unofficial Python Laftel API Wrapper(Laftel)

pypi.org

애니메이션 번호를 입력하면 다음과 같은 정보를 빠르게 얻을 수 있었다. 앞서 selenium으로 얻으려고 했던 라프텔 사이트의 html에 들어 있는 정보 그대로이지만, 비교도 안 될 정도로 훨씬 빠르고 간편하게 정보를 얻을 수 있었다. 

여기에 이제 추가적으로 필요한 데이터였던 애니메이션 제작사와 매체(TVA/극장판/OVA) 정보를 추가적으로 크롤링을 통해서 얻었고, 각 이미지 파일도 url에서 다운로드해 주었다. 이미지 파일을 제외한 모든 데이터는 csv 파일로 저장해 pandas dataframe과 호환이 되도록 해두었다.

 

사실 처음부터 라프텔에서 정보를 가져오는 라이브러리가 있다는 것을 알았더라면 시간을 정말 많이 절약했을 것 같다. 데이터를 받아오는 과정에서 너무 많은 시행착오를 겪었고 이 단계에서 시간이 정말 많이 소요되었다. 한편으로는 이런 비공식 api를 제공하는 코드를 짜서 공개하는 분들이 정말 대단하다고 생각했고 사용하는 입장에서 감사함을 느꼈다.

 

다음 글에서 계속