본문 바로가기
Java (국비)/Java 과제

MVC (Model-View-Controller) 과제 2

by Hwanii_ 2023. 6. 4.
728x90

웹 크롤링을 추가해서 연습.

 

크롤링 클래스

 

package model;

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 Crawling {

	public static int PK = 1;
	public static int cnt = 0;

	public static ArrayList<MusicVO> sample() {

		final String url = "https://www.melon.com/chart/";

		Connection conn = Jsoup.connect(url);

		Document doc = null;

		try {
			doc = conn.get();
		}
		catch (IOException e) {
			e.printStackTrace();
		}

		Elements elements = doc.select("div.ellipsis.rank01 > span > a");
		Elements elements2 = doc.select("div.ellipsis.rank02 > span");

		Iterator<Element> itr = elements.iterator();
		Iterator<Element> itr2 = elements2.iterator();

		ArrayList<MusicVO> datas = new ArrayList<MusicVO>();
        
		while(itr.hasNext() && itr.hasNext()) {
			String title = itr.next().text();
			String artist = itr2.next().text();

			datas.add(new MusicVO(PK++,artist,title,cnt));
		}
		return datas;

	}	//	sample()

}	//	Crawling

 

 

 

1. 기존에 배열리스트에 담을 데이터를 DAO에서 insert() 메서드로 만들었다면,

음악을 담을 배열리스트 안에 외부에서 가져온 데이터를 add() 하는 상황.

 

2. 음악의 고유번호는 add() 될때마다 증가하도록 했다.

 

3. select() 메서드, hasNext() 메서드, next() 메서드, text() 메서드를 사용해서,

필요한 정보를 while문을 통해 추출 하는 상황.

필요한 정보 :

1) 가수 이름 (artist)

2) 노래 이름 (title)

 

[참고]

select() 메서드 : 

태그로 값을 가져올 때 사용하는 메서드 이다.

() 안에 가지고 오려는 정보를 넣어주면 된다.

div라는 태그명만 적어도 되고,

ellipsis는 클래스명에 해당한다.

// div.ellipsis == 태그명.클래스명

 

// 태그명#id명으로도 가져 올 수 있는데,

이런 경우는 id는 유일한 요소라고 볼 수 있다.

 

text() 메서드 :

Jsoup의 메서드 이다.

선택된 모든 HTML 요소의 텍스트 컨텐츠를 하나의 문자열로 반환 하는 기능을 가진다.

 

4. cnt는 0으로 고정되어있는 상태이고, 스트리밍 횟수를 의미 한다.

이후, 사용자가 해당 노래를 들으면 cnt가 증가되는 기능을 구현.

DAO에서 update() 메서드에 해당 한다.

 

5. return 값으로 MusicVO 타입의 배열리스트 자체를 반환 한다.

이렇게 반환 되기 때문에, 기존에 MusicVO 타입의 배열리스트에 혹시 노래(객체) 들이 있었다면,

반환된 datas 자체가 기존의 노래(객체)들을 덮어 씌우게 된다.

 

예시)

 

위와 같으면, 문제될게 없음.

 

왜냐하면, MusicVO 타입의 배열리스트에 웹 크롤링 해서 가져온 datas를 집어 넣고,

이후에 좋다고 말해 노래를 하나 add() 하는 상황이기 때문에 !

 

하지만, 만약에 아래와 같은 상황이라면,

 

MusicVO 타입의 배열리스트에 좋다고말해를 add() 했고,

그 배열리스트에 웹 크롤링 해서 가져온 데이터 자체를 대입하는 (복사, 저장)하는 상황 이므로,

기존의 노래 (좋다고말해)가 사라지는 모습을 확인 할 수 있다.

또한, 좋다고말해가 사라졌지만, 웹 크롤링 해서 가져온 datas들의 PK는 2번 부터 시작되는 모습도 확인 가능 하다.

 

 

++

다양한 웹페이지를 분석해보자.

 

[정리]

 

1. 웹페이지 코드를 JAVA로 가져오기.

 

2. 해당 url의 페이지 코드를 받아오기위해, 연결통로(스트림)를 열기 (open).

== connect() 메서드를 사용 한다.

 

3. Connection conn = Jsoup.connect(url);

// 클래스명 참조변수 = 클래스명.메서드명();

 

웹과의 소통을 위해 외부로부터 가져온 클래스 == Jsoup 클래스.

 

여기까지가 연결통로(스트림)를 open 한 상태 이다. 이제 통로가 열렸으니, 코드를 가져 와야 한다.

 

4. get() 메서드를 사용해서 코드를 가져오기.

Document doc = null; 로 초기화를 해줘야, Document 클래스가 사용이 가능하다.

try-catch가 강제 이다.

doc.conn.get(); 으로 코드를 가져온다.

 

5. 코드를 가져왔으니, 코드를 분석 하기.

 

document 문서를 분석 해야 한다.

 

Elements elems = doc.select();

태그로 값을 가져올 때 사용하는 메서드 이다.

() 안에 가지고 오려는 정보를 넣어주면 된다.

// a) DOM 문서를 분석

// <> < / > 태그 (요소, element) 단위로 분석.

// 속성 (property) 을 가질 수 있으며,

// 분석할 때에 가장 대표적으로 활용되는 속성이,

// id(유일한 요소), class(여러개의 공통점을 가진 요소들)

 

6. select() 메서드를 통해 분석한 코드에서 내가 정말로 사용할 데이터만 고르는 작업 == 가공.

hasNext(), next(), text() 메서드 등을 사용해서 가공하기.

그밖에,

indexOf()로 자를 위치를 선택해서, substring() 메서드로 자르면서 가공 할 수도 있다. 

등등..

 

Iterator (이터레이터) :

거대한 컬렉션(elems)에 있는 데이터를 작은 단위의 컬렉션으로 나눠 저장 할 수 있도록 해주는 컬렉션.

 

Iterator<Element> itr = elems.iterator();

// 클래스명<타입> 참조변수 = 참조변수.메서드명();

반응형