Selenium 등 없이 API를 활용해서 데이터 크롤링하기
이전 글
2022.11.10 - [크롤링하기] - [파이썬 크롤링] 유튜브 댓글 crawl #1 google api client 라이브러리 위해 api-key 설정하기
목차
I. API key 설정하기
II. video_response 객체 살펴보기 (이번 글)
1. 구하고자 하는 것 -> 비디오 제목들 저장된 dataframe
저번에 얻은 video_ids 리스트로 이제 video 정보가 담긴 api를 출력해볼 예정이다.
이번 글의 최종 출력
2. video_request 객체 살펴보기 - items
video_request는 주어진 id에 해당하는 동영상의 정보를 담긴 object 객체를 돌려준다.
그리고 video_request.execute() 멤버함수를 실행하면 json 객체의 정보를 돌려준다.
video_request = youtube.videos().list(
part="snippet",
id=video_ids[0])
video_request.execute()
아래는 video_request.execute()의 한 예시다.
{'kind': 'youtube#videoListResponse',
'etag': 'hdGAoM6uX41o7k6tdkj_XkQnBfE',
'items': [{'kind': 'youtube#video',
'etag': 'oE3NG-OQSqDPmRJ9YwNMx618N4w',
'id': 'JyBd-qPKqpU',
'snippet': {'publishedAt': '2022-10-28T09:00:11Z',
'channelId': 'UCNYi_zGmR519r5gYdOKLTjQ',
'title': 'CHANEL Fashion Show vlog',
'description': '#JENNIE #제니 #CHANEL #FashionShow #Vlog',
'thumbnails': {'default': {'url': 'https://i.ytimg.com/vi/JyBd-qPKqpU/default.jpg',
'width': 120,
'height': 90}},
'channelTitle': 'Jennierubyjane Official',
'tags': ['YG Entertainment','YG', '와이지', 'K-pop', 'BLACKPINK', '블랙핑크','블핑', '제니', 'Jennie','BLINK', '블링크'],
'categoryId': '22',
'liveBroadcastContent': 'none',
'localized': {'title': 'CHANEL Fashion Show vlog', 'description': '#JENNIE #제니 #CHANEL #FashionShow #Vlog'},
'defaultAudioLanguage': 'ko'}}],
'pageInfo': {'totalResults': 1, 'resultsPerPage': 1}}
크게 kind, etag, items, pageInfo로 이루어져 있고
사용자한테 보이는 자잘한 정보는 items 안에 담겨 있다.
접근하는 방법은 dictionary와 같은데 예를 들어 채널 명을 프린트하고 싶으면
response['items'][0]['snippet'][title'] 이렇게 타고타고 들어가면 된다.
태그를 얻고 싶으면 response['items'][0]['snippet'][tags']로 얻으면 된다.
video_request = youtube.videos().list(
part="snippet",
id=video_ids[0])
response = video_request.execute()
print(response['items'][0]['snippet']['tags'])
3. video_request 객체 살펴보기 - 다수 비디오
다수의 비디오를 한꺼번에 크롤링 할 수 있다.
video_infos = []
start, end = 0, 5 # CHANGE ME
video_request = youtube.videos().list(
part="snippet",
id=','.join(video_ids[start:end]))
video_response = video_request.execute()
for item in video_response['items']:
title = item['snippet']['title']
video_infos.append([item['snippet']['title'], item['snippet']['publishedAt'], item['id']])
df = pd.DataFrame(video_infos, columns=['title', 'video_date', 'id'])
start, end에 크롤링 하고 싶은 동영상 index를 넣는다. (0 인덱스에 가까울수록 가장 최근 동영상이다)
youtube.videos().list()는 id가 ','로만 구분이 되어 있다면 여러 동영상을 한꺼번에 가져올 수 있다.
각 video_response마다 title을 저장해서 리스트에 추가하고,
리스트를 dataframe으로 만드는 코드다.
video_response의 마지막 pageInfo는 요청한 동영상 개수로 페이지 수가 달라진다.
video_infos = []
video_request = youtube.videos().list(
part="snippet",
id=','.join(video_ids))
video_response = video_request.execute()
for item in video_response['items']:
title = item['snippet']['title']
video_infos.append([item['snippet']['title'], item['snippet']['publishedAt'], item['id']])
df = pd.DataFrame(video_infos, columns=['title', 'video_date', 'id'])
위 코드는 전체 동영상의 제목을 가져오는 코드다.
채널의 동영상 개수가 많으면 정말 오래걸리므로
나눠서 크롤링 하는 것을 추천한다.
'파이썬 > 크롤링하기' 카테고리의 다른 글
[파이썬 크롤링] 유튜브 댓글 crawl #3 댓글 크롤링 (0) | 2022.11.10 |
---|---|
[파이썬 크롤링] 유튜브 댓글 crawl #1 google api client 라이브러리 위해 api-key 설정하기 (0) | 2022.11.10 |