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

URL - 웹사이트 읽어오기(WebSpider)

경진 2008. 7. 19. 19:49
 URL 클래스를 이용해서 웹사이트 읽어오기

텔넷을 이용한 웹사이트 읽어오기

1. 윈도우 명령창을 실행한다.
2. 그림과 같이 telnet daum.net 80이라고 입력한 후 엔터 키를 입력한다.

명령 실행

3. GET / 라고 입력한 후 엔터키를 입력한다 이 때 키보드로 입력한 갑싱 화면에는 출력되지 않을 수도 있다.
 (보이지 않더라도 무조건 입력 후 엔터 키를 입력한다.)
4. 다음과 같이 daum.net의 HTML 태그가 출력되는 것을 확인 할 수 있다.

실행 결과

이는 웹 서버가 동작하는 80번 포트에 telnet 프로그램으로 접속한 후 '/' 디렉톨리의 내용을 GET 방식으로 보여 달라고 HTTp 프로토콜에 해당하는 문자열을 보낸 것이다. 그 결과 서버는 접속한 클라이언트가 텔넷 프로그램인 것은 모르고 웹 브라우저인 것으로 판단해서 '/' 디렉토리에 해당하는 HTML 태그를 출력한 것이다. 실제로 '/' 디렉토리에 대한 정보를 출력하는 것이 아니라 디렉토리명을 지정하면 기본적으로 열리는 'index.*' 파일이 호출된 것이다.

'GET /'는 간단한 웹 서버를 만들때 사용했다. 소켓 프로그래밍에서 간단하게 웹 서버로 부터 요청을 보내서 결과를 출력하려면 다음과 같은 과정을 거친다.

1. 웹 서버의 IP와 웹 서버의 동작 포트(보통 80번 포트)에 접속하는 Socket 객체를 생성한다.
2. 접속에 성공하면 Socket으로부터 얻은 OutputStream을 통해서 웹 서버에게 'GET /' 문자열을 전송한다.
3. 웹 서버는 '/' 디렉토리 아래에 있는 기본적인 index.html 파일을 열어 클라이언트에게 결과를 출력한다.
4. 클라이언트는 Socket으로 얻은 InputStream을 통해서 웹 서버가 보내주는 정보를 읽어 들여 출력하면 된다.

Socket을 이용할 경우에는 HTTP 프로토콜에 대해서 알아야 한다. 위 경우에는 'GET /'라는 것이 '/' 페이지를 웹서버에게 요청하는 것을 알고 있으므로 프로그래밍을 할 수 있었다.

이런 과정을 다 알필요는 없다. URL 클래스에 있는 openStram() 메소드는 URL 클래스에게 지정된 URL 주소가 가리키는 문서를 읽을 수 있는 InputStream을 반환한다. HTTP 프로토콜을 몰라도 손쉽게 웹 사이트 내용을 긁어 올 수 있다.

웹사이트의 내용을 긁어오는 WebSpider

사용자가 지정한 URL 주소의 내용을 긁어 오는 프로그램이다. URL 클래스에 있는 openStream() 메소드는 사용자가 지정한 URL 주소의 내용을 읽어 오는 InputStream을 반환한다.

import java.net.*;           
import java.io.*;           
           
public class WebSpider {           
           
    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{       
            InputStream in = url.openStream();   
            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           
}               

클라이언트 외부로 부터 받아들인 인자를 URL 클래스의 생성자에 지정한다. 외부에서 전달하는 인자는 사용자가 읽어 들여야할 내용을 가리키는 URL 주소다.

        URL url = null;   
        try {   
            url = new URL(args[0]);
        } catch (MalformedURLException e1) {   

URL 클래스에 있는 openStream()을 이용해서 InputStream을 얻는다. 해당 InputStream은 URL주소가 가리키는 애용을 스트림 형식으로 읽어 들일 수 있는 객체다. InputStream을 통해서 읽어 들인 내용을 저장하기 위해서 FileOutputStream을 사용했다.

            InputStream in = url.openStream();   
            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);
            }

WebSpider 실행

URL 클래스를 이용해서 웹 페이지를 긁어오는 WebSpider 클래스를 작성했다면, 컴파일한 후 다음 과 같이 실행한다.

WebSpider를 실행

WebSpider를 실행

명령 실행

type yahoo.html을 실행

결과 확인

결과 확인

yahoo.html 파일 확인

yahoo.html 파일 확인


URL 클래스의 문서 호출 방식

URL 클래스를 이용하면 URL 주소가 올바른지 URL 주소가 잘못된 형식인지 확인할 수 있으며 URL 클래스에 있는 openStream()을 호출하면 URL 주소가 가리키는 내용을 읽어올 수도 있다.

그리고 openStream()을 이용하면 읽어 들일 때에는 웹페이지를 GET 방식으로만 호출할 수 있다. 만약 POST 방식으로 호출하려면 다른 방법이 필요한데 URLConnection을 이용하는 것이 대표적인 방법이다.

보통 GET 방식은 브라우저의 주소 창에 URL 주소를 입력해서 웹페이지를 호출하는 방식을 말하면 POST 방식은 HTML 폼의 method 속성을 POST로 설정한 후 웹페이지를 요청하는 방식을 말한다.

POST 방식으로 우베 페이지를 요청하는 방법은 프로그램을 이용한 방법이 있을 수 있는데 URLConnection 클래스를 이용하는 경우가 대표적인 예다.