웹 스크래핑은 웹 페이지에서 필요한 데이터를 자동으로 추출하는 기술로, 데이터 분석이나 웹 프로젝트를 진행하는 데 매우 유용합니다. Java 언어로 웹 스크래핑을 진행할 때 많이 사용하는 라이브러리가 바로 Jsoup입니다.
본 글에서는 Jsoup을 활용한 웹 스크래핑의 개념과 실제 구현 방법을 상세히 설명하겠습니다.
![]()
Jsoup이란 무엇인가?

Jsoup은 Java로 개발된 HTML 파서로, 웹 페이지의 HTML 문서를 손쉽게 가져오고, 필요한 데이터를 추출할 수 있도록 돕는 오픈 소스 라이브러리입니다. Jsoup을 사용하면 웹 페이지의 DOM(Document Object Model) 구조를 분석하여 원하는 데이터에 접근할 수 있으며, CSS 선택자를 사용해 특정 요소를 쉽게 찾을 수 있습니다.
이를 통해 개발자는 웹 페이지의 내용을 데이터베이스에 저장하거나, 다른 형태로 변환하여 활용할 수 있습니다. Jsoup의 주요 기능은 다음과 같습니다.
| 기능 | 설명 |
|---|---|
| HTML 파싱 | 웹 페이지의 HTML을 파싱하여 DOM 구조를 생성합니다. |
| 데이터 추출 | CSS 선택자를 사용하여 필요한 데이터(텍스트, 링크, 이미지 등)를 추출합니다. |
| 데이터 변환 | 추출한 데이터를 원하는 형식으로 변환하여 출력할 수 있습니다. |
| HTTP 요청 | 외부 웹 페이지에 HTTP 요청을 보내고 응답을 받을 수 있습니다. |
Jsoup 라이브러리를 활용하면 복잡한 웹 데이터 수집 작업을 간단하게 수행할 수 있으며, Java 환경에서도 웹 스크래핑을 손쉽게 구현할 수 있습니다.
Jsoup 설치 및 설정

Jsoup을 사용하기 위해서는 먼저 해당 라이브러리를 프로젝트에 추가해야 합니다. 일반적인 Java 프로젝트에서는 Jsoup의 JAR 파일을 다운로드하여 라이브러리 폴더에 추가하면 되지만, Spring Boot와 같은 현대적인 개발 환경에서는 Gradle 또는 Maven을 통해 의존성을 관리하는 것이 일반적입니다.
Gradle을 통한 Jsoup 설치
Gradle 기반의 프로젝트에서 Jsoup을 사용하려면, build.gradle 파일에 다음과 같은 의존성을 추가해야 합니다.
groovy
dependencies {
implementation 'org.jsoup:jsoup:1.14.3'
}
이 코드를 추가한 후, Gradle을 새로고침하여 의존성을 업데이트합니다. 이로써 Jsoup 라이브러리를 프로젝트에서 사용할 준비가 완료됩니다.
Maven을 통한 Jsoup 설치
Maven을 사용하는 경우, pom.xml 파일에 다음과 같은 의존성을 추가하시면 됩니다.
xml
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.14.3</version>
</dependency>
이제 프로젝트에서 Jsoup을 사용할 수 있게 되었습니다.
웹 크롤링의 기본 개념

