Java를 활용하면 웹 페이지의 내용을 여러 가지 방식으로 읽어올 수 있습니다. 이 글에서는 실무에서 가장 널리 사용되는 세 가지 방법을 예제 코드와 함께 자세히 살펴봅니다.
1. URL 클래스의 openStream() 메서드 사용하기
java.net 패키지의 URL 클래스는 월드 와이드 웹(Web)상의 리소스(파일, 디렉터리 또는 참조)를 가리키는 Uniform Resource Locator(URL)를 나타냅니다.
이 클래스의 openStream() 메서드는 현재 객체가 나타내는 URL에 대한 연결을 열고, 해당 URL에서 데이터를 읽을 수 있는 InputStream 객체를 반환합니다.
따라서 URL 클래스를 사용해 웹 페이지의 데이터를 읽으려면 다음 단계를 따릅니다.
읽고자 하는 웹 페이지의 URL을 생성자 매개변수로 전달하여 java.net.URL 클래스를 인스턴스화합니다.
openStream() 메서드를 호출하여 InputStream 객체를 얻습니다.
얻은 InputStream 객체를 매개변수로 전달하여 Scanner 클래스를 인스턴스화합니다.
예제 코드
import java.io.IOException;
import java.net.URL;
import java.util.Scanner;
public class ReadingWebPage {
public static void main(String args[]) throws IOException {
// URL 클래스 인스턴스화
URL url = new URL("https://www.something.com/");
// 지정한 페이지의 내용 읽기
Scanner sc = new Scanner(url.openStream());
// 결과를 담을 StringBuffer 인스턴스화
StringBuffer sb = new StringBuffer();
while(sc.hasNext()) {
sb.append(sc.next());
}
// StringBuffer에서 String 추출
String result = sb.toString();
System.out.println(result);
// HTML 태그 제거
result = result.replaceAll("<[^>]*>", "");
System.out.println("웹 페이지 내용: " + result);
}
}
실행 결과
<html><body><h1>Itworks!</h1></body></html> 웹 페이지 내용: Itworks!
2. Apache HttpClient 사용하기
HttpClient는 클라이언트 측에서 동작하며 HTTP 메시지를 주고받는 전송 라이브러리입니다. 최신 HTTP 표준을 준수하는 기능이 풍부하고 효율적인 구현을 제공합니다.
HTTP 프로토콜의 GET 요청은 지정된 URI를 통해 서버에서 정보를 조회하는 데 사용됩니다. GET 요청은 오직 데이터를 검색하기 위한 목적으로만 사용해야 하며, 데이터에 다른 부작용을 일으켜서는 안 됩니다.
HttpClient API는 GET 요청 방식을 나타내는 HttpGet 클래스를 제공합니다. GET 요청을 실행하고 웹 페이지의 내용을 가져오려면 다음 순서대로 진행합니다.
HttpClients 클래스의 createDefault() 메서드는 HttpClient 인터페이스의 기본 구현체인 CloseableHttpClient 객체를 반환합니다. 이 메서드로 HttpClient 객체를 생성합니다.
HttpGet 클래스를 인스턴스화하여 HTTP GET 요청을 생성합니다. 이 클래스의 생성자는 요청을 보낼 웹 페이지의 URI를 나타내는 문자열을 받습니다.
execute() 메서드를 호출하여 HttpGet 요청을 실행합니다.
응답 객체로부터 웹 사이트의 콘텐츠를 나타내는 InputStream을 다음과 같이 얻습니다.
httpresponse.getEntity().getContent()
예제 코드
import java.util.Scanner;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
public class HttpClientExample {
public static void main(String args[]) throws Exception {
// HttpClient 객체 생성
CloseableHttpClient httpclient = HttpClients.createDefault();
// HttpGet 객체 생성
HttpGet httpget = new HttpGet("https://www.something.com/");
// GET 요청 실행
HttpResponse httpresponse = httpclient.execute(httpget);
Scanner sc = new Scanner(httpresponse.getEntity().getContent());
// 결과를 담을 StringBuffer 인스턴스화
StringBuffer sb = new StringBuffer();
while(sc.hasNext()) {
sb.append(sc.next());
}
// StringBuffer에서 String 추출
String result = sb.toString();
System.out.println(result);
// HTML 태그 제거
result = result.replaceAll("<[^>]*>", "");
System.out.println("웹 페이지 내용: " + result);
}
}
실행 결과
<html><body><h1>Itworks!</h1></body></html> 웹 페이지 내용: Itworks!
3. Jsoup 라이브러리 사용하기
Jsoup는 HTML 기반 콘텐츠를 손쉽게 다룰 수 있도록 도와주는 Java 라이브러리입니다. DOM, CSS 선택자, jQuery와 유사한 방식의 장점을 결합하여 데이터를 추출하고 조작할 수 있는 매우 편리한 API를 제공합니다. WHATWG HTML5 명세를 구현하고 있으며, 현대 브라우저와 동일한 방식으로 HTML을 DOM으로 파싱합니다.
Jsoup 라이브러리를 사용해 웹 페이지의 내용을 가져오려면 다음 단계를 따릅니다.
Jsoup 클래스의 connect() 메서드는 웹 페이지의 URL을 받아 해당 페이지에 연결하고 Connection 객체를 반환합니다. connect() 메서드로 원하는 웹 페이지에 연결합니다.
Connection 인터페이스의 get() 메서드는 GET 요청을 실행하고 그 결과로 Document 클래스 객체 형태의 HTML 문서를 반환합니다. get() 메서드를 호출해 페이지에 GET 요청을 보냅니다.
얻은 문서의 본문 내용을 다음과 같이 문자열로 추출합니다.
String result = doc.body().text();
예제 코드
import java.io.IOException;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class JsoupExample {
public static void main(String args[]) throws IOException {
String page = "https://www.something.com/";
// 웹 페이지에 연결
Connection conn = Jsoup.connect(page);
// GET 요청 실행
Document doc = conn.get();
// 웹 페이지 본문(body) 내용 가져오기
String result = doc.body().text();
System.out.println(result);
}
}
실행 결과
It works!
어떤 방법을 선택해야 할까?
세 가지 방법은 각각 장단점이 있습니다. 간단한 작업이나 외부 라이브러리 없이 빠르게 구현하고 싶다면 openStream() 방식이 적합합니다. 헤더 설정, 타임아웃, 인증 등 HTTP 통신에 대한 세밀한 제어가 필요하다면 Apache HttpClient를 사용하는 것이 좋습니다. 반면 HTML 문서를 파싱하거나 특정 요소를 추출하는 등의 작업이 필요하다면 Jsoup이 가장 강력하고 편리한 선택입니다. 프로젝트의 요구 사항에 맞게 적절한 방법을 골라 활용해 보시기 바랍니다.