본문 바로가기
IT KNOWLEDGE

[Youtube API] YouTube Data API로 동영상 ID 추출하기

by BTC_Crong 2023. 8. 17.

베하~!! 안녕하세요 1-Tier 팀 입니다!! 

이번에는YouTube Data  API로 사용자에게 검색어를 받아 해당 유튜브 동영상을 검색하고

동영상의 고유 ID를 추출해 보도록 하겠습니다.

 

YouTube의 동영상들은 각각의 고유 ID가 있습니다.

해당 ID를 활용하여 특정 동영상을 실행, 추출 등 핸들링을 할 수 있는데 먼저 YouTube Data API v3를 사용하여 유튜브 동영상의 고유 ID 값을 추출해 보고 DB에 저장해 봅시다.

import requests
import json
import pymysql
import youtube_config


login = youtube_config.conn
key = login['key']
search_url = 'https://www.googleapis.com/youtube/v3/search?q=' #Search (id-videoId, order-rationg viewCount)
snippet_url = 'https://www.googleapis.com/youtube/v3/videos?part=snippet' #Snippet (snippet-title description)
conn = pymysql.connect( #connet로 연결할 DB의 정보 입력
    host=login['host'],
    port=login['port'],
    user=login['user'],
    password=login['password'],
    database=login['database'],
    charset=login['charset']
)

먼저, 필요한 라이브러리를 import 해주고 보안상 DB Connection 정보는 별도의 파일로 관리 하도록 하겠습니다.

그리고 API Key와 API 호출 URL도 선언 합니다.

API Key 발급 방법과 URL 정보는 타 블로그나 공식사이트를 참고 해주시길 바랍니다. 

searchText = input("검색어를 입력하세요 :") #사용자에게 검색어 입력 받기


curl = search_url + searchText + '&maxResults=20&key=' + key
# API 호출 URL + 검색어 + 최대 결과값(50이 최대임) + API Key값
response = requests.get(curl)
jsonObject = json.loads(response.text) #json형식으로 load
listData = jsonObject.get('items') #items 항목을 listData에 저장

검색어를 입력 받아서 해당 결과를 JSON 형태로 저장하고, 매개변수 items는 요청 기준과 일치하는 동영상의 목록입니다.

for list in listData: #검색한 결과 값에서 반복
    curs = conn.cursor() # DB조작을 위한 cursor 생성
    v_id = list.get('id').get('videoId') #id에서 videoId 값 추출
    etag = list.get('etag') #etag 값 추출


    query_str = "SELECT COUNT(v_id) FROM TEST.video_list WHERE v_id = '" + str(v_id) + "';"
    # DB에 저장되어 있는 값들의 video_id와 검색한 값의 video_id를 비교하여 중복 유무를 COUNT로 판별 
    curs.execute(query_str) #쿼리문 실행
    data = curs.fetchone() #한 번씩 순차적으로
    data_int = int(data[0]) #결과값을 int형으로 저장

# DB부하를 최소화 하기 위해 INSERT문 이전에 필터링 진행
    if str(v_id) != 'None': # v_id 값이 None이 아니면 실행
        if data_int == 0: # DB에 중복으로 값이 없다면 실행 ( = count가 0 일 때 )
            sql = "INSERT INTO TEST.video_list (v_id, etag, search_txt) VALUES (%s, %s, %s);"
            val = (v_id, etag, searchText)
            curs.execute(sql, val) # sql문 실핼하고 (v_id, etag, 검색어)를 Value에 대입
            conn.commit() # 결과 저장
conn.close()

스크립트를 실행하면

사용자에게 검색어를 입력받고, 입력 받은 검색어에 대한 유튜브 검색 결과 50개를 불러옵니다.

이후, 동영상들의 ID값과 etag 값을 추출하여 DB에 저장합니다.

참고

DB Columms Info

auto_Increment로 row에 no값을 자동 순차적으로 입력하게 함

etag의 값을 크게 줬는데 50정도만 줘도 충분하다

DB Connection Info

DB연결 정보는 다음과 같은 형식으로 작성했습니다.

conn = {
    "host":"***.***.***.***",
    "port":int("3306"),
    "user":"DB_ID",
    "password":"DB_PW",
    "database":"TEST",
    "charset":"utf8mb4", #특수문자 인식을 위해 utf8mb4로 함
    "key":"**************" #API Key
    }

ListData에 대한 검색 결과 형식은 다음과 같습니다.

{
  "kind": "youtube#searchResult",
  "etag": etag,
  "id": {
    "kind": string,
    "videoId": string,
    "channelId": string,
    "playlistId": string
  },
  "snippet": {
    "publishedAt": datetime,
    "channelId": string,
    "title": string,
    "description": string,
    "thumbnails": {
      (key): {
        "url": string,
        "width": unsigned integer,
        "height": unsigned integer
      }
    },
    "channelTitle": string,
    "liveBroadcastContent": string
  }
}

다음에는 동영상의 제목과 설명을 추가적으로 추출하고 최대 호출값 이상의 값을 얻을 수 있도록 설정하는 방법을 포스팅하도록 하겠습니다.

 

베빠~~!

'IT KNOWLEDGE' 카테고리의 다른 글

람다식(Lambda Expressions)  (0) 2023.08.18
RBAC과 ABAC  (0) 2023.08.18
정렬 알고리즘 개념  (0) 2023.08.14
SSO, OAuth, OIDC 그리고 SAML  (0) 2023.08.04
정적 팩토리 메서드(Static Factory Method)  (0) 2023.08.04

댓글