java.net 패키지의 URL 클래스는 월드 와이드 웹(www)상의 리소스(파일, 디렉터리 또는 참조)를 가리키는 통합 자원 위치(Uniform Resource Locator)를 표현합니다.
이 클래스가 제공하는 openStream() 메서드는 현재 객체가 나타내는 URL에 대한 연결을 열고, 해당 URL로부터 데이터를 읽을 수 있는 InputStream 객체를 반환합니다.
따라서 URL 클래스를 사용해 웹 페이지의 내용을 읽으려면 다음 세 단계만 거치면 됩니다.
- 읽고자 하는 웹 페이지의 URL을 생성자 매개변수로 전달하여 java.net.URL 객체를 생성합니다.
- openStream() 메서드를 호출하여 InputStream 객체를 얻습니다.
- 앞서 얻은 InputStream 객체를 매개변수로 전달하여 Scanner 객체를 생성합니다.
Scanner는 스트림을 토큰 단위로 읽어들이므로, 반복문과 함께 사용하면 웹 페이지의 전체 내용을 손쉽게 문자열로 조합할 수 있습니다. 이후 정규식을 활용하면 불필요한 HTML 태그까지 제거할 수 있습니다.
예제 코드
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());
// System.out.println(sc.next());
}
// StringBuffer에서 문자열 추출
String result = sb.toString();
System.out.println(result);
// 정규식으로 HTML 태그 제거
result = result.replaceAll("<[^>]*>", "");
System.out.println("웹 페이지 내용: " + result);
}
}
실행 결과
<html><body><h1>Itworks!</h1></body></html> 웹 페이지 내용: Itworks!
참고 사항
openStream()은 입출력 오류 발생 시 IOException을 던질 수 있으므로, 실무 코드에서는 try-catch 블록이나 try-with-resources 문으로 예외 처리를 해주는 것이 좋습니다. 또한 Scanner 대신 BufferedReader와 InputStreamReader를 조합하면 줄 단위로 읽을 수 있어 성능과 가독성 면에서 더 유리할 수 있습니다.