[41일] 크롤링 (5) - 네이버 영화 평점
네이버 영화에서 평점을 크롤링해보자
네이버 영화에 들어가서 아무 영화나 하나 선택하자.
https://movie.naver.com/movie/bi/mi/point.naver?code=201641#tab
공조2: 인터내셔날
공조 이즈 백! 이번엔 삼각 공조다!남한으로 숨어든 글로벌 범죄 조직을 잡기 위해 새로운 공조 수사에 ...
movie.naver.com
이제 url을 분석해야 한다. 관람객 평점에서 2, 3... 페이지를 눌러보니 url에 변동이 없다. 여기서는 iframe을 이용하여 따로 만든 페이지에서 연결만 시켜놓았기 때문이다. 관람객 평점의 다른 페이지 url을 얻기 위해
페이지 번호에 우클릭 후 새 탭에서 열기나 새 창에서 열기를 하면 url 주소를 얻을 수 있다.
https://movie.naver.com/movie/bi/mi/pointWriteFormList.naver?code=201641&type=after&onlyActualPointYn=N&onlySpoilerPointYn=N&order=sympathyScore&page=1
https://movie.naver.com/movie/bi/mi/pointWriteFormList.naver?code=201641&type=after&onlyActualPointYn=N&onlySpoilerPointYn=N&order=sympathyScore&page=2
https://movie.naver.com/movie/bi/mi/pointWriteFormList.naver?code=201641&type=after&onlyActualPointYn=N&onlySpoilerPointYn=N&order=sympathyScore&page=22
이제 마찬가지로 page=숫자에서 숫자를 변수로 하여 작업을 하면 된다.
우선은 1 페이지만 가져온 후 확인하고 전체 페이지를 가져와 보겠다.
package crawling0923;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class Test06_NaverMovie {
public static void main(String[] args) {
// 네이버 영화 평점 후기 크롤링하기
// 예)"공조2" 영화 평점 제목을 공감 순으로 정렬 후 크롤링하기(1페이지)
try {
//네이버 영화 평점 후기 페이지 주소
String URL="https://movie.naver.com/movie/bi/mi/pointWriteFormList.naver";
String params="?code=201641"; //영화코드번호
params += "&type=after&onlyActualPointYn=N&onlySpoilerPointYn=N";
params += "&order=sympathyScore"; //공감순
params += "&page=1";
Document doc = Jsoup.connect(URL+params).get();
System.out.println(doc.toString());
} catch (Exception e) {
System.out.println("크롤링 실패 : " + e);
}//end
}//main() end
}//class end
평가 멘트를 가져오기 위해 태그를 확인하니 id 값으로 '_filtered_ment_번호'로 되어 있다. 1페이지에 번호가 0 ~ 9까지 있으니 이를 반복문을 이용해서 처리하자
package crawling0923;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Test06_NaverMovie {
public static void main(String[] args) {
// 네이버 영화 평점 후기 크롤링하기
// 예)"공조2" 영화 평점 제목을 공감 순으로 정렬 후 크롤링하기(1페이지)
try {
//네이버 영화 평점 후기 페이지 주소
String URL="https://movie.naver.com/movie/bi/mi/pointWriteFormList.naver";
String params="?code=201641"; //영화코드번호
params += "&type=after&onlyActualPointYn=N&onlySpoilerPointYn=N";
params += "&order=sympathyScore"; //공감순
params += "&page=1";
Document doc = Jsoup.connect(URL+params).get();
//System.out.println(doc.toString());
//1. 평점 제목이 있는 요소
//<span id="_filtered_ment_0"> </span>
// ...
//<span id="_filtered_ment_9"> </span>
for(int ment=0; ment<=9; ment++) {
Elements elements = doc.select("#_filtered_ment_" + ment);
for(Element element : elements) {
System.out.println(element.text());
}//for end
}//for end
/////////////////////////////////////////////////////
//2. 평점 제목이 있는 요소
/*
<div class="score_reple">
<p>
<span class="ico_viewer">관람객</span>
<span id="_filtered_ment_0">
현빈 다니엘 헤니 존잘ㅎㅎ
</span>
</p>
</div>
*/
Elements elements = doc.select(".score_reple p");
//불필요한 요소 제거하기 <span class="ico_viewer">관람객</span>
elements.select(".ico_viewer").remove();
for (Element element : elements) {
System.out.println(element.text());
}//for end
} catch (Exception e) {
System.out.println("크롤링 실패 : " + e);
}//end
}//main() end
}//class end
평점 멘트를 가져오는 방법에는 여러 가지가 있을 수 있다. 여러 방법 중 두 가지 방법을 작성했다. 1번이나 2번 둘 중 아무 방법으로 해도 가능하다.
1페이지에 있는 평점 멘트들을 가져왔다. 이제는 전체 페이지의 평점 멘트를 가져와 메모장에 출력하는 작업을 해보자
package crawling0923;
import java.io.FileWriter;
import java.io.PrintWriter;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Test07_NaverMovie {
public static void main(String[] args) {
// 네이버 영화 평점 후기 크롤링하기
// 예)"공조2" 영화 평점 제목을 공감 순으로 정렬 후 크롤링하기 (약 9690건)
//gongjo.txt. 파일에 저장하기
try {
String fileName = "I:/java202207/gongjo.txt";
FileWriter fw = new FileWriter(fileName, true);
PrintWriter out = new PrintWriter(fw, true);
String URL="https://movie.naver.com/movie/bi/mi/pointWriteFormList.naver";
String params="?code=201641"; //영화코드번호
params += "&type=after&onlyActualPointYn=N&onlySpoilerPointYn=N";
params += "&order=sympathyScore"; //공감순
params += "&page="; //대략 1 ~ 969 페이지
//공감순 order=sympathyScore
//최신순 order=newest
//평점높은순 order=highest
//평점낮은순 order=lowest
for(int p=1; p<=969; p++) {
System.out.println("데이터수집중...");
Document doc = Jsoup.connect(URL+params+p).get();
for(int ment=0; ment<=9; ment++) {
Elements elements = doc.select("#_filtered_ment_" + ment);
for(Element element : elements) {
out.println(element.text());
}//for end
}//for end
}//for end
out.close();
fw.close();
System.out.println("------gongjo.txt 공조2 평점 저장 완성!!");
} catch (Exception e) {
System.out.println("크롤링 실패 : " + e);
}//end
}//main() end
}//class end