어떤 크롤링 도구를 선택해야 할까?

HYEON·2023년 7월 22일
2
post-thumbnail
💡 최근 자바를 이용한 크롤링을 할 일이 있어서, 크롤링 도구에 대해서 학습하게 되었다. 하지만 크롤링을 위한 라이브러리는 굉장히 많아서 어떤 라이브러리를 사용해야할 지 매우 혼란이 왔는데, 그래서 각 대표 라이브러리들은 무슨 차이가 있고, 어떤 상황에서 어떤 도구를 선택해야 할까?

대표 라이브러리 - Jsoup


Jsoup이란?

맨 처음으로 대표 라이브러리인 jsoup을 접하게 되었다.

jsoup은 HTML 문서에 저장된 데이터를 구문 분석, 추출 및 조작하도록 설계된 오픈 소스 Java 라이브러리입니다.

  • 위키백과

  • Jsoup은 자바로 작성된 HTML 파싱및 조작 라이브러리이다. 이번에 활용한 기능은 아래와 같다.

    1. HTML 파싱: HTML 문서를 파싱하여 DOM 트리를 생성하여, HTML 문서의 요소에 쉽게 접근할 수 있다.
    2. 요소 검색: CSS 선택자를 사용하여 HTML 요소를 검색하여 데이터에 접근하거나, 추출할 수 있다.
    • DOM 트리란 DOM(Documen Object Model) 트리는 HTML, XML 또는 다른 마크업 언어의 문서를 표현하는 트리 구조이다.

- 이런 식으로 계층적인 트리 형식으로 표현할 수 있다. 
이를 통해 각 구조에 쉽게 접근하고 조작할 수가 있다. 
부모 노드 - 자식 노드를 가진 트리의 형태 이므로, 탐색및 순회가 용이하다.

그래서 Jsoup을 쓰는 이유는 뭘까?

Jsoup은 왜 쓸까?

우린 여기서 정적인 웹페이지와 동적인 웹페이지, 즉 서버 사이드 렌더링클라이언트 사이드 렌더링에 대해 알아야 한다.
이 글은 이에 대한 주제가 아니기 때문에 간단하게 설명하자면,

  • 서버 사이드 렌더링(Server Side Rendering, SSR)은 웹 페이지를 서버에서 렌더링을 해서 클라이언트에게 전달하는 것이다.
  • 클라이언트 사이드 렌더링(Client Side Rendering, CSR)은 웹 페이지 초기 로딩시 레이아웃과 자바 스크립트 코드를 전달하고 이후 브라우저가 자바 스크립트를 실행하여 데이터를 불러와 동적으로 웹 페이지를 생성한다.

Jsoup은 SSR을 통해 미리 렌더링된 정적인 HTML 코드를 반환한다. Jsoup은 Http Request를 통해 서버에서 보내오는 HTML 문서를 그대로 받아와 사용하고 처리한다.

따라서, 정적인 웹페이지를 크롤링하는데 다음과 강점을 가지고 있다.

  • 간편하고 직관적인 API

  • CSS 선택자를 사용해 요소를 선택하고 추출 ex) select 메서드

  • 빠르고 경량화되어 좋은 성능을 보유

  • DOM 트리 형태로 HTML 문서 구조 접근에 용이하고, 이를 바탕으로 한 다양한 메서드들을 제공한다. ex) getElementById, getElementsByClass, getElementsByTag

    그럼 동적인 웹페이지에선 Jsoup이 왜 안좋을까? 여기엔 다음과 같은 이유가 있다.

  1. Jsoup은 Http Request를 통해 서버에서 보내오는 HTML 문서를 그대로 받아와 사용하고 처리한다.

  2. 하지만 동적인 웹페이지에선 CSR 방식으로 웹페이지 초기 로딩시 레이아웃과 자바 스크립트 코드를 전달하고, 이후 브라우저가 자바 스크립트를 실행하여 데이터를 불러와 동적으로 웹 페이지를 생성한다.

  3. 때문에 웹 페이지가 로딩되고 난 후 웹 브라우저에서 자바스크립트가 실행되어야 하기 때문에 Http 요청만으로는 완전한 구조를 가져올 수 없기 때문에, Jsoup이 좋지 않다.

    따라서, 동적인 웹페이지 처리하는 도구가 필요하다. 그래서 Selenium과 같은 라이브러리를 사용한다.

