본문 바로가기
DBMS

[Oracle] 웹크롤링_기초

by amoomar 2022. 1. 24.
반응형

 

 

이번 포스팅에서는 크롤링의 개념과 방법에 대해 기초적인 부분만 다루어보았다.

 

 


 

 

1. What?

: 웹 크롤링이란, web상을 돌아다니며 필요한 정보를 수집하는 것이다. 이때 정보를 수집하는 것은 물론 데이터를 가공하여 필요한 정보만을 사용할 수 있도록  text화 하는 것도 중요하다. 자세하게는 아래의 키워드와 설명을 통해 알 수 있다.

 

1) 스크래핑 : 수집

  • 인터넷상에 존재하는 데이터를 프로그램을 이용해서 자동화된 방법으로 해당 데이터를 수집하는 작업
  • 웹에서 데이터를 수집하는 작업

 

2) 크롤링 : 수집 및 분류

  • 수집한 데이터를 분류
  • 주로 인터넷의 웹페이지를 수집해서 분류하고 저장하는 작업
  • 데이터가 어느 위치에 저장되어 있는지 작성하는 작업이 포인트이다. (접근에 초점)

 

3) 파싱 : 가공

  • 받아온 웹페이지의 데이터를 이용할 형식에 맞게 추출하여 의미있는 값으로 변형하는 작업
  • 사용하는 언어(문법)에 맞게 분석하는 작업이 포인트다. (가공에 초점)

 

일반적으로 스크래핑과 크롤링을 구분 없이 혼용하여 사용한다.

 

4) DOM (Document Object Model)

  • 크롤링을 하기 위해서는 DOM의 분석이 필수이다.
  • html, xml을 tree형식으로 구조화한 형태를 DOM이라고 하며, 문장의 이해를 도울 수 있도록 하단에 사진을 첨부하였다.
  • <> : 태그, 요소, element
  • <>안의 갈색글씨 : 속성(주로 id, class) 
  • Jsoup : 자바로 이루어진 HTML Parser.HTML로 이루어진 데이터(주로 요소)를 분석가능

출처 : https://wooder2050.medium.com/%EC%9D%B4%EB%A1%A0-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-dom-%ED%8A%B8%EB%A6%AC-96ca3008a474

 

 

 


 

 

2. How?

: 만약 네이버 웹툰의 장르별 추천웹툰의 제목을 가져오고 싶다면 그 방법은 아래와 같다.

 

package class06;

import java.io.IOException;
import java.util.Iterator;
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) {
		
		// 0. 크롤링 할 url 상수화작업
		// = 데이터를 수집할 화면 url
		final String url = "https://comic.naver.com/index";
		Document doc = null;
		
		try {
			//1. url의 소스코드를 get : 스크래핑
			// stmt와 비슷한 맥락이다.
			doc = Jsoup.connect(url).get(); 
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		// 이때, Document는 수행 결과물로, Jsoup을 통해HTML 전체 문서를 받아온다!
		
		// 2. "doc에 담긴 url의 일부만 보고싶어" : 스크래핑한 데이터를 크롤링!
		// select()의 output이 여러 요소들임을 확인 가능
		Elements eles = doc.select("div.genreRecomInfo2 > h6");
		
		// 3. 출력
		Iterator<Element> itr = eles.iterator();
		while(itr.hasNext()) {
			System.out.println(itr.next().text());
		}
	}
	
}

 

* 주석 2번 *

: genreRecomInfo2라는 이름을 가진 div클래스의 h6요소에는 내가 원하는 정보, title(책제목)이 포함되어있다. 그것을 긁어와 java에서 출력시키는 작업이다.

시간차로 인해 아래의 출력결과와는 제목이 상이하다.

 

[출력결과]

휴재 컷툰 숏애니 중독연구소
휴재 컷툰 숏애니 히어로메이커
휴재 컷툰 숏애니 결혼생활 그림일기
휴재 컷툰 숏애니 내일
휴재 컷툰 숏애니 굿 리스너
휴재 컷툰 숏애니 무서운게 딱좋아!

 

* 가공 *

: 분명 더 세세하게 들어가 정보를 긁어온다면 제목만을 출력할 수 있겠지만, 가공을 통해 제목만 출력할 수 있도록 하였다.

// 3. 출력
Iterator<Element> itr = eles.iterator();
while(itr.hasNext()) {
	// 4. 파싱 : 가공작업
	String str = itr.next().text();
	System.out.println(str.substring(10)); //앞에서 10칸 cut
}

"휴재 컷툰 숏애니 " : 10칸을 삭제하면 아래와 같이 출력이 가능하다.

 

[출력화면]

 

트리거
착한건 돈이된다
드로잉 레시피
싸이코 리벤지
꿈의 기업
소녀의 세계

 

 


 

 

3. 예제

: 지니뮤직에서 최신 음악 중 노래 제목만 가져와 출력하기

 

package class06;

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

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

public class Test02 {

	public static void main(String[] args) {
		
		// 0. 크롤링 할 url 상수화작업
		final String url = "https://www.genie.co.kr/newest/song";
		Document doc = null;
		
		try {
			//1. url의 소스코드를 get : 스크래핑
			doc = Jsoup.connect(url).get(); 
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		// 2. "doc에 담긴 url의 일부만 보고싶어" : 스크래핑한 데이터를 크롤링!
		Elements eles = doc.select("tr.list > td.info > a.title");

		// 3. 출력
		Iterator<Element> itr = eles.iterator();
		while(itr.hasNext()) {
			System.out.println(itr.next().text());
		}
	}
}

 

* 주석 2번 *

: a class의 요소인 title < info라는 이름을 가진 td클래스 < list라는 이름을 가진 tr클래스

 

 

[출력결과]

RICA RICA
Feelin' Like
Hangover (Feat. Mckdaddy)
NFT (With ONEO)
오랜만이야
우리가 다시 만날 수밖에 없는 이유 (Prod. by 남혜승)
1분에 한 번
Good Night (Feat. BE'O)
(이하 생략)

.

.

 

 

 

 

가장 외부의 집합인 포장지를 하나씩 풀어가며 내가 원하는 정보까지 도달했을때, 그 정보가 어디에 속하여있는지를 분석하는 방식으로 접근하면 이해가 쉽다.

 

 


 

반응형

'DBMS' 카테고리의 다른 글

[Oracle] 프로젝트의 설계 & 두개의 TableDB  (0) 2022.01.26
[Oracle] 웹크롤링_샘플데이터처리  (0) 2022.01.25
[Oracle] 트랜잭션  (0) 2022.01.22
[Oracle] pstmt  (0) 2022.01.21
[Oracle] DB접근&MVC분리  (0) 2022.01.20