웹 데이터 가져오기
HTML 데이터와 웹 데이터(text)를 가져올 수 있다.
자바에서 웹 연결을 위해서는 두 가지 객체가 필요하다.
1. URL : 웹 상의 주소
2. HttpURLConnection : 웹 연결
상속 관계
URLConnection
└ HttpURLConnection
💻 예제
Daum 사이트의 데이터를 읽어와 본다.
📝 전체 소스 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class Main {
public static void main(String[] args) {
System.out.println("웹 데이터 가져오기(텍스트)\n");
StringBuffer sb = readFromUrl("https://www.daum.net");
System.out.println(sb.toString().substring(0, 200));
}
private static StringBuffer readFromUrl(String url_addr) {
URL url = null;
HttpURLConnection conn = null;
InputStream in = null;
InputStreamReader reader = null;
BufferedReader br = null;
char[] buf = new char[512];
StringBuffer sb = new StringBuffer();
try {
url = new URL(url_addr);
conn = (HttpURLConnection) url.openConnection(); // 해당 url로 connection 객체 얻어옴
if (conn != null) {
conn.setConnectTimeout(2000); // 2초 이내 서버와 연결 수립이 안되면 예외 발생
conn.setRequestMethod("GET");
conn.addRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
conn.setUseCaches(false);
System.out.println("request 시작 : " + url_addr);
conn.connect(); // request 발생
System.out.println("response 완료");
int responseCode = conn.getResponseCode();
System.out.println("response code : " + responseCode); // 정상적이면 200
if (responseCode == HttpURLConnection.HTTP_OK) {
in = conn.getInputStream();
reader = new InputStreamReader(in, "utf-8");
br = new BufferedReader(reader);
int cnt;
while ((cnt = br.read(buf)) != -1) {
sb.append(buf, 0, cnt);
}
} else {
System.out.println("response 실패");
return null;
}
} else {
System.out.println("conn Null");
return null;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
if (conn != null)
conn.disconnect();
}
return sb;
}
}
readFromUrl()이라는 메소드를 만들어 웹사이트에서 읽어온 데이터를 StringBuffer로 반환할 것이다.
URL url = null;
HttpURLConnection conn = null;
URL 은 java.net.URL을 import 한다.
HttpURLConnection은 java.net.HttpURLConnection을 import 한다.
try {
url = new URL(url_address);
conn = (HttpURLConnection) url.openConnection();
if (conn != null) {
...
} else {
System.out.println("conn Null");
return null;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
if (conn != null)
conn.disconnect();
}
try문부터, url 변수에 새로운 URL 객체를 생성하여 저장한다. readFromUrl의 인자 값으로 받아온 문자열을 사용한다.
인자 값은 Daum 웹 사이트 주소인 "https://www.daum.net"으로, 현재 url 변수에는 다음 사이트 주소의 URL 객체가 저장된 것이다.
이후 openConnection 메소드를 사용해서 해당 url로 connection 객체를 생성한다.
connection이 제대로 이루어진 경우 if문을 통해 다음 동작을 진행할 수 있다.
만약 서버가 죽었다는 등의 이유로 conneciton이 제대로 이루어지지 않으면 아래 else 문을 통해 conn Null을 출력하고 종료한다.
첫 번째 catch 절에서 MalformedURLException과 같은 경우는 url이 틀린 경우 등에서 실행된다.
connection이 제대로 이루어졌을 때의 if문을 살펴본다.
if (conn != null) {
conn.setConnectTimeout(2000); // 2초 이내 서버와 연결 수립이 안되면 예외 발생
conn.setRequestMethod("GET");
conn.addRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
conn.setUseCaches(false); // cache 사용 안 함
System.out.println("request 시작 : " + url_address);
conn.connect(); // request 발생
System.out.println("response 완료");
int responseCode = conn.getResponseCode();
System.out.println("response code : " + responseCode); // 정상적이면 200
if (responseCode == HttpURLConnection.HTTP_OK) { // HTTP_OK == 200
in = conn.getInputStream();
reader = new InputStreamReader(in, "utf-8");
br = new BufferedReader(reader);
int cnt;
while ((cnt = br.read(buf)) != -1) {
sb.append(buf, 0, cnt);
}
} else {
System.out.println("response 실패");
return null;
}
} else {
System.out.println("conn Null");
return null;
}
setConnectTimeout 메소드에 2000(ms) 인자 값을 주어 2초 이내로 서버와 연결이 되지 않으면 예외를 발생시키게 한다.
2초 이내로 서버와 정상적으로 연결되었다면 Request 시 필요한 정보들을 세팅한다.
GET, POST 등의 방식을 정하고 header 정보를 넣는다. 현재 경우에서는 cache를 사용하지 않도록 false로 set 하였다.
request가 잘 동작되는지 확인하기 위해 두 개의 println을 삽입하였다.
connect() 메소드가 올바르게 동작하는 경우 request가 잘 발생되었다는 것이다.
request가 올바르게 되었다면 200이라는 response code를 얻어올 수 있다.
HttpURLConnection에는 여러 response code 정보를 담고 있는데, 그중 HTTP_OK는 200이다.
받아온 responseCode가 HttpURLConnection.HTTP_OK와 같다면 response가 올바르게 응답된 것이다.
InputStream, InputStreamReader를 이용해 웹사이트의 데이터를 읽어온다.
한글이 깨지지 않게 하기 위해 InputStreamReader를 생성할 때, 두 번째 인자 값인 charsetName으로 utf-8을 넣었다.
이후 파일의 끝까지 계속 읽고, 읽어 들인 내용을 앞서 생성해 준 StringBuffer sb에 저장한다.
📄 실행 결과
print 할 때 받아온 StringBuffer sb를 전체 출력하지 않고, substring을 이용해 200만큼 잘라 전체 내용은 출력하지 않았다.