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.