오늘은 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 |