최근 개발 중인 프로젝트에서 영화 관련 데이터 수집에 새로운 방법이 필요하게 되었다. 하지만 Naver 영화 API가 서비스를 종료함에 따라 이에 대한 대안으로 직접 웹 크롤링을 통해 데이터를 수집하기로 결정하고, CGV의 웹사이트를 대상으로 크롤링 프로그램을 개발하기로 했다. 목표는 CGV에서 제공하는 최신 영화 정보를 수집하여 분석 가능한 형태로 저장하는 것이었다.
CGV는 다양한 영화 정보를 실시간으로 업데이트하며 제공하고 있어, 데이터를 수집하기에 적합한 웹사이트였다. 이 프로젝트에서는 Java를 기반으로 하며, Jsoup 라이브러리를 사용하여 HTML 문서를 파싱하고 조작할 수 있도록 했다.
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.4</version>
</dependency>
ol
태그와 li
태그를 통해 영화 정보를 파싱하고, 각 영화의 상세 정보를 MovieDAO
클래스의 객체에 저장했다. 이 클래스는 영화의 순위, 링크, 이미지, 연령 등급, 제목, 예약율, 평점, 개봉일 등의 속성을 포함하고 있다.for (Element ol : ols) {
Elements lis = ol.getElementsByTag("li");
for (Element li : lis) {
if (!li.text().isEmpty()) {
MovieDAO movie = new MovieDAO();
movie.setMovieRank(Integer.parseInt(li.getElementsByClass("rank").text().substring(3)));
movie.setMovieHref(li.getElementsByTag("a").attr("href"));
movie.setMovieImage(li.getElementsByTag("img").attr("src").trim());
movie.setMovieAgeGrade(li.getElementsByTag("i").text().trim());
movie.setMovieTitle(li.getElementsByClass("title").text().trim());
Elements percents = li.getElementsByClass("percent");
for (Element percent : percents) {
movie.setMovieReservationRate(percent.getElementsByTag("span").text().trim());
}
Elements eggs = li.getElementsByClass("egg-gage");
for (Element egg : eggs) {
movie.setMovieEggGage(egg.getElementsByClass("percent").text().trim());
}
movie.setMovieReleaseDate(li.getElementsByClass("txt-info").text().trim().substring(0,10));
movieDAOList.add(movie);
}
}
}
public Map<String, String> CrawMoiveDetails(String detailUrl) throws Exception {
Map<String, String> movieDetails = new HashMap<>();
Document document = Jsoup.connect(URL.substring(0, URL.length()-7).concat(detailUrl)).get();
Elements contents = document.getElementsByClass("box-contents");
Element detail = contents.get(0);
String movieEngTitle = detail.getElementsByTag("p").first().text().trim();
String movieStory = document.getElementsByClass("sect-story-movie").text().trim();
movieDetails.put("movieEngTitle", movieEngTitle);
movieDetails.put("movieStory", movieStory);
return movieDetails;
}
CGV에서 직접 데이터를 수집함으로써, 필요한 영화 정보를 지속적으로 업데이트하고 관리할 수 있는 방법을 개발했다. 이 경험은 데이터 크롤링의 중요성과 함께, 실시간 웹 데이터를 활용하는 방법을 깊이 이해하는 데 크게 기여했다.