베하~!! 안녕하세요 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 |
댓글