웹 스크래핑이나 웹 크롤링을 시작하기 전에, 웹 페이지의 robots.txt 파일을 확인하는 것이 필요합니다. 이 파일은 웹 사이트의 관리자에 의해 생성되며, 어떤 페이지가 크롤링 가능한지, 어떤 페이지는 크롤링하지 말아야 하는지를 명시합니다.
따라서 크롤링을 진행하기 전, robots.txt 파일을 통해 해당 웹 사이트의 규칙을 확인해야 합니다. 예를 들어, Yahoo Finance 웹사이트의 robots.txt 파일은 다음과 같은 내용을 포함하고 있습니다.
User-agent: *
Disallow: /robots.txt
이 경우, 모든 크롤러가 해당 웹 사이트의 모든 페이지를 크롤링할 수 있습니다. 하지만 각 사이트마다 다르게 설정될 수 있으니, 크롤링을 시작하기 전에 반드시 확인해야 합니다.
Jsoup을 이용한 웹 스크래핑 실습
이제 본격적으로 Jsoup을 사용해 웹 페이지에서 데이터를 스크래핑하는 방법을 살펴보겠습니다. 예를 들어, Yahoo Finance 웹사이트에서 Coca-Cola의 주식 데이터를 스크래핑한다고 가정하겠습니다.
이 데이터는 주식의 과거 기록을 포함하고 있으며, 주식 투자와 관련된 정보를 제공하는 데 유용합니다.
웹 페이지 연결 및 데이터 가져오기
Jsoup을 사용하여 웹 페이지에 연결하고 데이터를 가져오는 과정은 다음과 같습니다.
“`java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class WebScrapingExample {
public static void main(String[] args) {
try {
// Yahoo Finance의 Coca-Cola 주식 페이지 URL
String url = “https://finance.yahoo.com/quote/KO/history?p=KO”;
// Jsoup을 통해 웹 페이지에 연결하고 Document 객체에 저장
Document doc = Jsoup.connect(url).get();
// Document 객체의 내용을 출력
System.out.println(doc.title());
} catch (Exception e) {
e.printStackTrace();
}
}
}
“`
위의 코드에서는 Jsoup을 사용해 Yahoo Finance의 Coca-Cola 주식 페이지에 연결하고, 해당 페이지의 제목을 출력합니다. Jsoup.connect(url).get() 메소드를 통해 URL에 연결한 후, 웹 페이지의 HTML 내용을 Document 객체에 저장합니다.
| 단계 | 설명 |
|---|---|
| URL 설정 | 크롤링할 웹 페이지의 URL을 설정합니다. |
| Jsoup 연결 | Jsoup.connect(url).get() 메소드를 통해 웹 페이지에 연결합니다. |
| Document 객체 생성 | 가져온 HTML 내용을 Document 객체에 저장합니다. |
데이터 추출하기
이제 Document 객체에서 필요한 데이터를 추출하는 방법을 살펴보겠습니다. Yahoo Finance의 주식 데이터는 HTML 테이블 형식으로 제공되므로, 이 테이블을 파싱하여 원하는 정보를 추출할 수 있습니다.
“`java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class WebScrapingExample {
public static void main(String[] args) {
try {
String url = “https://finance.yahoo.com/quote/KO/history?p=KO”;
Document doc = Jsoup.connect(url).get();
// 테이블에서 tbody 가져오기
Elements tableRows = doc.select("table[data-test='historical-prices'] tbody tr");
for (Element row : tableRows) {
// 각 열의 데이터 추출
String date = row.select("td:nth-child(1)").text();
String open = row.select("td:nth-child(2)").text();
String high = row.select("td:nth-child(3)").text();
String low = row.select("td:nth-child(4)").text();
String close = row.select("td:nth-child(5)").text();
// 출력
System.out.println("날짜: " + date + ", 시가: " + open + ", 고가: " + high + ", 저가: " + low + ", 종가: " + close);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
“`
위의 코드에서는 Yahoo Finance에서 제공하는 주식 가격 데이터를 추출하여 각 날짜별로 시가, 고가, 저가, 종가를 출력합니다. CSS 선택자를 사용하여 테이블의 각 열을 손쉽게 선택하고, 필요한 데이터를 추출할 수 있습니다.
| 데이터 종류 | CSS 선택자 | 설명 |
|---|---|---|
| 날짜 | td:nth-child(1) |
각 행에서 첫 번째 열의 데이터를 가져옵니다. |
| 시가 | td:nth-child(2) |
각 행에서 두 번째 열의 데이터를 가져옵니다. |
| 고가 | td:nth-child(3) |
각 행에서 세 번째 열의 데이터를 가져옵니다. |
| 저가 | td:nth-child(4) |
각 행에서 네 번째 열의 데이터를 가져옵니다. |
| 종가 | td:nth-child(5) |
각 행에서 다섯 번째 열의 데이터를 가져옵니다. |
데이터 변환 및 출력
추출한 데이터는 원하는 형식으로 변환하여 출력할 수 있습니다. 예를 들어, CSV 파일 형태로 저장하거나 데이터베이스에 저장할 수 있습니다.
아래는 추출한 데이터를 CSV 형식으로 변환하여 출력하는 예시입니다.
“`java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.FileWriter;
import java.io.IOException;
public class WebScrapingExample {
public static void main(String[] args) {
try {
String url = “https://finance.yahoo.com/quote/KO/history?p=KO”;
Document doc = Jsoup.connect(url).get();
Elements tableRows = doc.select("table[data-test='historical-prices'] tbody tr");
FileWriter csvWriter = new FileWriter("coca_cola_stock_data.csv");
csvWriter.append("날짜, 시가, 고가, 저가, 종가\n");
for (Element row : tableRows) {
String date = row.select("td:nth-child(1)").text();
String open = row.select("td:nth-child(2)").text();
String high = row.select("td:nth-child(3)").text();
String low = row.select("td:nth-child(4)").text();
String close = row.select("td:nth-child(5)").text();
csvWriter.append(date + "," + open + "," + high + "," + low + "," + close + "\n");
}
csvWriter.flush();
csvWriter.close();
System.out.println("데이터가 coca_cola_stock_data.csv 파일에 저장되었습니다.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
“`
이 코드는 추출한 데이터를 CSV 파일로 저장하는 방법을 보여줍니다. FileWriter 클래스를 사용하여 파일을 생성하고, 각 데이터를 쉼표로 구분하여 저장합니다.
이와 같은 방식으로 데이터를 저장하면, 이후 데이터 분석이나 보고서 작성을 위한 자료로 활용할 수 있습니다.
| 단계 | 설명 |
|---|---|
| FileWriter 생성 | CSV 파일을 생성하기 위해 FileWriter 클래스를 사용합니다. |
| 데이터 저장 | 추출한 데이터를 파일에 쓰기 위해 append 메소드를 사용합니다. |
| 파일 닫기 | 모든 작업이 끝난 후 파일을 닫아 리소스를 해제합니다. |
결론
Jsoup을 활용한 웹 스크래핑 방법에 대해 알아보았습니다. Java 환경에서도 웹 페이지에서 필요한 데이터를 손쉽게 추출하고, 다양한 형식으로 변환하여 저장할 수 있다는 점이 매우 유용합니다.
웹 스크래핑을 진행할 때는 항상 웹 사이트의 정책을 준수하고, 불필요한 서버 부하를 발생시키지 않도록 주의해야 합니다. 실제로 웹 스크래핑을 진행할 때는 데이터의 변동성을 고려하여 스크래핑 코드를 주기적으로 점검하고, 사이트 구조의 변경에 대비해야 합니다.
Jsoup 라이브러리를 사용하여 다양한 웹 페이지에서 원하는 정보를 추출하는 재미를 느껴보시기 바랍니다. 이를 통해 데이터 분석 및 프로젝트에 큰 도움이 될 것입니다.