ABOUT ME

읽히는 로직을 구현하고 싶습니다.

Today
Yesterday
Total
  • Jsoup 라이브러리 이용 : 데이터 웹 스크래핑 (서버에 접속 후 자료 읽기)
    JAVA/Network 2024. 6. 18. 12:45

    ✔ 웹 스크래핑(Scraping) VS 웹 크롤링

     

    ⌨ 웹 스크래핑

    Scraping은 데이터 추출 기술이다. 웹 페이지 화명에서 데이터를 자동으로 추출하는 기법을 말한다.

    웹 사이트에 대한 스크래핑은 많은데, 웹 스크래핑은 특정 웹 사이트나 웹 페이지에서 원하는 데이터를 추출해 내는 것을 의미한다.

     

    브라우저를 구동시켜 화면에 나오는 데이터를 수집한다.

    원하는 정보를 추출하기 전에 스크래퍼 봇이 사용된다. 이 도구를 통해 특정 웹 사이트에 콘텐츠를 다운로드하기 위해 HTTP BET요청을 보낸다. 이러한 도구는 사용자의 특정 요구 사항에 따라 구조적 또는 비구조적 형식으로 데이터를 추출한다.

    타깃을 분명히 하고 타깃에서 정보를 가져온다.

     

     

    💻 웹 크롤링

    웹 페이지를 방문해 자료를 수집해 두는 프로그램을 의미한다. 여러 웹사이트에 접속해서 데이터를 수집하는 역할이다.

    데이터를 체계적으로 스캔하는 자동화된 프로세스이다.

    웹페이지에 대한 정보를 색인화하고 저장하는 인터넷, 검색 엔진은 웹 크롤러를 사용해 웹사이트에 대한 데이터를 수집하고 검색 색인을 구축한다. URL을 탐색해 링크를 찾아오는 과정이다.

     

    웹 크롤링 프로세스는 스파이더하는 검색 엔진의 크롤러가 웹사이트를 만들고 그 콘텐츠를 분석한다.

    웹 크롤러는 복잡한 알고리즘을 사용하여 정보를 식별하고 분류한다.

    특정 웹 페이지를 목표로 하지 않는다. 탐색 후 정보를 추출한다.

     

     

    👏 차이점

      웹 크롤링 웹 스크래핑
    수집 범위 복수 단일
    규모 대규모의 데이터 수집 소규모의 데이터 수집
    중복제거 필수( 데이터 중복 가능성 높음) 선택(타겟이 있어 데이터 중복 가능성 낮음)
    탐색 URL을 수집하고 웹페이지 복사 후 색인 부여  

     

     

    크롤링은 불특정 웹 사이트에 방문해 특정 링크에 어떠한 정보가 담겨있는지 수집하고 색인하는 행위

    스크래핑은 특정 웹 사이트에 데이터를 추출하고 가공하는 행위 (파싱의 상위 개념)

     


     

     

    ✔ Jsoup

    HTML 문서 데이터 구문을 분석하고 추출 및 조작하는 오픈 소스이다.

    ⌨ 다운로드

    https://jsoup.org/download 에서 다운로드할 수 있다.

    메이븐, 그래들 코드도 제공된다.

     

     

    💻 .jar 파일을 Build Path 하기

    1. 사용할 프로젝트 우클릭 > bulid Path

    2.jar 파일 가져오기

     

     

    ✔Jsoup 사용하기(싱글스레드)

    제삼자가 제공하는 라이브러리(jsoup.jar)를 사용해서 웹 스크래핑을 해보자.

     

    우선, 위키백과 사이트에서 아무 단어나 검색해 보자.

    위키백과 짱구 검색

    도메인 창을 보면 "신짱구"로 나온다. 주소를 복사해 이클립스로 가져와보자.

    https://ko.wikipedia.org/wiki/%EC%8B%A0%EC%A7%B1%EA%B5%AC

    "신짱구"라는 단어가 인코딩 되었다.

     

     

     

    🔧 자바에서 인코딩하기

    public class Net {
    	public static void main(String[] args) {
    		// 위키백과 사이트에서 검색 결과 읽기
    //		https://ko.wikipedia.org/wiki/%EC%8B%A0%EC%A7%B1%EA%B5%AC
    		try {
    			System.out.println(URLEncoder.encode("짱구","UTF-8"));
    		} catch (Exception e) {
    			System.out.println("err : "+ e);
    		}
    
    	}

     

     

     

    👏 웹페이지의 text 문서를 추출해 보자.

    public class Net2 {
    	public static void main(String[] args) {
    		try {
    			System.out.println(URLEncoder.encode("짱구","UTF-8")); //인코딩 : %EC%A7%B1%EA%B5%AC
    			
    			String url = "https://ko.wikipedia.org/wiki/"+ URLEncoder.encode("짱구","UTF-8"); //자바는 브라우저와 다르기에 인코딩을 해줘야한다.
    			//Document : 웹페이지 문서
    			Document doc = Jsoup.connect(url).get();
    			String text = doc.text();
    			System.out.println(text);
    			
    		} catch (Exception e) {
    			System.out.println("err : "+ e);
    		}
    	}
    }

     

     

    이런 한글 데이터가 나왔다.

     

    NOSQL은 이와 같은 데이터를 가져올 수 있지만 DBMS는 가져오기 힘들다.

    그래서 데이터를 조금 가공해보고자 한다.

    이때 "정규 표현식"을 어느 정도는 알아야 데이터를 가공할 수 있다. 

    https://adjh54.tistory.com/104#google_vignette

     

    [Java] 정규표현식(RegExp) 이해하기 : 패턴, 문자 클래스, 자주 사용 패턴

    해당 글의 목적은 주요 정규식 조작함수를 이해하고 예제를 통한 이해를 돕기 위해 작성한 글입니다. 해당 글에서는 모든 함수에 대해서는 포함하고 있지 않으며 자주 사용되는 함수 위주로 작

    adjh54.tistory.com

     

    정규 표현식을 사용해서 해보자.

    public class Net2 {
    	public static void main(String[] args) {
    		try {
    //			System.out.println(URLEncoder.encode("짱구","UTF-8")); //인코딩 : %EC%A7%B1%EA%B5%AC
    			
    			String url = "https://ko.wikipedia.org/wiki/"+ URLEncoder.encode("짱구","UTF-8");
    			Document doc = Jsoup.connect(url).get();
    			String text = doc.text();
                
    			printKoreanText(text); // 한글만 추출 (원하는 라이브러리 가져와서 사용해라)
    			
    		} catch (Exception e) {
    			System.out.println("err : "+ e);
    		}
    
    	}
    	
    	private static void printKoreanText(String text) {
    		//정규 표현식 사용
    		//한글과 공백만 얻기
    		Pattern pattern = Pattern.compile("[가-힣\\s]+");
            // + : 공백이 없으면 하나의 문자열(단어)로 인식 s: 공백
    		Matcher matcher = pattern.matcher(text);
    		
    		while (matcher.find()) {
    			String line = matcher.group().trim();
                // trim()은 양쪽 공백 제거, 중간 공백 미제거
    			if(!line.isEmpty()) { //빈 줄은 제외
    				System.out.println(line);
    			}
    		}
    	}
    }

     

     

     

     

    👏 중요

    원하는 오픈 소스 라이브러리를 가져와 사용할 수 있다.

    예를 들어 형태소 분석기와 같은 것들을 가져와 사용할 수 있다.

    https://www.shineware.co.kr/products/komoran/

     

    KOMORAN @ Shineware

    소개 KOMORAN은 Shineware의 기술로만 연구 및 개발된 한국어 형태소 분석기로서 Java Library 형태(jar)로 제공됩니다. KOMORAN 3.0은 기존 KOMORAN 2.0 대비 속도, 정확도가 개선되었으며 타 형태소 분석기와

    www.shineware.co.kr

     

     

     


     

     

     

    ✔Jsoup 사용하기(멀티 스레드)

    💻 멀티 스레드 :  복수 개의 문서 읽기

    public class Net3Thread implements Runnable {
    	private String url;
    	private String title;
    
    	public Net3Thread(String url, String title) {
    		this.url = url;
    		this.title = title;
    	}
    
    	@Override
    	public void run() {
    		try {
    			Document doc = Jsoup.connect(url).get(); //네트워크를 통해 다른 컴에 접속 후 자료 읽기
    			String text = doc.text();
    
    			System.out.println("----------");
    			System.out.println("문서 제목 : " + title);
    			
    			 printKoreanText(text);
    		} catch (Exception e) {
    			System.out.println("read err : " + e);
    		}
    	}
    
    	private static void printKoreanText(String text) {
    		// 정규 표현식 사용
    		// 한글과 공백만 얻기
    		Pattern pattern = Pattern.compile("[가-힣\\s]+"); // + : 공백이 없으면 하나의 문자열(단어)로 인식 s: 공백
    		Matcher matcher = pattern.matcher(text);
    
    		while (matcher.find()) {
    			String line = matcher.group().trim(); // trim()은 양쪽 공백 제거, 중간 공백 미제거
    			if (!line.isEmpty() && line.length()>1) { // 빈 줄, 1글자 제외
    				System.out.println(line);
    			}
    		}
    	}
    
    	public static void main(String[] args) throws Exception {
    		String[] titles = { "백설공주", "신짱구" };
    		String[] urls = { "https://ko.wikipedia.org/wiki/" + URLEncoder.encode(titles[0], "UTF-8"),
    				"https://ko.wikipedia.org/wiki/" + URLEncoder.encode(titles[1], "UTF-8") };
    
    		for (int i = 0; i < urls.length; i++) {
    			Thread thread = new Thread(new Net3Thread(urls[i], titles[i]));
    			thread.start();
    		}
    		System.out.println("프로그램 종료");
    	}
    
    }

     

     

    👏 중요

    스레드는 스레드 우선순위에 의해 실행된다. 순서 없이 스레드가 노는 시간 없이 진행한다.

    우선순위를 요청할 수 있지만 강제되는 것은 아니다.

     

     

    😊정리

    인터넷의 다른 서버에 있는 데이터를 스크래핑했다.

    스크래핑이란 웹 페이지나 다른 프로그램 화면에서 데이터를 자동으로 추출하는 기법을 말한다.

    Jsoup 오픈 소스를 다운로드하여 사용해 보았다. Jsoup 은 스크래핑을 할 수 있도록 도와주는 jar파일이다.

    한 개의 자료를 가져올 수도, 여러 개의 자료를 가져올 수도 있었다.

     

    멀티 스레드(하나의 프로세스에서 둘 이상의 스레드가 동시에 작업을 수행하는 것)를 사용해서 데이터를 가져올 수 있었다.

Designed by Tistory.