JSP

크롤링 (네이버 영화 리뷰 및 DB저장)

code2772 2022. 12. 4. 15:46
728x90
반응형
REST(Reprsentational State Transfer)
        - 자원을 이름으로 구분하여 해당 자원의 상태를 주고 받는 모든 것을 의미
        - 자원 : 소프트웨어가 관리하는 모든 것(문서, 이미지, 데이터..)
        - json, xml을 통해 데이터를 주고 받는 것이 일반적

        장점
        - HTTP 프로토콜의 인프라를 그대로 사용하므로 REST API 사용을 위한 별도의 인프라를 구축할 필요가 없음
        - HTTP 표준 프로토콜에 따른 모든 플랫폼에서 사용이 가능
        - 서버와 클라이언트의 역할을 명확하게 분리(프론트엔드 - 백앤드)

        단점
        - 표준이 존재하지 않음
        - 사용할 수 있는 메소드의 형대가 제한적
        - 구형 브라우저가 아직 지원하지 않는 부분이 존재할 수 있음

        과제
        네이버 영화에서 영화제목, 평점, 리뷰를 크롤링 10p 페이지를 DB에 저장
        https://movie.naver.com/movie/point/af/list.naver
        https://movie.naver.com/movie/point/af/list.naver?&page=1

 

 

package com.koreait.crawling;
import java.util.Iterator;

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


public class Crawling1 {

    public static void main(String[] args) {
        String url ="http://www.cgv.co.kr/movies/";
//    System.out.println("접속주소: "+url);

        Document doc = null;

        try {
            doc = Jsoup.connect(url).get();
//    System.out.println("접속성공!");
//    System.out.println(doc.html());

        }catch(Exception e) {
            e.printStackTrace();
        }

        Elements elements = doc.select("div.sect-movie-chart");
        Iterator<Element> rank = elements.select("strong.rank").iterator();
        Iterator<Element> title = elements.select("strong.title").iterator();

        while(rank.hasNext()) {
            System.out.println(rank.next().text()+":"+title.next().text());
        }

    }

}

 

package com.koreait.crawling;
import java.util.Iterator;

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


public class crawling2 {

    public static void main(String[] args) {
        String url ="https://music.bugs.co.kr/chart";

        Document doc = null;

        try {
            doc = Jsoup.connect(url).get();
//    System.out.println("접속성공!");
//    System.out.println(doc.html());

        }catch(Exception e) {
            e.printStackTrace();
        }

        Elements elements = doc.select("table.byChart");
        Iterator<Element> title = elements.select("p.title").iterator();
        Iterator<Element> artist = elements.select("p.artist").iterator();

        int rank =1;
        while(title.hasNext()) {
            System.out.println(rank+"위 "+artist.next().text()+"-"+title.next().text());
            rank++;
        }

    }

}

 

✔ 네이버 영화 리뷰 10페이지 크롤링 DB저장

/*
SQL 문
use aidev;
create table tb_mv(
m_idx int not null auto_increment primary key,
m_title varchar(50),
m_score int, 
m_review varchar(1000)
);

select * from tb_mv;*/





package com.koreait.crawling;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Iterator;

import javax.servlet.http.HttpSession;

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

import com.koreait.db.Dbconn;

public class Mcrawling {
    public static void main(String args[]) {
        for(int i=1; i<11; i++) {
            String url = "https://movie.naver.com/movie/point/af/list.naver?&page=" +" str(i)";

            Document doc = null;

            try {
                doc = Jsoup.connect(url).get();
            }catch(IOException e) {
                e.printStackTrace();
            }

            Elements element = doc.select("table.list_netizen");

            Iterator<Element> moviename = element.select("a.movie").iterator();
            Iterator<Element> scores = element.select("div.list_netizen_score").iterator();
            Iterator<Element> content = element.select(".title").iterator();
            int idx=0;





            while(moviename.hasNext()) {

                String movienames = moviename.next().text();

                String scores2=scores.next().text();
                scores2=scores2.substring(12);
                int score =Integer.parseInt(scores2);

                String content2 = content.next().text();
                idx = content2.indexOf("중");

                content2 = content2.replaceAll("신고", "");


                Connection conn = null;



                PreparedStatement pstmt = null;
                try {

                    String m_title = movienames;
                    int  m_score = score;
                    String m_review = content2;
                    String sql = "insert into tb_mv(m_title, m_score, m_review) values ( ?, ?, ?)";
                    conn = Dbconn.getConnection();
                    pstmt = conn.prepareStatement(sql);
                    pstmt.setString(1, m_title);
                    pstmt.setInt(2, m_score);
                    pstmt.setString(3, m_review);
                    pstmt.executeUpdate();

                } catch (Exception e) {
                    e.printStackTrace();
                }


                System.out.println("영화 제목 : "+movienames + "별점 :"+score + "점 리뷰내용 :" + content2);

            }

        }
    }
}

 

 

반응형