본문 바로가기
3.1 SpringBoot/Java

[Java] 웹 스크래핑하기 (Jsoup)

by Dohi._. 2024. 10. 5.
728x90

웹 스크래핑(Web Scraping): 웹 페이지에서 특정 데이터를 추출하는 기술입니다. 페이지의 HTML 코드를 분석하여 원하는 텍스트, 이미지, 링크 등 다양한 정보를 추출한 후 저장하는 기술

 

자바로 웹 스크래핑하기 위해서 필요한 jsoup 라이브러리를 사용하보겠습니다.

Jsoup라이브러리는 자바로 만들어진 HTML parser로

DOM 구조를 추적하거나 CSS 선택자를 사용하여 데이터를 찾아 추출할 수 있습니다.

HTML의 구조와 데이터를 손쉽게 관리 할 수 있게 도와주는 라이브러리이다.

 

Jsoup 공식사이트

https://jsoup.org/

 

SpringBoot에서 사용해보기 (Gradle기준)

(일반 java프로젝트에서는 lib폴더에 Jar를 넣으면된다. https://jsoup.org/download )

 

1. build.gradle의 Dependencies에 아래 코드를 넣어줍니다.

implementation 'org.jsoup:jsoup:1.18.1'

 

1-1 Maven 기준

<dependency>
  <groupId>org.jsoup</groupId>
  <artifactId>jsoup</artifactId>
  <version>1.18.1</version>
</dependency>

 

간단하게 프로젝트 식으로 불러오는 방법을 실습해보겠습니다.

 

우선 불러오고자 하는 사이트의 robots.txt를 확인합니다.

저의 경우는 야후의 finance를 스크래핑하고자 합니다.

https://finance.yahoo.com/robots.txt

 

우선 제가 스크래핑하고자 하는 경로가 robots.txt에서 금지하고 있는지 확인하고 

금지하고 있지 않을 경우 실행합니다 

저같은경우는 finance.yahoo.com/quote에서 Coke의 1달주기의 테이블을 스크래핑을 하고자 합니다.

	public static void main(String[] args) {

		try{
			Connection connection = Jsoup.connect("주소를 넣어주세요");
			Document doc = connection.get();
			Elements eles= doc.getElementsByAttributeValue("class","table yf-ewueuo noDl");
			Element ele = eles.get(0);// table 전체
			System.out.println(ele);

		}catch(IOException e){
			e.printStackTrace();
		}
    }

위의 코드를 간단하게 설명을 하고 결과를 보여드리고 끝내도록 하겠습니다.

 

실습하기전 알아두면 Jsoup 사용 정보 

 

Jsoup의 주요 클래스 

 Document 클래스

  • 연결해서 얻어온 HTML 전체 문서

Element 클래스

  •  Document의 HTML 요소
  • Element의 복수 클래스인 Elements가 따로 있다.

Jsoup 사용 문서  https://jsoup.org/apidocs/

 

 

Elements eles= doc.getElementsByAttributeValue("class","table yf-ewueuo noDl");  

key의 value를 찾아서 반환해주는 메소드인데 여기서 key는 class value는 table yf-ewueuo noDl입니다

실제 웹사이트를 보면  class에서 제가 원하는 테이블이 가지고 있는 value였기에 이렇게 설정하였습니다

 

 

 

우선 해당 코드를 돌리게되면 아래 사진과 동일하게 

값이 웹 스크래핑되어서 오는것을 알수있습니다.

 

자 이제 한번 원하는 방식으로 데이터를 변환하고 진짜 끝내봅시다.

우선 데이트를 봤을때 <thead> 다음에는 <tbody>가 나올 것입니다 

<tbody>가 저희에겐 필요한 정보 이기 때문에 해당 데이터를 추출해보겠습니다.

 

public static void main(String[] args) {
	try{
    	String URL = "주소";
		Connection connection = Jsoup.connect(URL);
		Document doc = connection.get();
		Elements eles= doc.getElementsByAttributeValue("class","table yf-ewueuo noDl");
		Element ele = eles.get(0);// table 전체
		Element tbody = ele.children().get(1); // 하위 정보중 2번째 추출(Tbody)
		for (Element tr : tbody.children()) {
			String text = tr.text();
			if(!text.endsWith("Dividend")){ //끝이 Dividend로 끝나지 않으면 버림
				continue;
			}
			String[] split = text.split(" ");
			String month = split[0];
			int day = Integer.parseInt(split[1].replace(",",""));
			int year = Integer.parseInt(split[2]);
			String dividend = split[3];
			System.out.println(year+"/"+month+"/"+day+"  ->  "+dividend);
			}
	}catch(IOException e){
		e.printStackTrace();
	}
}

 

자 해당코드를보면 ele는 테이블 전체였고

Element tbody = ele.children().get(1);로 테이블전체에서 tbody만 가져왔습니다.

그후 foreach문으로 각 row를 분리하였고 해당 row에서  Dividend로 끝난 경우에 데이터를 추출하는 방식입니다

해당 코드를 돌리면 다음과 같습니다.

 

 

원하는 방식으로 데이터를 조작도 가능합니다 :)

이렇게 Jsoup에 대해서 간단하게 실습을 해봤는데요 

읽어주셔서 감사합니다:)

 

실제로 해보고 싶으신 분은 https://finance.yahoo.com/ 들어가셔서

제코드에서 1(검색창)에 주식을 검색하시고 2(Historical Data)번을 눌러서 해당 링크를 넣어보세요!

 

해당 코드는 완전하게 이 해당 웹사이트를 위해서 만들어 진 코드입니다

해당 코드를 다양한 웹사이트를 맞춰서 실습해보시면 좋을 것 같습니다:)

 

 

 

 

 

728x90

'3.1 SpringBoot > Java' 카테고리의 다른 글

[Java/구현] 집합  (0) 2024.08.09
[Java/기초] Stream  (0) 2024.08.05
[Java/기초] 주석  (0) 2024.07.22
[Java/기초] 스트림  (0) 2024.07.21
[JAVA/기초] 람다식  (2) 2024.07.20

댓글