03. JAVA를 이용한 네이버 영화 평점 크롤링 (AJAX가 적용된 사이트, 크롤링 결과 파일로 저장하기)
○ 네이버 영화 평점 크롤링하기
- 범죄도시2 관람객 평점 크롤링하기
- 한페이지에 10건씩 총 2404건의 평점, 총 25페이지 크롤링 필요
- AJX로 만들어서, 리뷰 페이지 넘겨도 URL안바뀜 > 소스 분석 필요
○ 네이버 영화 평점 소스 분석
1) URL 분석
- 크롬 개발자 도구를 이용해서 <iframe>에 걸려있는 URL로 넘어가니 관람객 리뷰만 있는 페이지로 이동
- https://movie.naver.com/movie/bi/mi/pointWriteFormList.naver?code=192608
1페이지 > https://movie.naver.com/movie/bi/mi/pointWriteFormList.naver?code=164122&page=1
2페이지 > https://movie.naver.com/movie/bi/mi/pointWriteFormList.naver?code=164122&page=2
<iframe src="/movie/bi/mi/pointWriteFormList.naver
?code=192608&type=after&isActualPointWriteExecute=false
&isMileageSubscriptionAlready=false&isMileageSubscriptionReject=false"
id="pointAfterListIframe" name="pointAfterListIframe" width="100%"
frameborder="0" scrolling="no" class="ifr" title="네티즌 평점 리스트"
height="1345px"></iframe>
2) 요소 분석
- 리뷰 내용이 들어있는 HTML요소 <span id="_filtered_ment_0"> ~ <span id="_filtered_ment_9">
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
- 또는 <div class="score_reple"> 의 내용을 가져온 뒤,
필요없는 내용을 제거(관람객여부 표시(<span class="ico_viewer"), 아이디, 날짜, 신고버튼(<dl>) 등)
Elements elements=doc.select(".score_reple");
elements.select(".ico_viewer").remove(); //관람객 표시
elements.select("dl").remove(); //<dl> 아이디, 날짜, 신고버튼 등
○ 네이버 영화 평점 크롤링 결과 출력
① 콘솔창
package crawlingPosting;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Test05_crawling {
public static void main(String[] args) {
try {
String movieCode="192608"; //범죄도시2
int reples = 2404; //총 리플수
int pages = (int)(reples/10)+1;
String URL="https://movie.naver.com/movie/bi/mi/pointWriteFormList.naver";
for(int p=1; p<=pages; p++) {
String params = "?code=" + movieCode;
params += "&page=" + p;
params += "&type=after&onlyActualPointYn=Y";
Document doc=Jsoup.connect(URL+params).get();
Elements elements=doc.select(".score_reple");
elements.select(".ico_viewer").remove();
elements.select("dl").remove();
for(Element element : elements) {
System.out.println(element.text());
}//for end
}//for end
} catch (Exception e) {
System.out.println("크롤링 실패: " + e);
}//try end
}//main() end
}//class end
② txt 파일로 출력
- "범죄도시2" 영화 평점을 관람객만 크롤링한 후 메모장 파일에 저장하기 (TheOutlaws2.txt)
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 Test06_crawling {
public static void main(String[] args) {
try {
String filename="C:/java202202/TheOutlaws2.txt";
FileWriter fw= new FileWriter(filename, false);
PrintWriter out= new PrintWriter(fw, true);
String movieCode="192608"; //범죄도시2
int reples = 2404; //총 리플수
int pages = (int)(reples/10)+1;
String URL="https://movie.naver.com/movie/bi/mi/pointWriteFormList.naver";
for(int p=1; p<=pages; p++) {
String params = "?code=" + movieCode;
params += "&page=" + p;
params += "&type=after&onlyActualPointYn=Y";
Document doc=Jsoup.connect(URL+params).get();
Elements elements=doc.select(".score_reple");
elements.select(".ico_viewer").remove();
elements.select("dl").remove();
for(Element element : elements) {
out.println(element.text());
}//for end
}//for end
System.out.println("-----TheOutlaws2.txt 저장 완료");
out.close();
fw.close();
} catch (Exception e) {
System.out.println("크롤링 실패: " + e);
}//try end
}//main() end
}//class end
○ 네이버 영화 평점 크롤링 관련 파라미터
- 그 외 크롤링 시 사용할 수 있는 파라미터
① 관람객 평점만 보기 : &onlyActualPointYn=Y / &onlyActualPointYn=N
② 스포일러 보기 : &onlySpoilerPointYn=Y / &onlySpoilerPointYn=N
③ 정렬
&order=newest : 최신순
&order=highest : 평점 높은 순
&order=lowest : 평점 낮은 순
&order=sympathyScore : 공감순