개인참고자료/자바(네트워크)

URL - URLConnection 클래스로 웹페이지 읽기

경진 2008. 7. 19. 21:19
 URLConnection 클래스로 웹페이지 읽기

URLConnection은 URL 주소의 내용을 읽어오거나, 반대로 URL 주소가 가리키는 웹 애플리케이션(CGI, 서블릿, JSP 등)에게 GET 방식이나 POST 방식으로 추가적인 정보를 전달할 수 있다. 그리고 웹 페이지의 내용을 읽어오는 것 외에도 반대로 웹 애플리케이션에 추가적인 정보를 전달해야 할 때가 있는데, 이때 POST 방식을 사용한다.

인터넷을 보면 게시판 보면 게시판에 자동으로 광고가 올라오는 것을 본 독자가 있을 것이다. 이러한 광고는 사람이 하나 하나씩 직접 입력하는 경우도 있지만, 보통은 자동으로 광고를 게시판에 올리는 프로그램을 이용한다. 이러한 프로그램은 HTML 폼의 Action에 지정되어 있는 웹 애플리케이션의 URL 주소에 POST 방식으로 광고 내용을 전달함으로써 마치 게시판의 폼에 사용자가 입력한 것처럼 글을 쓸 수 있게 하는 것이다.

URLConnection을 이용해서 웹 페이지의 내용을 읽어오는 방법에 대한 것이다. 먼저 URLConnection을 이용해서 웹페이지의 내용을 읽어오는 방법에 대한 것이다. 먼저 URLConnection을 이용하려면 URL 객체가 필요하다. 그 이유는 URLConnection 객체는 URL객체에 있는 openConnection() 메소드를 이용해서 얻기 때문이다. URLConnection 객체를 얻었다면, URLConnection 객체에 있는 getInputStream() 메소드를 이용해서 URL 주소로부터 내용을 읽어올 수 있는 InputStream 얻어올 수 있다. URLConnection을 이용해서 URL 주소의 내용을 읽어오는 방법을 순서대로 보여주고있다.

웹 페이지를 읽어 오는 WebSpiderWithURLConnection

URL 클래스를 이용해서 웹 페이지의 내용을 읽어오는 것과 흡사한 예제다. 다만, URL 클래스에 있는 openStream() 메소드를 이용하지 않고 URLConnection 객체에 있는 getInputStream() 메소드를 사용하는 부분이 다르다. URL 주소가 가리키는 내용을 단순히 읽어오길 원한다면 이전 예제(WebSpider.java)와 이번 예제 중에서 어느 것을 사용해도 문제는 없다.

import java.net.*;           
import java.io.*;           
           
public class WebSpiderWithURLConnection {           
           
    public static void main(String[] args) {       
        if(args.length != 2){   
            System.out.println("사용법 : java WebSpider URL filename");
            System.exit(1);
        }   
        URL url = null;   
        try {   
            url = new URL(args[0]);
        } catch (MalformedURLException e1) {   
            System.out.println("잘못된 URL 형식입니다.");
            System.out.println(e1);
            System.exit(1);   
        }       
        FileOutputStream fos = null;       
        try{       
            URLConnection urlcon = url.openConnection();   
            String contentType = urlcon.getContentType();   
            long d1 = urlcon.getDate();   
            java.util.Date d = new java.util.Date(d1);   
            java.text.SimpleDateFormat format   
                = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
            String sdate = format.format(d);   
            System.out.println("Content Type : " + contentType);   
            System.out.println("읽어온 시간 : " + sdate);   
            InputStream in = urlcon.getInputStream();   
            fos = new FileOutputStream(args[1]);   
            byte[] buffer = new byte[512];   
            int readcount = 0;   
            System.out.println("읽어오기 시작합니다.");   
            while((readcount = in.read(buffer)) != -1){   
                fos.write(buffer,0, readcount);
            }   
            System.out.println(args[1] + " 파일에 모두 저장하였습니다.");   
        }catch(Exception ex){       
            System.out.println(ex);   
        }finally{       
            try{   
                if(fos != null) fos.close();
            }catch(Exception e){}   
        }       
    } // main           
}               

URLConnection의 getInputStream() 메소드를 호출해서 URL 주소의 내용을 읽어 들일 수 있는 InputStream을 얻기까지를 나타낸 중요부분이다.

            url = new URL(args[0]);
……
            URLConnection urlcon = url.openConnection();   
……
            InputStream in = urlcon.getInputStream();   

URLConnection 객체를 이용하면 읽어 들여야 할 문서의 형식, 문서의 작성 시간 등의 정보도 구할 수 있다.

            String contentType = urlcon.getContentType();   
            long d1 = urlcon.getDate();   
            java.util.Date d = new java.util.Date(d1);   
            java.text.SimpleDateFormat format   
                = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
            String sdate = format.format(d);   
            System.out.println("Content Type : " + contentType);   
            System.out.println("읽어온 시간 : " + sdate);   

WebSpiderWithURLConnection 애플리케이션 실행

컴파일한 후 그림과 같이 실행하면 URL 주소가 가리키는 문서의 형식과 읽어온 시간이 출력되며, 두번째 인자로 지정된 파일에 읽어온 내용이 저장되는 것을 확인한다.

실행 결과

실행 결과