코드부분
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

'프로젝트 & 실습 > 실습 & 평가 등' 카테고리의 다른 글
[실습] JS를 이용한 주사위 게임 (0) | 2023.01.01 |
---|---|
[실습] form태그를 이용한 네이버 회원가입 페이지 만들기 (0) | 2023.01.01 |
[평가] DBMS 평가 (1) | 2023.01.01 |
[평가] 문제 오답풀이 (0) | 2023.01.01 |
[실습] ArrayList 실습 (0) | 2022.12.31 |
댓글