파이썬/크롤링하기

[파이썬 크롤링] 유튜브 댓글 crawl #2 객체 알아보기 - 동영상 제목 저장하기

mcdn 2022. 11. 10. 14:38
반응형

Selenium 등 없이 API를 활용해서 데이터 크롤링하기 

 

이전 글 

2022.11.10 - [크롤링하기] - [파이썬 크롤링] 유튜브 댓글 crawl #1 google api client 라이브러리 위해 api-key 설정하기

 

[파이썬 크롤링] 유튜브 댓글 crawl #1 google api client 라이브러리 위해 api-key 설정하기

Selenium 과 같은 크롤링 도구 없이 API를 활용해서 유튜브 댓글을 크롤링해 보자. 코드는 Colab에서 진행했다. 목차 I. API key 설정하기 (이번 글) 1. 필요한 라이브러리 확인 및 설치 사용하는 라이브

so-es-immer.tistory.com

목차 

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'])

위 코드는 전체 동영상의 제목을 가져오는 코드다. 

채널의 동영상 개수가 많으면 정말 오래걸리므로 

나눠서 크롤링 하는 것을 추천한다. 

 

 

 

반응형