-
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
정규 표현식을 사용해서 해보자.
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/
✔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파일이다.
한 개의 자료를 가져올 수도, 여러 개의 자료를 가져올 수도 있었다.
멀티 스레드(하나의 프로세스에서 둘 이상의 스레드가 동시에 작업을 수행하는 것)를 사용해서 데이터를 가져올 수 있었다.
'JAVA > Network' 카테고리의 다른 글
특정 컴퓨터 접속 후 메세지 전달 (+ 사용중인 포트번호,taskkill, 서버 접속) (0) 2024.06.21