본문 바로가기
JAVA공부/99-기타 라이브러리

[JAVA]Jsoup 라이브러리를 이용한 크롤링 - Jsoup 사용법

by 으노으뇨 2022. 11. 2.
728x90
반응형
SMALL

안녕하세요! 

오늘 포스팅은 Jsoup 라이브러리를 알아보려고 해요 

해당 라이브러리는

가장 편한 API 를 제공하며 HTML5 DOM 메서드와 CSS 선택기를 사용하여, URL을 가져오고 데이터를 추출 및 조작하기 매우 편리하다.

(출처 : 해당 Jsoup 홈페이지 https://jsoup.org/)

네 해당 홈페이지 메인에 저렇게 써있습니다. 고로 우리가 크롤링을 사용하기에 굉장히 편리한 기능을 제공해주는 라이브러리라는것을 알 수 있습니다. 

물론 가장 편리하고 빠른건 아니겠지만요ㅎㅎㅎ

그럼 한번 직접 사용을 해봅시다.

https://uno-kim.tistory.com/213

 

[JAVA]Jsoup 라이브러리를 이용한 크롤링 - Jsoup 사용법 + 라이브러리 저장하는 법

안녕하세요~! ㅎㅎ 오늘 포스팅은 그동안 크롤링를 하여 네이버 금융의 정보를 가져왔었는데 크게 사용되었던 라이브러리인 Jsoup 라이브러리 사용법 에 대해서 알아보겠습니다! 1. 라이브러리

uno-kim.tistory.com

라이브러리 설치는 위의 글을 통해서 진행해주시면 감사하겠습니다!! 다른 라이브러리도 메이븐을 통해서 설치할 때 

도움될수 있기에 한번쯤은 봐주시면 감사하겠습니다.


설명순서는

  1. 연결
  2. 자바스크립트와 유사성
  3. 기타등등의 방법

이렇게 크게 3가지로 나눌 수 있습니다.

물론 보조적으로 HttpConnection 클래스를 이용해서 웹에 연결하고 get/post 방식으로 접속시도도 할 수는 있지만

그것은 나중에 설명드리겠습니다. 

주로 사용하는 메서드와 사용법입니다.

이것만 아래 더 설명을 길게 작성했으니 꼭 아래 내용도 함께 봐주시면 감사하겠습니다.!!!

1. 우선 Url 연결 메소드
접속하고자 하는 Url 연결 Document docment = Jsoup.connect("https://finance.naver.com/").get(); Document doc  안에 해당 URL의 HTML5 소스가 모두 들어간다.
2. 자바스크립트와 같은 계열 메소드
아이디 가져오기 docment.getElementById(" /*아이디 입력*/"); JS 문법과 같이 DOM내부 객체의 ID를 통해서 해당 객체를 불어온다.
클래스 가져오기 docment.getElementsByClass(" /*클래스명입력*/"); Class 를 통해서 객체를 가져오며 Element이며 이후 get(idx) 메소드를 통해 node들을 다룰 수 있다.
태그로 가져오기 docment.getElementsByTag(" /*태그명 입력*/"); 태그명 <img> 이런 태그들만 쏙 가져올 수 있다.
속성(attribute)로 가져오기 docment.getElementsByAttribute(" /*속성명입력*/"); 특정 속성을 이용해서 찾을 수 있다. src, href, onClick 등등 이용하면 되며, 
이에 이슷한 속성이름을 이용해서 여러 매소드가 존재한다.
3. 기타등등의 방법 메소드
자유자재(??)로 가져오기 document.select( /*css쿼리넣어주세요*/ ); css쿼리를 통해서 객체를 가져온다.
클래스 : .클래스명
아이디 : #아이디
속성 : [속성]
태그 : 태그명
태그+특정속성 : a[href]

1. 연결

첫 번째로 가장 중요한 것은 연결을 위한 메소드를 설명드리겠습니다.

우선

package ㅎJavaTests;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class Jsoup1_15_3Test
{

	public static void main(String[] args) throws IOException
	{
		/* 네이버 금융을 연결하기 위한 방법 */
		Document doc = Jsoup.connect("https://finance.naver.com/").get();
		System.out.println(doc);
	}
}

위처럼 입력하고 실행한다면

사진과 같이 HTML의 모든 값들이 나왔습니다.


이제 연결은 되었고...

해당 뭉터기의 내용들을 이제 필요한 정보들만 가져오게 해보겠습니다.

2. 자바스크립트와 유사성

제가 크롤링 하는 본문에서는 select 함수를 이용해서 했습니다. 

해명? 아닌 이유는 이 포스팅을 보시는 분들이 대부분 저와 같이 초급 개발자 이시거나 처음 개발 프로젝트를

크롤링이라는 재미있는 주제로 선택? 하신분들 위주로 설명드리다보니까 본의아니게 엄청 간단한 설명으로 

진행하기위해 select() 함수를 작성했습니다.

하지만 해당 Jsoup을 사용하신 분들은 아시겠지만 Document 클래스는 Element클래스를 상속받고있으며 Element클래스는 Node클래스를... 등등 이렇게 상속받고있습니다.

살짝 말씀드리자면

Document 클래스는 Element, Node로부터 상속받은 클래스 이므로 이것을 활용하기만 하면 엥간한 HTML 요소들을 컨츄롤 가능하다.

이렇게 되겠습니다.

수 많은 포스팅들을 보면서 다양한 사람들의 Jsoup 라이브러리 활용하는것을 보았는데

결국 공통된 결과는

본인이 보기 편하게 자유자재로 어떻게든 정보를 가공 했는가가 중요한 것입니다.

따라서 이번 포스팅에서는 JavaScript와 유사성을 강조하면서 설명드리고 

이하 내용으로는 기타등등의 방법으로 데이터들을 가공해보겠습니다 

잡설이 길었네요...

자바스크립트와 유사성?

우선 이게 무슨말인가 보아하니

개인적으로 저는 웹개발 유지보수업무 또는 디버깅 또는 개발을 할 때 웹에서 개발자모드를 항상킵니다.

이런식으로 웹에 관한 화면은 더블모니터를 이용해서 상하로 열고 있으며 

실제로는 현재 세개의 모니터를 이용해서 포스트를 작성하고 있습니다.

주로 집에서 개발할땐 3개의 모니터로 개발합니다.

따라서 개발자모드를 통해서 해당 소스를 가져오거나 수정하고싶을땐

컨트롤  시프트 C를 눌러서 원하는 부위를 누르고

해당 값의 클래스나, 아이디를 얻어낸후

이처럼 콘솔창에 

document..getElementById('_topItems1');

이런식으로 해당 엘리먼트에 대한 정보를 가져오는 방법도 있습니다.

이 설명을 위해서 오래걸렸는데요,

맞습니다. Jsoup에서도 똑!!!같이 가능합니다.!!!!

		Document document = Jsoup.connect("https://finance.naver.com/").get();
		System.out.println(document.getElementById("_topItems1"));

이렇게 document로 똑같이 변수명을 설정하고 한다면

거의 유사한 값을 가져 올 수 있음을 알 수 있습니다.

그럼

해당 차일드 노드들(자식노드들) 에대해서 값을 얻는 JS 인

document.getElementById('_topItems1').children 에 대해서는

자바스크립트와 똑같다... 라는 결과를 얻어 낼 수 있습니다.

이정도면 자바스크립트에 대해서 어느정도 알고 다를줄 알겠다! 하면 바로 이해가 되실겁니다.

이제 자바스크립트와 다르고 더욱 강력한(??) 기능에 대해 설명하겠습니다. 쓸만한지 안한지는 

보시는 분께서 판단해주세요 제가봤을때 강력하네요;;

바로 우리가 HTML 내 소스에 Attribute 라는 속성태그가 있습니다.

이것은 조금 애매모호한데

빨강동그라미 안에 있는 것들로 대략적으로 생각하시면 편하겠습니다.!!!

이걸 해당 라이브러리로 어떻게 사용하느냐?!

우선 얼마 안나올것같은 저기 charset 이라는 어트리뷰트(속성)을 사용해서 검색해보겠습니다. ㅎㅎ

이렇게 나옵니다!!! 

조금 이것을 응용한다면 아래소스와같이

//모든 하이퍼링크 텍스트 정보를 가져오고싶다.
document.getElementsByAttribute("href")
//소스들을 가져오고 싶다.
document.getElementsByAttribute("src")

등등 해당 정보들을 가져와서 본인만의 DB를 두둑하게 챙기는 방법이 있겠습니다.

그리고 또 마지막으로 태그로 만 가져오는 방법에 대해서 알려드리겠습니다.

??? : 아 ㅋㅋ 난 모르겠고 이미지소스만 다 가져와서 내 DB 채우고 싶다고 ㅋ

이러신 아~주 액기스만 쏙쏙 가져가고 싶으신 분들이 있으실겁니다!!!

그분들은

document.getElementsByTag("img")

이 코드를 이용하시면

이렇게 해당 페이지의 이미지 소스를 몽땅 가져올 수 있습니다.

물론 주소값을 가져오는거지 해당 소스를 다운받거나 하는 방법에 대해서는 나중에 설명 드리겠습니다.!!!!

ㅎㅎㅎㅎ

그리고 좀 더 재미있는 것은 해당 속성들의 내용들을 통해서 

해당 엘리먼트 객체를 가져올 수 있는 매서드도있으니 한번은 사용해 보시면 되곘습니다. ㅎㅎㅎ

이렇게 두 번째로 Javascript와 똑 닮은 문법에 대해서 알아보았습니다.


3. 기타등등의 방법으로 사용하기

이번 마지막에는 제가 기타등드으이 방법으로 사용하는 방법에 대해서 설명드리겠습니다.

기존 제 글들을 보신분들이라면 아시겠지만 

제가 크롤링을 할때는 select() , attr() , text() 등등의 메소드를 사용했습니다.

우선 앞서 말씀드린것과 같이 자바스크립트문법을 모르는 분들에게 

getElement.... attribute 어쩌고... 이렇게 한다면 조금 어렵게 느껴지실 수 있다고 생각하고

저도 은근 그게 편하다고 생각해서 그렇게 했습니다.

크게 파싱하는 방법에 대해서 정답은 없습니다. 다만 예외가 가장적으며 빠르고, 간단명료한 소스가 좋은 소스라고 생각하기에 이용자에 맞는 소스를 작성하기만 하면될 것같습니다.

또는 회사나 단체의 규칙을 지키면 될 것 같습니다.

이번에 설명드릴것은

select() 메소드 입니다.
??? : 겨우 메소드 하나쓰는데 기타등등이라고 하고 혼자 무슨 필살기마냥 설명하는거냐

라고 생각 하실 수 있는데 거의 맞습니다.

왜냐하면 해당 select 기능이 querySelector 의 기능과 흡사하며 , 더욱 강력하고 넓은 기능을 구현 할 수있기 때문입니다.

그게 무슨 말이냐면

select만 사용해서 우리가 원하는 단계와 객체까지 접근이 가능합니다.

1. 태그 명만 썼을때

document.select("img")

2. 클래스명을 "." 붙여서 썼 을 때

document.select(".section_strategy")

3. 아이디 이름을 #붙여서 썼을 때

document.select("#_topItems1")

4. 태그와 해당 attribute를 조건주어 검색할 때

document.select("a[href]")

5. attribute 값만 검색할때

document.select("[onClick]")

정말 슈퍼 강력하지 않나요??? 제가 봤을땐 경이롭습니다.

그리고 심지어 자기네들도

Find elements that match the {@link Selector} CSS query, with this element as the starting context. Matched elements
     * may include this element, or any of its children.
     * <p>This method is generally more powerful to use than the DOM-type {@code getElementBy*} methods, because
     * multiple filters can be combined, e.g.:</p>
     * <ul>
     * <li>{@code el.select("a[href]")} - finds links ({@code a} tags with {@code href} attributes)
     * <li>{@code el.select("a[href*=example.com]")} - finds links pointing to example.com (loosely)
     * </ul>
     * <p>See the query syntax documentation in {@link org.jsoup.select.Selector}.</p>
     * <p>Also known as {@code querySelectorAll()} in the Web DOM.</p>

설명으로 친절하게 알려주고 있고, getElementBy절보다 훨씬 강력하다고 설명하고 있답니다.



마치며...

이렇게 우리는 Jsoup 라이브러리를 간다하게 맛보기 정도로 3가지 방법에 대해 알아 보았습니다.

좀더 Deep 하게들어가면 파일을 읽고, HttpConnection 막 연결도하고 쿠키값도, 그리고 기존 HTML 소스도 변경하고 또 그걸 또 연결하고 html 파일 가져와서 열수도있고 ,,,

등등 수 많은 기능들이 있지만 우리가 원하는 기본 크롤링 기능에 대해서 저와 같이 코딩을 처음 접하고

적은 지식의 코더 희망꾼들에게 맞춤의 내용이지 않을까 싶어서 선별했습니다.

도움이 되었다면 많이 사용해주시고 틀린부분이나 부족한 부분이있다면 댓글달아주시면 바로바로 사과말씀과 수정하겠습니다.

지금까지 긴글 읽어 주셔서 감사합니다.

다음 포스팅은 엑셀관련된 라이브러리와 아까 이미지 파일에 대해서 다운로드 받는 방법에 대해서 알려드리겠습니다.

아직 크롤링은 끝난게 아닙니다.

모든 세상의 데이터를 긁고 자산화를 하고,, 

이상 긴글 봐주셔서 감사합니다.!!!

728x90
반응형
LIST

댓글