파이썬(Python)/크롤링 연습

유튜브 - 재생목록 크롤링

레아დ 2022. 12. 8. 15:28

자소서 쓰는데 후...
너무 오랜만에 적어보는 거라 감이 없음......

머리 식힐겸 얼마 전에 연습해본 거 포스팅해야겠다.

유튜브 영상 조회수 및 좋아요 뭐가 제일 많은지
내가 선택한건 채널십오야 !!

유튜브 크롤링하기 전! 유튜브 API 발급받아야 함
앞에 포스팅했음ㅋ
https://leo-contigo.tistory.com/35

유튜브 - API 발급하기

유튜브 크롤링 해보고 싶어서 이리저리 검색해서 찾아보는 중 크롤링을 하려면 우선 ! API 발급해야함 API 발급하기 https://console.cloud.google.com/ Google 클라우드 플랫폼 로그인 Google 클라우드 플랫폼

leo-contigo.tistory.com

작업환경 - 구글 코랩


나는 구글 코랩에서 작성함

일단 필요한 패키지부터 ㄱㄱ

# 필요한 패키지 설치
!pip install --upgrade google-api-python-client
!pip install oauth2client

# 유튜브 크롤링 관련
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from oauth2client.tools import argparser

# 구글 API키 발급받은거 입력하기
DEVELOPER_KEY='구글 API 개인키 입력' 
YOUTUBE_API_SERVICE_NAME='youtube'
YOUTUBE_API_VERSION='v3'

youtube  =build(YOUTUBE_API_SERVICE_NAME,YOUTUBE_API_VERSION,developerKey=DEVELOPER_KEY)

나듀 인터넷 블로그 보고 ㅋㅋ 해본 거임

# q에 채널 
search_response=youtube.search().list(
    q="채널 십오야",
    order='relevance',
    part='snippet',
    maxResults=50,
    ).execute()
    
    
# 촤~~~~압 보고
search_response

# 보면 items로 묶여있는거 첫번째꺼 하나만 가져와봄
search_response['items'][0]

이렇게 보면

>> 결과

{'kind': 'youtube#searchResult',
 'etag': '67keiG8XqUyZqHKU-GCNcWGQOEE',
 'id': {'kind': 'youtube#video', 'videoId': 'Mg7iuVU9MOI'},
 'snippet': {'publishedAt': '2022-11-20T15:23:02Z',
  'channelId': 'UCQ2O-iftmnlfrBuNsUUTofQ',
  'title': '🧳EP.3-1ㅣ단 하나를 지키기 위한 따뜻한 양보와 뜻밖의 이벤트(?)까지.. 스타쉽표 인물퀴즈 한 판ㅣ🧳출장십오야2 X 스타쉽:가을야유회',
  'description': '스타쉽엔터테인먼트 #유료광고포함 #출장십오야 부르면, 달려 갑니다! 영업재개 예능배달서비스 [출장십오야2] 매주 [일] 밤 tvN 미방 ...',
  'thumbnails': {'default': {'url': 'https://i.ytimg.com/vi/Mg7iuVU9MOI/default.jpg',
    'width': 120,
    'height': 90},
   'medium': {'url': 'https://i.ytimg.com/vi/Mg7iuVU9MOI/mqdefault.jpg',
    'width': 320,
    'height': 180},
   'high': {'url': 'https://i.ytimg.com/vi/Mg7iuVU9MOI/hqdefault.jpg',
    'width': 480,
    'height': 360}},
  'channelTitle': '채널 십오야',
  'liveBroadcastContent': 'none',
  'publishTime': '2022-11-20T15:23:02Z'}}

여기서 잘 봐야 함

# 채널 id 값 ... 
channel_id = search_response['items'][0]['snippet']['channelId']
channel_id

>> 결과
UCQ2O-iftmnlfrBuNsUUTofQ

# 채널관리자가 올려놓은 플레이리스트로 받아옴
playlists = youtube.playlists().list(
    channelId = channel_id,
    part = 'snippet',
    maxResults = 20).execute()

playlists
playlists['items'][0]

