프로그래밍

[자바 기초] day20 : 자바로 크롤링 본문

자바/자바 기초

[자바 기초] day20 : 자바로 크롤링

시케 2023. 5. 31. 14:44
728x90
반응형

2023.05.31.수

웹 크롤링

웹 상의 코드를 분석하여 데이터를 가공하고 문서화하는 것을 말한다


스크랩핑
인터넷상에 존재하는 데이터를
프로그램을 이용하여 자동화된 방법으로
수집하는 작업

유효한 정보로 '가공'
: 크롤링
: 수집한 데티터들을 분류하여 별도로 저장하는 작업

파싱

유효한 정보로 '가공'하는 작업
데이터를 이용할 형식에 맞게 추출하여
의미있는 값으로 변형하는 작업

 

웹크롤링

우리가 웹 브라우저로 보는 화면을 웹페이지라고 부른다
코드를 작성한 페이지를 브라우저로 출력한 결과이기 때문에

여태까지 다루었던 자바 이클립스의 console과 같다

(아이콘, 마우스를 활용하므로 GUI이다)

 

HTML

  • 대소문자를 구분하지 않는다
  • 마크업언어 즉, 태그 언어이다
  • 요소(element)들로 이루어졌다

 

<!DOCTYPE HTML>

이 문서는 html 문서라고 명시하는 태그이다

 

alt 속성(property)

스크린리더가 읽는 속성으로 웹 표준 접근성 지침을 준수하도록 하는 속성이다

 

남녀노소 모두가 차별없이 웹페이지를 잘 이용할 수 있게 코더는 페이지를 작성하여 제공해야 한다

※ alt를 사용하지 않아도 페이지 구성 자체에는 문제가 없으나 스크린리더와 같은 보조기구를 활용하는 사람들에게는 제공 자체가 되지 않는다

 

CSS

코드를 작성해두면 페이지의 스타일에 변화를 줄 수 있는 언어

 

 

웹의 요청 흐름

  1. 사용자(Client, 브라우저)가 버튼을 통해 요청(request)을 한다
  2. 해당 요청은 URL에 표시되어 전송된다
  3. 서버는 요청이 무엇인지 확인하여 사용자에게 응답할 준비를 함
  4. 받은 데이터 화면에 응답(response)한다

 

URL 요청 예)

https://comic.naver.com/webtoon/list?titleId=799267 
프로토콜://서버(도메인)/위치/위치?변수명=값&변수명=값&변수명=값&변수명=값&......
00서버 XX위치에서 요청

 

에러 예)

400대 에러
클라이언트 에러(사용자 특이 에러)
ex) 404 없거나 권한이 없음
> try catch문을 이용하여 처리

500대 에러
서버 에러
500 코드 예외가 발생한 경우
Null Point Exception 오류가 대부분을 차지한다 80%

 

Jsoup 라이브러리

자바에서 크롤링을 할 때는 주로 Jsoup 라이브러리를 사용한다

 

다운 링크

https://jsoup.org/download

 

Download and install jsoup

Download and install jsoup jsoup is available as a downloadable .jar java library. The current release version is 1.16.1. What's new See the 1.16.1 release announcement for the latest changes, or the changelog for the full history. Previous releases of jso

jsoup.org

 

위의 링크에서 다운 받은 뒤

 

해당 자바 프로젝트 선택 후

Properties

 

Java Build Path > Libraries > ClassPath > Add External JARs

 

다운 받은 jar 파일 선택 후 적용한다

적용된 모습

 

크롤링 예제

package class01;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

// 웹 크롤링
public class Test01 {
	public static void main(String[] args) {
		// 웹 페이지 url 링크
		final String url = "http://www.cgv.co.kr/movies/?lt=1&ft=0";
		
		// 1. 웹페이지 코드를자바로 가져오기
		// a) 해당 url의 페이지 코드를 받아오기 위해, 연결통로(스트림)를 open
		// 		connect() 해야함
		// b) connect()가 정상적으로 수행되었다면 get()을 통하여
		// 		해당 페이지의 코드를 받아옴
		Connection conn = Jsoup.connect(url);
		Document doc = null;
		try {
			doc = conn.get();
		} catch (IOException e) {
			e.printStackTrace();
		}

		// 2. 페이지 스크랩핑 완료
		// 스캐너나 랜덤 어레이리스트 등은 자바에서 제공하는 클래스지만
		// 자바에서 기본 제공하지 않는 클래스

		// 3. 페이지를 분석
		// a) DOM 문서 분석
		// <></>태그(요소,element)단위로 분석
		// 속성을 가질 수있으며
		// 분석할때에 가장 대표적으로 활용되는 속성이
		// id(유일한 요소), class(여러개의 공통점을 가진 요소들)

		Elements elems = doc.select("strong.title"); // 영화 제목
		Elements elems2 = doc.select("strong.percent> span"); //영화 예매율
		
		// 영화 제목, 예매율 배열리스트에 선언
		ArrayList<String> title =new ArrayList<String>();
		ArrayList<String> rate =new ArrayList<String>();
		
		// 태그명#id명
		// 태그명.clss명
		// 상위 태그명>하위태그명
		// --->파싱

		// 4. 분석하여 추출 완료한 데이터를 콘솔화면에 출력
		// Iterator 이터레이터
		// : 거대한 컬렉션(elems)에 있는 데이터를 작은 단위의 컬렉션(elem)으로 나눠저장할수있도록 해주는 컬렉션
		Iterator<Element> itr = elems.iterator();
		Iterator<Element> itr2 = elems2.iterator();
		
		// itr는 hasNext(),next()
		// 다음 요소가 있어?,그럼 다음거보여줘~
		while (itr.hasNext()) {
			String str = itr.next().toString();
			// 5. 데이터를 가공
			int index = str.indexOf(">");
			str=str.substring(index+1);
			index = str.indexOf("<");
			str=str.substring(0,index);

			title.add(str); //제목 배열리스트에 저장
		}
		
		while (itr2.hasNext()) {
			String str2 = itr2.next().toString();
			// 5. 데이터를 가공
			int index = str2.indexOf(">");
			str2=str2.substring(index+1);
			index = str2.indexOf("<");
			str2=str2.substring(0,index);
			
			rate.add(str2); // 예매율 배열리스트에 저장
		}
		
		// 처음부터 끝까지 목록 출력
		for(int i = 0; i<title.size(); i++) {	
			System.out.println();
			System.out.print(title.get(i)+"\n");
			System.out.println("예매율: " +rate.get(i));
			System.out.println();
		}
		

	}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
Comments