요즘 회사에서 하고 있는 업무가 있다. 크롬과 같은 웹 브라우저를 조작하여 웹 크롤링을 통해 특정 링크 (우리 회사의 경우는 공공부처 홈페이지) 에 접속하여 스크린샷을 찍거나 로그인을 하거나, 혹은 화면의 내용을 토대로 결과값을 생성하여 Telegram bot을 이용. 일정시간이 되었을 때 메세지를 발송하는 작업이다.
이 작업을 위해서는 Selenium이라는 자동화 프레임워크가 필요하다. 나도 이번에 크롤링이라는 기능을 위해 처음으로 사용해보게 되었는데 그야말로 신세계를 경험했다.😯 웹 브라우저를 자동으로 열고, 버튼을 클릭하고, 텍스트를 입력하고 스크린샷을 찍고 등등... 본인의 서비스 혹은 프로젝트가 웹 브라우저 기반이며 이에 더불어서 자동화 처리까지 생각하고 있다면 Selenium을 빼놓고는 이야기할 수 없다.
제목을 "JAVA Selenium" 이라고 했지만 JAVA에서만 사용할 수 있다고 생각하면 오산이다. C#, Python, PHP, Pearl, Ruby, Scala 등 수 많은 프로그래밍 언어에서 Selenium을 지원하고 있다. 즉, 엄밀히 말하면 테스트 프레임워크인 만큼 기능 테스트를 만든다고 표현하는데 각 언어에서 테스트 특화 언어를 제공한다는 것이다. (그런데 라이센스는 아파치가 갖고 있음...)
그렇다면 Selenium은 어떤 특징을 가지고 있는지 낱낱이 파헤쳐보자.
웹 브라우저 자동화 오픈소스 프레임워크
웹 크롤링을 한다고 하면 보통 이 프레임워크를 사용하며 장점과 단점은 다음과 같다.
Good 🙂
Selenium은 웹 브라우저를 실제로 실행하고 웹 페이지와 상호작용하게 된다. 즉, JavaScript와 같이 동적으로 구성한 컨텐츠도 쉽게 처리할 수 있게 된다. 사용자 상호작용 모방의 의미는 유저가 사용하듯이 웹 페이지에 로그인 혹은 회원가입, 양식 제출 등의 상호작용을 똑같이 따라하여 자동화할 수 있다는 이야기이다. 실제로 로그인 자동화 기능을 구현할 때, 태그의 id값만 있으면 이를 이용해 로그인을 할 수 있었다.
BAD 😑
모든 기능에는 Trade-off가 있기 마련. Selenium의 단점으로 첫 번째는 브라우저 호환성이다. 흔히 자주 사용하는 'Chrome' 브라우저의 경우를 봐도 크롬 Driver 버전이 크롬 웹 버전과 일치하지 않는다면 오류가 발생하며 작동자체가 되지 않는다. 따라서 주기적으로 최신 드라이버로 업데이트해줄 필요가 있다. 또한, 상대적으로 무겁고 느리다는 단점이 있으며, 캡차나 인증처리와 같은 보안 기능을 우회하는 것이 어려울 수 있다. 실제로 업무에서 공인인증서 로그인을 selenium을 통해 시도해보았으나, 인증서 비밀번호를 작성하는 입력란이 보안 이슈로 자동 입력을 허용하지 않아서 실패했던 경험이 있다.
Crawling vs Scraping
웹 Crawling과 Scraping의 차이를 아는가? 나도 비슷한 줄 알았지만 약간은 다른 개념이다.
웹 스크래핑 (Web Scraping)
웹 크롤링 (Web Crawling)
요약하면 스크래핑은 특정 웹 페이지에서 데이터를 추출하고 분석하는 것이며 크롤링은 여러 웹 페이지를 돌아다니면서 데이터를 수집하는 것을 말한다.
당연 Web Scraping에 특화된 라이브러리도 존재한다.
(자바 로고에서 저 컵에 담긴게 커피라고 알고 있다. 근데 스프를?)
Java로 작성된 HTML 파싱 및 웹 스크래핑을 위한 오픈 소스 라이브러리
GPT에게 Jsoup에 대해 알려달라고 하면 다음의 내용을 얻을 수 있다.
요약하면 Jsoup은 HTML과 같은 정적 문서를 파싱하는데에는 최적의 성능을 자랑하지만 자바스크립트를 실행시킬 수 없기 때문에 동적 문서에는 적합하지 않다. 따라서 웹의 구성과 활용목적 및 요구사항에 맞게 사용하는 것이 중요하다.
물론 함께 사용할 수도 있다. 동적으로 로딩되는 데이터를 처리해야 하는 경우 Selenium을 사용하여 데이터가 모두 로드된 후의 최종 HTML을 가져올 수 있다. 이렇게 가져온 HTML을 Jsoup에 전달하여, Jsoup의 강력한 파싱 및 데이터 추출 기능을 이용하는 것이다. 이 방법은 웹 페이지에서 동적으로 생성된 데이터와 정적 데이터 모두를 효과적으로 처리하고자 할 때 유용할 것이다.