본문 바로가기
프로젝트 & 실습/실습 & 평가 등

[프로젝트] Jsoup을 이용한 웹 크롤링 프로젝트(Feat. Genie)

by hhyyyjun 2023. 1. 1.

코드부분

https://github.com/hhyyyjun/GeniePageCrolling

 

GitHub - hhyyyjun/GeniePageCrolling

Contribute to hhyyyjun/GeniePageCrolling development by creating an account on GitHub.

github.com

 

웹크롤링을 이용하여 Genie 사이트 top 50차트의 곡명, 가수명, 앨범명의 데이터를 DB에 저장해보았다.

크롤링 데이터를 저장할 테이블 생성

PK, TITLE(곡명), ARTIST(가수명), ALBUM(앨범명), VIEWNUM(조회수)

크롤링을 통해 테이블에 데이터 저장

package controller;

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;

import model.GenieDAO;
import model.GenieVO;

public class GenieCrawling {
	
	public static void sample() {
		
		final String url = "https://www.genie.co.kr/chart/top200";
		Document doc = null;
		try {
			doc = Jsoup.connect(url).get(); // connect를 통해 지니top200 사이트의 html문서를 불러옴
		} catch (IOException e) {
			e.printStackTrace();
		}

		String title1 = "a.title.ellipsis"; // 태그 or class, id명
		String artist1 = "a.artist.ellipsis";
		String album1 = "a.albumtitle.ellipsis";

		Elements eles = doc.select("div.music-list-wrap"); // 아래 정보들을 포함하는 div의 정보 가져온다
		Elements title2 = eles.select(title1); // 제목 정보 불러온다
		Elements artist2 = eles.select(artist1); // 가수 정보 불러온다
		Elements album2 = eles.select(album1); // 앨범 정보 불러온다

		GenieDAO gDAO = new GenieDAO();

		Iterator<Element> title3 = title2.iterator();
		Iterator<Element> artist3 = artist2.iterator();
		Iterator<Element> album3 = album2.iterator();

		while (title3.hasNext()) {
			String title4 = title3.next().text(); // 다음 요소(곡명)로 이동
			System.out.println("곡 명 : " + title4);
			String artist4 = artist3.next().text(); // 다음 요소(가수명)으로 이동
			System.out.println("가수 명 : " + artist4);
			String album4 = album3.next().text(); // 다음 요소(앨범명)으로 이동
			System.out.println("앨범 명 : " + album4);
			System.out.println();

			GenieVO vo = new GenieVO();
			vo.setTitle(title4); // vo의 title에 title4 데이터 삽입
			vo.setArtist(artist4); // vo의 artist에 artist4 데이터 삽입
			vo.setAlbum(album4); // vo의 album에 album4 데이터 삽입
			gDAO.insert(vo); // dao insert함수 호출
		}
		System.out.println("로그: DB에 저장완료!");
		System.out.println();
	}
}

1위~50위까지 총 50개의 데이터가 저장된 것을 확인

프로젝트의 각 기능

각 java 코드는 Git에서 확인

 

MemberDAO

1) 로그인

먼저 아이디 값을 입력 후 비밀번호를 입력한 값과 DB에 저장된 값을 비교

2) 회원가입

sql문 INSERT를 사용하여 아이디와 비밀번호, 이름 입력 시 DB에 저장한다.

**SELECT NVL(MAX(MNUM),0)+1 FROM MEMBER) : PK 값 1씩 증가하며 저장

3) 회원 탈퇴

비밀번호를 비교하여 동일할 시 DB에서 삭제한다.


MemberDAO

1) 노래 검색 시 GENIE 테이블로부터 받아온 데이터 저장

2) 데이터를 받아올 때마다 노래 한 곡 데이터에 대해서만 업데이트

동일한 유저 PK 값 데이터에서 노래 PK값 변경

3) 최근 검색한 노래 출력

4) 최근 검색한 노래를 제외하고 1~5위 사이의 노래 랜덤 추천 출력

코드순서

SELECT * FROM GENIE WHERE GNUM NOT IN(SELECT GNUM FROM MYPAGE))

1. FROM GENIE --테이블선택

2. WHERE GNUM --GNUM의 데이터

3. NOT IN(SELECT GNUM FROM MYPAGE) --MYPAGE 테이블의 GNUM을 제외한

4. SELECT * --요청한 모든 컬럼 값을 출력

5. FROM (SELECT * FROM GENIE WHERE GNUM NOT IN(SELECT GNUM FROM MYPAGE)) --위 순서를 진행한 후의 테이블 선택

6. WHERE (ROWNUM BETWEEN 1 AND 5) --ROWNUM이 1~5 사이인 데이터

7. SELECT RANK() OVER (ORDER BY VIEWNUM DESC), TITLE, ARTIST --VIEWNUM을 내림차순 정렬하여 순위대로 출력, TITLE, ARTIST 컬럼 값을 출력


GenieDAO

1) 크롤링 데이터 DB에 저장

2) 노래 차트 출력

ORDER BY 사용 - 조회수에 따라 내림차순 정렬

3) 검색 시(가수검색/노래검색)

Like문을 사용하여 해당 문자열이 들어간 데이터를 출력하였고, 이 때 대소문자 구분을 막기 위해 UPPER 을 사용하여 소문자를 작성했을 때도 대문자로 치환하여 검색결과를 볼 수 있도록 하였음.

4) 노래 검색 시 출력

5) 노래가 검색될 때마다 조회수 +1

 

콘솔동작확인.pdf
0.16MB
크롤링요약_로직_어려웠던 점.pdf
0.25MB
Jsoup을 이용한 지니 TOP50 차트 크롤링 설명서.pdf
0.63MB

 

댓글