티스토리 뷰

안녕하세요. 오늘은 자바에서 웹 페이지를 크롤링 해서 필요한 데이터를 가져올 수 있는 Jsoup에 대해서 포스팅 해보려고 합니다. 크롤링이 무엇인지에 대한 간단한 내용과 간단한 예제를 통해 데이터를 출력하는 것을 진행해보겠습니다.


1. 크롤링(Crawling) ?


크롤링이란 사전적으로 기어다니는 것을 뜻하는데, 웹(Web) 상을 돌아다니면서 정보를 수집하는 행위를 뜻합니다.

크롤링의 대상은 웹 상의 자원들이며, 이것들은 정적인 문서가 될 수 있고, API와 같은 서비스가 될 수가 있습니다. 어떤 것이라도 다수의 데이터를 수집하고, 수집된 데이터를 토대로 필요한 정보만 추출하는 것을 크롤링이라고 부릅니다.



2. 크롤링 라이브러리


크롤링을 위한 다양한 라이브러리들이 존재하는데, 자신에게 맞는 라이브러리를 찾아 적용하면 됩니다. 대표적으로 데이터를 수집할 수 있는 라이브러리에는 Beautiful Soup, 자바 버전인 Jsoup가 있고, 브라우저를 이용한 Selenium 등이 있으며, 이번 포스팅에서는 Jsoup를 사용해서 크롤링 하는 방법에 대해서 포스팅 했습니다.



3. 크롤링 매커니즘


크롤링 매커니즘은 대략적으로 아래의 단계를 통해서 진행됩니다.


1) 대상 선정 -> 2) 데이터 로드 -> 3) 데이터 분석 -> 4) 데이터 수집



4. Jsoup 사용


Jsoup를 사용하기 위해서는 https://jsoup.org/download 에 접속해서 아래와 같이 jar파일을 받아서 프로젝트에 jar파일을 추가해줍니다.

혹시 모르시는 분들을 위해서 ( 해당 프로젝트 우클릭 > Properties > Java Build Path > Add External JARs에서 다운받은 jar파일을 추가해주면 됩니다. )

이제 Jsoup를 사용할 준비는 완료 되었으니, 간단한 예제를 통해서 가져온 데이터를 가공해서 콘솔에 출력하는 것을 확인 해보겠습니다.


package test;

import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupParser {

	/*
     *	Document 클래스 : 연결해서 얻어온 HTML 전체 문서
     *	Element 클래스  : Documnet의 HTML 요소
     *	Elements 클래스 : Element가 모인 자료형
	 */
	
	public static void main(String[] args) {
		// Jsoup를 이용해서 네이버 스포츠 크롤링
		String url = "https://sports.news.naver.com/wfootball/index.nhn";
		Document doc = null;
		
		try {
			doc = Jsoup.connect(url).get();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		// 주요 뉴스로 나오는 태그를 찾아서 가져오도록 한다.
		Elements element = doc.select("div.home_news");
		
		// 1. 헤더 부분의 제목을 가져온다.
		String title = element.select("h2").text().substring(0, 4);

		System.out.println("============================================================");
		System.out.println(title);
		System.out.println("============================================================");
		
		for(Element el : element.select("li")) {	// 하위 뉴스 기사들을 for문 돌면서 출력
			System.out.println(el.text());
		}
		
		System.out.println("============================================================");
	}

}


위의 코드를 살펴 보면 url을 통해서 파싱할 웹 페이지를 선정하고, connection을 통해서 데이터를 가져옵니다. 그리고 나서 각각의 select문을 사용해서 필요한 데이터를 추출해서 출력하는 예제입니다. 그 결과는 아래와 같습니다.


selector를 사용해서 가져올 때 각각의 애트리뷰트 및 id 또는 class를 지정해서 가져올 수 있는데 아래와 같이 사용하면 됩니다.


ex) select(tag.className) >> 클래스 명을 지정해서 해당하는 데이터를 가져옵니다.

     select(tag#id) >> id를 지정해서 해당하는 데이터를 가져옵니다.

     select(tag[attribute]) >> 애트리뷰트를 지정해서 해당하는 데이터를 가져옵니다.

     select(parent Tag > child Tag) >> 부모 태그의 하위 자식태그를 지정해서 해당하는 데이터를 가져옵니다.


그 외, 지원되는 다양한 기능에 대해서 알고 싶으면 다음의 참조 링크를 확인하시면 됩니다.


노드 : https://jsoup.org/apidocs/org/jsoup/nodes/Node.html

엘리먼트 : https://jsoup.org/apidocs/org/jsoup/nodes/Element.html


이것으로 크롤링의 간단한 내용 및 사용 방법에 대해서 알아보았으며, 더욱 세밀하고 다양하게 데이터를 가공하고 싶으면 위의 API 문서를 참조해서 진행하면 됩니다.  포스팅을 마치도록 하겠습니다. : )