자바로 하는 크롤링

honeyricecake·2022년 6월 1일
1

학교 수업 - 자바

목록 보기
16/16

크롤링 순서

  1. URL 객체 생성

ex. URL url = new URL("http://www.google.com");

  1. URL에서 URLConnection 객체 얻기

URLConnection urlCon = url.openConnection();

프로토콜이 http://인 경우 반환된 객체를 HttpURLConnection 객체 로 캐스팅할 수 있다.

HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();

openConnection() 메서드는 실제 네트워크 연결을 설정하지 않고, 단지 URLConnection 클래스의 인스턴스를 반환한다.

네트워크 연결은 connect() 메서드가 호출 될 때 명시적으로 이루어지거나, 헤더 필드를 읽거나 입력스트림/출력스트림을 가져올 때 암시적으로 이루어진다. URL의 openConnection() 메서드는 I/O 오류가 발생하면 IOException을 발생시킨다.

IOException : 입출력 예외

MalforemedURLException : 잘못된 URL로 정상적인 프로토콜을 인식할 수 없을 때

연결이 이루어지면 서버는 URL 요청을 처리하고 메타데이터와 실제 콘텐츠로 구성된 응답을 다시 보낸다. 메타데이터는 헤더 필드라고 하는 키=값 쌍의 모음이다.
실제 내용은 문서의 유형에 따라 텍스트, HTML, 이미지 등이 될 수 있다.

  1. 입력 스트림 가져오기 및 데이터 읽기
InputStream inputStream = urlCon.getInputStream();

BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line = reader.readLine(); // reads a line

헤더필드란?

헤더 필드는 서버에 대한 정보, 상태 코드, 프로토콜 정보 등을 나타낸다.

  1. 서버에 대한 정보는 어떤 것?

  2. 상태 코드란?

  3. 프로토콜 정보란?

-> 이는 나중에 웹 공부를 더 자세히 하면서 알게 될 것이다.

실제 내용을 읽으려면 연결에서 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. 정확하다!

1개의 댓글

comment-user-thumbnail
2022년 9월 15일

감사합니다 ! 도움이 많이 됬습니다

답글 달기