본문 바로가기

Study/Java

Jsoup 사용하여 웹페이지 크롤링하기

Jsoup은 Java의 라이브러리로 웹 문서에 대한 크롤링 기능을 제공한다.

 

Maven Repository에서 Jsoup을 검색하면 여러 목록이 보이는데 거기에서 "Jsoup Java HTML Parser"를 클릭하면 다음과 같이 라이브러리를 다운로드 할 수 있는 페이지로 연결된다.

 

 

최신 버전중에 사람들이 많이 다운로드받은 1.13.1 버전을 받아 사용하였다.

 

 

Maven이나 Gradle 프로젝트였다면 의존성 관리를 통해 추가해줄 수 있지만, 순수 자바로 할 것이기 때문에 jar파일을 다운로드 해주었다.

 

프로젝트 구조에서 모듈 -> 종속요소에 다운로드 받은 jar 파일을 넣어주고 적용한다.

 

그러면 Jsoup을 사용할 준비가 된 것이다.

 


파일 구조는 다음과 같다.

 

 

크롤링할 자료는 어떤 블로그의 제목과 글 내용이다.

 


DTO 작성

 

크롤링한 자료를 리스트형태로 반환해줄 함수를 작성할 것이기 때문에 이 리스트의 자료형이 될 BlogDto를 작성한다.

 

package com.dto;

public class BlogDto {

    private String title;
    private String contents;

    public BlogDto() {
    }

    public BlogDto(String title, String contents) {
        this.title = title;
        this.contents = contents;
    }

    public String getTitle() {
        return title;
    }

    public String getContents() {
        return contents;
    }

    @Override
    public String toString() {
        return "제목: " + title + "\n" +
               "내용: " + contents + "\n" +
               "--------------------------------------------";
    }
}

 


다음으로 크롤러를 작성할 것이다. 크롤링할 정보는 HTML 태그의 종속관계를 따져서 써야한다.

 

package com.crawler;

import com.dto.BlogDto;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Crawler {

    public static List<BlogDto> getBlog() throws IOException {

        List<BlogDto> list = new ArrayList<>();

        Document doc = Jsoup.connect("https://blossom6729.tistory.com").get();

        Elements titles = doc.select("div.post-item a span.title");

        Elements contents = doc.select("div.post-item a span.excerpt");

        for (int i = 0; i < 8; i++) {
            Element title = titles.get(i);
            Element content = contents.get(i);

            String titleStr = title.text();
            String contentStr = content.text();

            BlogDto dto = new BlogDto(titleStr, contentStr);
            list.add(dto);
        }

        return list;

    }
}

반복문의 숫자 범위를 8로 지정한 이유는 8개가 해당 페이지에서 보이는 최대 컨텐츠 개수이기 때문이다.

 

숫자를 맞춰주지 않으면 익셉션이 발생하므로 주의해야 한다.

 

추가로 이 함수는 static(정적)이기 때문에 어느 곳에서나 접근할 수 있다.


이제 메인함수에서 작동하는지 살펴볼 것이다.

package com;

import java.io.IOException;

import static com.crawler.Crawler.getBlog;

public class Main {

    public static void main(String[] args) throws IOException {

        for (int i = 0; i < 8; i++) {
            System.out.println(getBlog().get(i).toString());
        }

    }
}

 

마찬가지로 반복문의 범위를 8로 지정해주었다.

 

 

잘 출력 되는 것을 확인할 수 있다.