대표적인 동적 웹 페이지 도구 Selenium


셀레늄은 웹 애플리케이션 자동화 및 테스트를 위한 포터블 프레임워크이다. 셀레늄은 테스트 스크립트 언어를 학습할 필요 없이 기능 테스트를 만들기 위한 플레이백 도구를 제공한다.
위키백과

Selenium을 이용하면 동적 웹 페이지를 크롤링 할 수 있는데, Selenium의 동작 방식은 다음과 같다.

  1. 웹 드라이버를 설정한다. 이는 각 브라우저별로 제공되는 독립 실행형 실행파일로, 각 브라우저와 통신 할 수 있게 도와준다.
  2. 웹 드라이버를 사용해 웹 브라우저를 열어 자동으로 제어할 수 있는 객체를 얻는다.
  3. 웹 페이지를 로드하고, DOM 트리를 구성한다.
  4. 자바스크립트를 하고 AJAX 요청을 처리해 동적으로 웹 페이지를 구성한다.
  5. 웹 페이지가 완전히 로드되면, 데이터를 추출한다.

동적인 웹페이지에선 브라우저가 자바 스크립트를 실행하여 데이터를 불러와 동적으로 웹 페이지를 생성한다.

즉, Selenium은 웹 드라이버를 사용해 웹 브라우저를 활용해 자바 스크립트를 실행하여 웹 페이지를 그리는 것이다 !

🤔 그래서 뭘 써야 할까?


앞서 살펴본 동작방식에서 차이가 있다. 그래서 어떤 상황에서 무엇을 써야할까?

정적인 웹페이지를 크롤링 해야되는 상황에는 Jsoup과 같은 라이브러리를 사용하면 좋은 이유는 다음과 같다.
Jsoup은 웹 브라우저를 사용하지 않아 브라우저 자체의 로딩 시간과 자바스크립트 실행에 필요한 시간이 없다. URL을 이용해 웹 페이지를 로드하거나, 직접 HTML 코드를 입력해 로드가 가능하기 때문에, 빠르고 경량화 된 것이다.

동적인 웹페이지를 크롤링 해야되는 상황에는 Selenium과 Puppeteer와 같은 라이브러리를 사용하면 좋고, 이유는 다음과 같다.

Jsoup은 Http Request를 통해 서버에서 보내오는 HTML 문서를 그대로 받아와 사용하고 처리한다. 그래서 CSR 상황에는 적절하지 않고, 브라우저를 이용해 웹 페이지를 그리고 가져와야 하기 때문 Selenium과 Puppeteer와 같은 라이브러리를 사용하는 것이 좋다.

알게 된 점


위와 같이 학습 내용을 정리하면서, 아래의 항목에 대해 깨닫게 되었다.

  • CSR과 SSR의 차이

  • Jsoup과 Selenium의 동작 방식

  • DOM 트리

  • 어떤 상황에서 어떠한 도구를 선택하는게 적절한지

    크롤링을 처음하면서, 많은 내용을 학습하게 되었다. 예전부터 라이브러리를 선택할 때, 왜 그 라이브러리를 선택했고 어떤 방식으로 동작하는지 다른 라이브러리들과 차이점이 뭔지에 대해서 항상 고민하고 아는 것이 중요하다고 들었다. 이번 기회에 이와 같은 학습을 하면서 무지성으로 import 했던 자신에 대해 반성하게 되었던 것 같다.

    앞으로는 라이브러리를 선택할 땐 적어도 왜 쓰는진 알고 선택해보자 !

profile
레벨업하는 개발자

2개의 댓글

comment-user-thumbnail
2023년 7월 22일

개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.

1개의 답글