>> 결과 
{'kind': 'youtube#playlist',
 'etag': 'xrTV56BSa-hWvGqXyZPqbMSr_So',
 'id': 'PLr0T5CaHaPwWUGnEbS8a4xemYN7eLOYtz',
 'snippet': {'publishedAt': '2022-08-19T07:10:27Z',
  'channelId': 'UCQ2O-iftmnlfrBuNsUUTofQ',
  'title': '[🤷🏻\u200d♂내어깨를봐탈골됐잖아] 나 찑짜 안췰했어. 울리 한번 진지하ㄱㅔ 얘기를 해뽉자코',
  'description': '',
  'thumbnails': {'default': {'url': 'https://i.ytimg.com/vi/jtPe8zePmPU/default.jpg',
    'width': 120,
    'height': 90},
   'medium': {'url': 'https://i.ytimg.com/vi/jtPe8zePmPU/mqdefault.jpg',
    'width': 320,
    'height': 180},
   'high': {'url': 'https://i.ytimg.com/vi/jtPe8zePmPU/hqdefault.jpg',
    'width': 480,
    'height': 360},
   'standard': {'url': 'https://i.ytimg.com/vi/jtPe8zePmPU/sddefault.jpg',
    'width': 640,
    'height': 480},
   'maxres': {'url': 'https://i.ytimg.com/vi/jtPe8zePmPU/maxresdefault.jpg',
    'width': 1280,
    'height': 720}},
  'channelTitle': '채널 십오야',
  'localized': {'title': '[🤷🏻\u200d♂내어깨를봐탈골됐잖아] 나 찑짜 안췰했어. 울리 한번 진지하ㄱㅔ 얘기를 해뽉자코',
   'description': ''}}}

블로그에 있는 items값이 살짝 달라서 찾는데 애먹음(?)

어쨌든 채널에 있는 재생목록을 데이터 프레임으로 가져오면 (중간 코드 생략)

나는 여기서 출장십오야를 선택함

# 영상 선택하기
# 출장 십오야ㅋㅋㅋㅋㅋ 선택
# PlayLists 4번 

ya = a['PlayLists'][4]
video = youtube.playlistItems().list(
    playlistId = ya,
    part = 'snippet',
    maxResults = 50,
)

video_list = video.execute()

video_names=[]
video_ids=[]
date=[]

for v in video_list['items']:
    video_names.append(v['snippet']['title'])
    video_ids.append(v['snippet']['resourceId']['videoId'])
    date.append(v['snippet']['publishedAt'])
    
pd.DataFrame([date,video_names,video_ids]).T

50개까지 쫘악~~~
저 컬럼 2가 IDS값

# 영상 IDS 값이 있으면 좋아요 조회수 등 확인가능함

import re

제목=[]
category_id=[]
조회수=[]
좋아요=[]
싫어요=[]
날짜=[]

for u in range(len(a2)):
    request=youtube.videos().list(
    part='snippet,contentDetails,statistics',
    id=a2['IDS'][u])

    response=request.execute()

    if response['items']==[]:
        ids.append('-')
        category_id.append('-')
        조회수.append('-')
        좋아요.append('-')
        싫어요.append('-')
        날짜.append('-')

    else :
        제목.append(response['items'][0]['snippet']['title'])
        category_id.append(response['items'][0]['snippet']['categoryId'])
        조회수.append(response['items'][0]['statistics']['viewCount'])
        좋아요.append(response['items'][0]['statistics']['likeCount'])
        싫어요.append(response['items'][0]['statistics']['favoriteCount'])
        날짜.append(response['items'][0]['snippet']['publishedAt'])

pd.DataFrame([제목,category_id,조회수,좋아요,싫어요,날짜]).T

크롤링 당시 기준임ㅋㅋㅋ
여기서 조회수 순으로 내림차순 하고 싶었는데
안 먹히는 거야!!!! 왜!!!!!!!

숫자가 문자열이었음...... obj... 그래서 int로 바꿔주고 ㅋㅋㅋ
다시 정렬했음

이때는 킹콩&스타쉽 출장십오야가 조회수가 제일 높았음 ㅋㅋㅋ

중간에 건너뛰기 한 부분이 많음 ㅋㅋㅋ
전체 작성한 코드는 깃허브에 있음 ㅋㅋㅋㅋㅋ
https://github.com/leo-contigo/Python/blob/main/crawling/5_%EC%9C%A0%ED%8A%9C%EB%B8%8C(youtube)_%ED%81%AC%EB%A1%A4%EB%A7%81.ipynb

GitHub - leo-contigo/Python: #파이썬, #크롤링, #시각화

#파이썬, #크롤링, #시각화 . Contribute to leo-contigo/Python development by creating an account on GitHub.

github.com




* 참고한 블로그
https://ssongblog.tistory.com/125

[Python] Youtube API 크롤링

API를 활용한 유튜브 크롤링¶ 참고 블로그 : https://blog.naver.com/PostView.naver?blogId=leenk1006&logNo=222454926151&parentCategoryNo=&categoryNo=27&viewDate=&isShowPopularPosts=true&from=search 참고 문서 : https://developers.google.com/

ssongblog.tistory.com

728x90