이 영역을 누르면 첫 페이지로 이동
일반인의 웹 개발일기 블로그의 첫 페이지로 이동

일반인의 웹 개발일기

페이지 맨 위로 올라가기

일반인의 웹 개발일기

웹 개발과 관련된 모든 이야기

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

  • 2023.01.02 16:12
  • 사이드 프로젝트/크롤링
반응형

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

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

 

웹 페이지 크롤링이란?

웹 페이지 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

반응형

'사이드 프로젝트 > 크롤링' 카테고리의 다른 글

[Spring Boot] Java로 웹 크롤링 하기 - Selenium  (0) 2022.12.26

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

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

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

    2022.12.26
다른 글 더 둘러보기

정보

일반인의 웹 개발일기 블로그의 첫 페이지로 이동

일반인의 웹 개발일기

  • 일반인의 웹 개발일기의 첫 페이지로 이동
반응형

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (47)
    • 사이드 프로젝트 (3)
      • 크롤링 (2)
    • 개발 이야기 (18)
      • MSA (7)
      • Spring Boot (3)
      • JPA (0)
      • Docker (1)
      • Javascript (2)
      • AWS (Amazon Web Services) (5)
      • Jenkins (0)
    • Database (4)
      • PostgreSQL (2)
      • MySQL (1)
      • Oracle (1)
    • 에러 정리 (4)
      • Docker (1)
      • JPA (1)
      • Python (1)
      • PostgreSQL (1)
    • 운영체제 (3)
      • Linux (3)
    • 게임 (8)
      • 마인크래프트(Minecraft) (2)
      • 팰월드(PalWorld) (6)
    • 워킹홀리데이 (6)
      • 일본 워킹 홀리데이 (6)

공지사항

인기 글

최근 글

정보

흔하디흔한개발자의 일반인의 웹 개발일기

일반인의 웹 개발일기

흔하디흔한개발자

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © 흔하디흔한개발자. Designed by Fraccino.

티스토리툴바