본문 바로가기
빅데이터/크롤링

자바 유튜브 API 이용하여 데이터 가져오기( 유튜브 크롤링)

by 처리2 2020. 12. 23.
반응형

유튜브 크롤링 할때 여러분들은 어떻게 하세요?

 

뭐 다 똑같겠죠 내용까지 가져오려면 클릭해서 안에 내용가져오고 다시 URL바꿔서 수집하고 .. 이러면 과부하도 걸리고

오래걸리고 그러자나여? 알아여 해봤으니깐 

 

근데 유튜브도 API로 인해 쉽게 데이터를 가져올 수 있다는 사실을 알고 계셨나요?

 

알았다면 여기서 우리가 만날일은 없었겠죠

 

자 다시 소스 들어가여~

 

	//동영상 카운트
	private int cnt =1;
	
	public void getYoutube(String nextToken) {

	  String apikey = "자신의 api key 값";
	  String channelId = "자신이 수집하고 싶은 채널 id값 UC로 시작하는거";
	  String UPplaylistid ="UCxxxxx 를 UU로 바꿔줘서 넣어주세염";
	  String apiUrl = "https://www.googleapis.com/youtube/v3/playlistItems?key="+ apikey
	  + "&playlistId="+ UPplaylistid
	  + "&part=snippet&fields=nextPageToken,pageInfo,items(id,snippet(publishedAt,title,description,thumbnails(high(url)),resourceId(videoId)))&order=date&maxResults=50";
  
	  //2번째 부터 다음 토큰값 있으면 파리미터 추가한다.
	  if (nextToken != null) {
		 apiUrl+= "&pageToken=" + nextToken ;
	  }
	  GetJson getJson = new GetJson();
	  JSONObject json = getJson.readJsonFromUrl(apiUrl);
	 
	 if( json.has("nextPageToken")){
		 nextToken = json.getString("nextPageToken");
	 }else {
		 nextToken = null;
	 }
	 //페이지 관련 정보
	 //JSONObject page = json.getJSONObject("pageInfo"); 
	 JSONArray jArray = json.getJSONArray("items");
 
//	 System.out.println("next 토큰은 "+ nextToken +" 배열에는 " + jArray.length()+ "개의 정보 들어옴");
	 ArrayList<crawlingDTO> Ylist = new ArrayList<>();
	  for(int i =0 ; i< jArray.length(); i++) {

		JSONObject item =   jArray.getJSONObject(i);
	
		//snippet 
		JSONObject snippet = item.getJSONObject("snippet");
		
		String publishedAt = snippet.getString("publishedAt");
		String description = snippet.getString("description");
		if(description.equals("This video is unavailable.")) {continue;}
		String title = snippet.getString("title");
		
		JSONObject thumbnails = snippet.getJSONObject("thumbnails");
		JSONObject high = thumbnails.getJSONObject("high");
		
		
		//비디오 id
		JSONObject resourceId = snippet.getJSONObject("resourceId");
		String videoId = resourceId.getString("videoId"); 

		String thumbUrl = "https://i.ytimg.com/vi/"+videoId+"/mqdefault.jpg";
		
		//유튜브 동영상 정보  출력   여기값들 저장 필요;;;;
//		System.out.println(cnt);
//		System.out.println(title);
//		System.out.println(publishedAt);
//		System.out.println(description);
//		System.out.println(thumbUrl);
//		System.out.println(videoId);
		
		String date = publishedAt.substring(0,publishedAt.indexOf("T"));
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		SimpleDateFormat format2 = new SimpleDateFormat("yyyy.MM.dd");
		Date dates;
		
		try {
			dates = format.parse(date);
			date = format2.format(dates);
		} catch (ParseException e) {
			System.out.println("date 파싱 에러");
		}
		title = Normalizer.normalize(title, Normalizer.Form.NFC);
        //이게 내용
		description = Normalizer.normalize(description, Normalizer.Form.NFC); 

	  }

	  //토큰값이 있으면 계속해서 호출
	  if(nextToken != null) {
		  getYoutube(nextToken);
	  }else {
		  System.out.println("종료!!");
	  }
  }

썸네일 출력하는 부분이랑 날짜 처리하는거 까지 다 넣어놨으니깐 편하게 이용만 해주시면 됩니다~ ㅎㅎㅎㅎ

 

그리고 이거는 메소드 자체가 돌기 때문에 안에서 리스트 처리하는 부분은 전역변수로 빼줘야 합니다

반응형

댓글