크롤링 순서
ex. URL url = new URL("http://www.google.com");
URLConnection urlCon = url.openConnection();
프로토콜이 http://인 경우 반환된 객체를 HttpURLConnection 객체 로 캐스팅할 수 있다.
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
openConnection() 메서드는 실제 네트워크 연결을 설정하지 않고, 단지 URLConnection 클래스의 인스턴스를 반환한다.
네트워크 연결은 connect() 메서드가 호출 될 때 명시적으로 이루어지거나, 헤더 필드를 읽거나 입력스트림/출력스트림을 가져올 때 암시적으로 이루어진다. URL의 openConnection() 메서드는 I/O 오류가 발생하면 IOException을 발생시킨다.
IOException : 입출력 예외
MalforemedURLException : 잘못된 URL로 정상적인 프로토콜을 인식할 수 없을 때
연결이 이루어지면 서버는 URL 요청을 처리하고 메타데이터와 실제 콘텐츠로 구성된 응답을 다시 보낸다. 메타데이터는 헤더 필드라고 하는 키=값 쌍의 모음이다.
실제 내용은 문서의 유형에 따라 텍스트, HTML, 이미지 등이 될 수 있다.
InputStream inputStream = urlCon.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line = reader.readLine(); // reads a line
헤더필드란?
헤더 필드는 서버에 대한 정보, 상태 코드, 프로토콜 정보 등을 나타낸다.
서버에 대한 정보는 어떤 것?
상태 코드란?
프로토콜 정보란?
-> 이는 나중에 웹 공부를 더 자세히 하면서 알게 될 것이다.
실제 내용을 읽으려면 연결에서 InputStream 인스턴스 를 얻은 다음 InputStream 의 read() 메서드를 사용하여 데이터를 읽어야 힌다.
-> 직전에 작성한 I/O스트림에 대한 게시글을 읽어오는 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class YongHomeWork {
public static void main(String[] args) throws IOException {
URL url = new URL("https://velog.io/@honeyricecake/%EC%9E%90%EB%B0%94-IO-%EC%8A%A4%ED%8A%B8%EB%A6%BC");
URLConnection urlCon = url.openConnection();
InputStream inputStream = urlCon.getInputStream(); // 이 역시 InputStream이다.
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
//문자 스트림에 대한 버퍼 기능이 있는 필터 스트림 BufferedReader
while(true)
{
String line = reader.readLine();
if(line == null) break;
System.out.println(line);
}
}
}
Q. InputStreamReader는 InputStream을 문자로 읽어오는 파일스트림인가?
그럼 FileReader를 사용하는 것은 FileInputStream에 InputStreamReader를 연결하는 것과 같은 것일까?
A. 정확하다!
감사합니다 ! 도움이 많이 됬습니다