반응형

이번 프로젝트는 유독 다른 웹 페이지의 정보들이 많이 필요했는데

그래서 웹 페이지 크롤링해야 되는 작업이 많았다.

 

웹 페이지 크롤링이란?

웹 페이지 HTML을 그대로 가져와서 필요한 모든 정보들을 추출해 내는 행위

프로젝트에서 웹 크롤링을 어떤 언어로 할지 고민을 좀 하긴 했다.

 

내가 사이드 프로젝트에 합류하기 전에

팀원이 작성해둔 크롤링 파이썬(Python) 코드가 있었지만

 

앞으로 내가 개발하고 운영해야 하기 때문에 자바로 해야 더 효율적이라는 판단을 내렸다.

그래서 내 맘대로 Jsoup을 사용하기로 했다.

 

자바(Java)를 사용해서 개발중이라

웹 크롤링 관련 라이브러리를 찾아보니

Jsoup 라이브러리를 찾을 수 있었다.

Jsoup

Jsoup 공식 페이지를 들어가서 보니까

 

사용법도 어렵지 않아 보이고

빠르게 적용 및 사용이 가능할 듯 보인다.

 

jsoup: Java HTML parser, built for HTML editing, cleaning, scraping, and XSS safety

jsoup: Java HTML Parser jsoup is a Java library for working with real-world HTML. It provides a very convenient API for fetching URLs and extracting and manipulating data, using the best of HTML5 DOM methods and CSS selectors. jsoup implements the WHATWG H

jsoup.org

 

JSoup 라이브러리 적용 및 사용하기

1. 예제 살펴보기

공식 페이지를 보면 알겠지만

HTML5 DOM 메소드CSS 선택자를 지원하고

오픈소스라 부담 없이도 사용이 가능할 듯하다.

 

나와있는 예제를 보면

Document doc = Jsoup.connect("https://en.wikipedia.org/").get();
log(doc.title());
Elements newsHeadlines = doc.select("#mp-itn b a");
for (Element headline : newsHeadlines) {
  log("%s\n\t%s", 
    headline.attr("title"), headline.absUrl("href"));
}

 

connect 메소드로 크롤링할 URL을 연결하고

get 메소드로 document를 가져온다.

 

긁어온 document에서

select 메소드를 사용해서 element를 찾으면 된다.

 

딱 봐도 엄청 간단하게 사용이 가능하다!!

 

2. 라이브러리 추가하기 (Gradle, Maven)

Gradle, Maven 빌드 방법에 따라 다음과 같이 라이브러리 dependency를 추가한다.

 

  • Gradle (build.gradle)
implementation 'org.jsoup:jsoup:1.15.3'

 

  • Maven (pom.xml)
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.15.3</version>
</dependency>

 

이제 Jsoup을 사용할 준비는 끝났다!

 

3. Jsoup 사용하기

Connection 객체를 반환하는 메소드와

Elements 객체를 반환하는 메소드를 구현해봤다.

public static Connection getJsoupConnection(String url) throws Exception {		
	return Jsoup.connect(url);
}

public static Elements getJsoupElements(Connection connection, String url, String query) throws Exception {
    Connection conn = !ObjectUtils.isEmpty(connection) ? connection : getJsoupConnection(url);
    Elements result = null;

    result = conn.get().select(query);

    return result;
}

 

만든 메소드를 가지고 실제로 사용을 해보면

String viewerUrl = "http://test";
String query = "#id";

Elements selects = CrawlingUtils.getJsoupElements(null, viewerUrl, query);

System.out.println(selects.get(0).text());
System.out.println(selects.get(0).html());
System.out.println(selects.get(0).children());
System.out.println(selects.get(0).parent());
System.out.println(selects.get(0).parent().previousElementSibling());

 

라이브러리 자체에서 다양한 기능들을

제공해주고 있기 때문에

프로젝트에 많은 도움이 되었다.

 

4. Jsoup 라이브러리의 한계

계속해서 크롤링을 잘하다가

정말 큰 문제가 발생했다😱

 

특정 페이지에서 document는 잘 받아오지만

element를 제대로 받아오지 못한다.

 

알고 보니 Jsoup은

동적 페이지는 크롤링을

하지 못한다고 한다.....😭

 

어쩐지 순조롭다 싶었네

 

해결하기 위해 구글링을 해보니

Jsoup으로는 안 되는 것 같다....

 

다행히 또 다른 라이브러리인 Selenium이 있는데

 

Selenium은 동적 페이지도 크롤링이 가능하다고 한다.

 

 

[Spring Boot] Java로 웹 크롤링 하기 - Selenium

지난번 포스팅에서는 Spring Boot 환경에서 웹 크롤링을 하기 위해 Java 라이브러리인 Jsoup을 어떻게 적용하고, 사용하는지에 대해 확인하면서 정적인 페이지만 크롤링 가능하다는 점을 알게 되었다

diary-developer.tistory.com

반응형