유튜브 - 재생목록 크롤링
자소서 쓰는데 후...
너무 오랜만에 적어보는 거라 감이 없음......
머리 식힐겸 얼마 전에 연습해본 거 포스팅해야겠다.
유튜브 영상 조회수 및 좋아요 뭐가 제일 많은지
내가 선택한건 채널십오야 !!
유튜브 크롤링하기 전! 유튜브 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