크롤링 기능

023·2024년 7월 10일
0
post-thumbnail

서론

최근 개발 중인 프로젝트에서 영화 관련 데이터 수집에 새로운 방법이 필요하게 되었다. 하지만 Naver 영화 API가 서비스를 종료함에 따라 이에 대한 대안으로 직접 웹 크롤링을 통해 데이터를 수집하기로 결정하고, CGV의 웹사이트를 대상으로 크롤링 프로그램을 개발하기로 했다. 목표는 CGV에서 제공하는 최신 영화 정보를 수집하여 분석 가능한 형태로 저장하는 것이었다.

1. 개발 배경 및 도구 선택

CGV는 다양한 영화 정보를 실시간으로 업데이트하며 제공하고 있어, 데이터를 수집하기에 적합한 웹사이트였다. 이 프로젝트에서는 Java를 기반으로 하며, Jsoup 라이브러리를 사용하여 HTML 문서를 파싱하고 조작할 수 있도록 했다.

2. 초기 설정 및 라이브러리 준비

  • Java 프로젝트를 생성하고 Jsoup 라이브러리를 프로젝트에 포함시켰다.
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.15.4</version>
</dependency>

3. 크롤링 로직 설계

  • CGV의 영화 페이지('http://www.cgv.co.kr/movies')에서 필요한 정보를 추출하기 위한 URL을 설정하고, Jsoup를 사용하여 해당 페이지의 HTML을 로드했다.

4. 영화 데이터 추출 및 객체 매핑

  • HTML 문서에서 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);
        }
    }
}

5. 영화 세부 정보 크롤링

  • 상세 페이지 URL을 파싱하여 추가적인 영화 세부 정보를 가져왔다. 이는 영화의 영문 제목과 줄거리를 포함한다.
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;
}

6. 결과 검증 및 출력

  • 크롤링 결과를 콘솔에 출력하여 검증했다. 이 과정을 통해 크롤링 프로세스의 정확성을 확인할 수 있었다.

결론

CGV에서 직접 데이터를 수집함으로써, 필요한 영화 정보를 지속적으로 업데이트하고 관리할 수 있는 방법을 개발했다. 이 경험은 데이터 크롤링의 중요성과 함께, 실시간 웹 데이터를 활용하는 방법을 깊이 이해하는 데 크게 기여했다.

profile
Get your hands dirty

0개의 댓글