Java

[Java/Spring Boot] Java로 웹 크롤링 해보기 (Naver 날씨)

lucy1215 2023. 2. 22. 16:00
728x90
반응형

오늘은 Java로 웹 크롤링을 해보았다.

보통 웹 크롤링은 Python의 Beautiful Soup 라이브러리를 사용해서 많이 하는데, 그 이유는 웹 크롤링에 대한 가장 쉬운 접근 방법 중 하나이기 때문이다.

물론 다른 프로그래밍 언어들로도 웹 크롤링을 할 수 있다.

 

나는 예전부터 Java로 웹 크롤링을 해보고 싶었기 때문에 Java로 해보았다.

 

Java로 웹 크롤링을 하기 위해서는 Jsoup 라이브러리를 이용해야 한다.


Jsoup이란?

Jsoup은 HTML 파싱 Java 라이브러리이다.

DOM, CSS 및 JQuery와 같은 방법을 사용하여 데이터를 추출하고 조작하는 API를 제공한다.

 

주로 정적인 웹 페이지를 파싱 하고자 하는 경우, 간단하게 HTML을 가져와 파싱을 할 수 있는 라이브러리이다.

 

 

먼저, Jsoup 라이브러리를 이용하려면  project에 의존성 주입을 해야 한다.

 

아래와 같이 pom.xml에  Jsoup 라이브러리를 적용시켜 주면 된다.

 

Jsoup의 의존성 주입 코드는 아래의 페이지에서 볼 수 있다.

https://mvnrepository.com/artifact/org.jsoup/jsoup

 


 

다음은 크롤링하고 싶은 사이트의 구조를 봐야 한다.

나는 시간별 날씨(맑음, 구름 많음, 흐림 등등)를 알고 싶어서 그 부분에 대한 구조를 확인해 보았다.

 

 

네이버 날씨 사이트 :  https://weather.naver.com/today 에서 빨간색으로 박스 친 부분에 대한 정보를 가져올 것이다.

 

 

이 부분의 구조를 확인해 보면

날짜(오늘, 내일, 글피) -> 시간(15시, 16시,,,) -> 날씨(맑음) 

이 3가지의 정보를 모두 가져오려면

scroll_area -> weather_table_wrap -> _cnTimeTable안에 있는 것을 볼 수 있다.

 

구조를 확인완료 했으면 이제 하나하나씩 코딩하면 된다.

 

 

 

1. Jsoup을 이용하여 Document에 저장

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

static void crawl() throws IOException {
		
		String WeatherURL = "https://weather.naver.com/today";
        
		//WeatherURL로부터 HTML 문서 가져오기
		Document doc = Jsoup.connect(WeatherURL).get();
        
		System.out.println(doc.toString());
        
}

 

url이 잘 가져와졌는지 확인해 보기 위해 console에 출력해 보았다.

이렇게 날씨 페이지의 HTML이 잘 나왔다면 URL이 잘 가져와진 것이다.

 

 

이제 원하는 정보를 가져오도록 해보겠다.

 

 

 

2. 원하는 태그 선택

scroll_area 밑에 weather_table_wrap 밑에 _cnTimeTable에 있는 요소를 가져오도록 하였다.

class명 앞에는 .을 붙여야 한다. (id 명 앞에는 #을 붙여야 한다.)

//본문 HTML 요소 가져오기
Elements elements = doc.select(".scroll_area . weather_table_wrap ._cnTimeTable");

 

 

 

3. 데이터 파싱

공백을 기준으로 str배열에 요소들을 저장하였다.

//공백을 기준으로 데이터 나누기
String[] str = elements.text().split(" ");

 

요소가 잘 저장이 되었는지 출력해 보았다.

for(int i =0;i<str.length;i++) {
	System.out.println(str[i]);
}

 

출력결과

결과를 보면 오늘, 시간, 날씨 모두 잘 출력된 것을 볼 수 있다.

 

 

 

전체 코드

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

import java.io.IOException;

static void crawl() throws IOException {
		
		String WeatherURL = "https://weather.naver.com/today";
        
		Document doc = Jsoup.connect(WeatherURL).get();
        
		Elements elements = doc.select(".scroll_area .weather_table_wrap ._cnTimeTable");
		
		String[] str = elements.text().split(" ");
		
		System.out.println(str.length);
		for(int i =0;i<str.length;i++) {
			System.out.println(str[i]);
		}
        
}

 

+추가로 조건을 이용해 특정한 요소만 가지고 오고 싶을 때는 if문을 써서 가져올 수 있다.

 

 


Java로 웹 크롤링을 해보는 과정을 해보았다.

크롤링은 말로만 들었을 때 어려워 보였지만, 막상 직접 해보니 생각보다 쉽고 어렵지 않다는 것을 알 수 있었다.

필요할 때 종종 이용할 수 있을 것 같다.

다음에는 동적인 웹 페이지를 크롤링 해보고 싶은 생각이 들었다.

 

=> 웹 크롤링을 사용해 정보를 가져오려면 사이트의 구조를 확실하게 파악하고 있어야 한다!

 

반응형

'Java' 카테고리의 다른 글

[SpringBoot] 이미지(파일) 저장  (0) 2024.07.30
[JPA] JPA란?  (0) 2024.07.28