JSP

[JSP] jsoup 를 이용한 크롤링 및 Oracle 데이터 베이스 저장

allempty_sheep 2024. 8. 1. 11:05
반응형

.

라이브러리 파일을 받아주자.

https://mvnrepository.com/artifact/org.jsoup/jsoup/1.18.1

 

bugs 차트를 가져와서 연습 해 볼 것이다.

https://music.bugs.co.kr/chart

 

나를 위한 플리, 벅스

나를 위한 플리, 벅스! 마음을 담은 노래추천 플레이리스트, 그리고 일상을 감성으로 가득 채워줄 essential player까지

music.bugs.co.kr

 

해당 라인을 100개 가져와야 한다.

 

title, artist 를 가져오는 코드이다.

	<%
		String crawlingUrl = "https://music.bugs.co.kr/chart";
		Document doc = Jsoup.connect(crawlingUrl).get();
		Elements titles = doc.select("p.title > a");
		Elements artists = doc.select("p.artist > a");
		
		pageContext.setAttribute("titles", titles);
		pageContext.setAttribute("artists", artists);
	%>

 

화면에 뿌려주기 위한 코드이다.

	<div class="body-main">
		<div class="container">
			<div class="row">
				<c:forEach items="${titles}"  var="title" varStatus="status">
						<div class="col-4">${status.index +1}</div>
						<div class="col-4">${title}</div>
						<div class="col-4">${artists[status.index]}</div>
				</c:forEach>
			</div>
		</div>
	</div>

 

아래와 같이 데이터가 나열 될 것이다.

 

데이터 베이스 저장을 해보자. oracle을 이용한 것이다.

user 이름은 bugs

비밀번호는 bugs1234 

라고 지정 해 주었다.

 

계정 생성은 아래를 참고한다.

https://allemptysheep.tistory.com/42

 

[Oracle] 접속, 계정 생성, Oracle SQL Developer 접속

system 으로 오라클 접속sqlplus / as sysdba  계정 생성 ( [] 는 제외한 값을 입력한다.)create user [유저명] identified by [비밀번호]; 아래와 같은 에러가 날 수 있다.'공통 사용자 또는 롤 이름이 부족합니

allemptysheep.tistory.com

 

오라클 데이터베이스에 저장을 위한 DAO를 하나 만들어 주었다.

mysql 에서 했던것과 같이 Elements 를 받아서 for문으로 돌면서 저장한다.

다른점이 있다면 sql에서 duplicate key를 처리하기 위해서 Merge Into 를 사용 했다는 것이다.

import javax.servlet.ServletContext;

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

import common.JDBConnect;

public class BugsDAO extends JDBConnect {
	public BugsDAO (ServletContext application) {
		super(application);
	}
	
	public int insertSong(Elements titles, Elements artists) {
		int rs = 0;
		
		for(Element title: titles) {
			int rankData = titles.indexOf(title)+1;
			String titleData = title.text();
			String artistData = artists.get(titles.indexOf(title)).text();
			
			System.out.println(rankData);
			System.out.println(titleData);
			System.out.println(artistData);
			
			// String sql = "INSERT INTO songs VALUES (?, ?, ?, SYSDATE)) ON DUPLICATE KEY UPDATE num = (?)";
			
			String sql = "MERGE INTO songs USING dual ON ( title = (?) AND regdate = SYSDATE) " +
					 "WHEN MATCHED THEN UPDATE SET num = (?)" +
					 "WHEN NOT MATCHED THEN INSERT (num, title, artist, regdate) VALUES (?, ?, ?, SYSDATE)";
			try {
				psmt = con.prepareStatement(sql);
				psmt.setString(1, titleData);
				psmt.setInt(2, rankData);
				psmt.setInt(3, rankData);
				psmt.setString(4, titleData);
				psmt.setString(5, artistData);
				rs = psmt.executeUpdate();
				
				
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
		}

		/*
		
		*/
		return rs;
	}
}

 

이제 화면에서 DAO 를 호출하여 함수를 사용 해 보자.

	<%
		String crawlingUrl = "https://music.bugs.co.kr/chart";
		Document doc = Jsoup.connect(crawlingUrl).get();
		Elements titles = doc.select("p.title > a");
		Elements artists = doc.select("p.artist > a");
		
		pageContext.setAttribute("titles", titles);
		pageContext.setAttribute("artists", artists);
		
		// System.out.println(titles);
		BugsDAO bugsDAO = new BugsDAO(application);
		bugsDAO.insertSong(titles, artists);
	%>
	<div class="body-main">
		<div class="container">
			<div class="row">
				<c:forEach items="${titles}"  var="title" varStatus="status">
						<div class="col-4">${status.index +1}</div>
						<div class="col-4">${title}</div>
						<div class="col-4">${artists[status.index]}</div>
				</c:forEach>
			</div>
		</div>
	</div>

 

데이터 베이스에서 아래와 같이 저장 될 것이다.