본문 바로가기

Python/YouTube Data API v3

[Youtube API] 동영상의 조회수와 좋아요 수 추출하기

이번 포스팅에서는 동영상의 조회수와 좋아요 갯수를 추가로 추출하는 방법에 대해 적어보고자 합니다.

 

이전에 사용하던 동영상 데이터 Insert 스크립트에 추가하여 사용할 예정입니다.

조회수와 좋아요 수를 알기 위해서는 statistics 리소스를 추가로 불러와야 하는데 또 새로운 API URL을 추가해줘야 합니다.

https://www.googleapis.com/youtube/v3/videos?id=

 그리고 기존 코드에 추가하는 방식이라 반복문 순서가 이전보다 조금 변경되었는데요, 완성본 코드를 보면서 자세히 보겠습니다.

SearchText = input("검색어를 입력하세요 :")

i = 0

while curs.rowcount != None: #토큰 값으로 동영상 목록 호출 (더 이상 호출되지 않을 때 까지)
    curl =""
    if i == 0:
        curl = search_url + SearchText + '&maxResults=50&key=' + key
    elif i > 0:
        curl = search_url + SearchText + '&pageToken='+ NextPageData + '&maxResults=50&key=' + key


    response = requests.get(curl)
    jsonObject = json.loads(response.text)
    listData = jsonObject.get('items')
    NextPageData = jsonObject.get('nextPageToken')
    PrvPageData = jsonObject.get('prevPageToken')
    i = i + 1


    for list in listData: #호출한 비디오 리스트
        v_id = list.get('id').get('videoId')
        etag = list.get('etag')

        # RDS에 중복된 동영상이 있는지 체크
        query_str = "SELECT COUNT(v_id) FROM youtube.video_list WHERE v_id = '" + str(v_id) + "';"
        curs.execute(query_str)
        data = curs.fetchone()
        data_int = int(data[0])

        # RDS에 중복된 동영상이 아니라면 실행
        if data_int == 0 and str(v_id) != 'None':
            curl2 = snippet_url + '&id=' + v_id + '' + '&key=' + key
            response2 = requests.get(curl2)
            jsonObject2 = json.loads(response2.text)
            listData2 = jsonObject2.get('items')

            # 호출된 동영상의 비디오 아이디로 조회수와 좋아요 수 추출
            statics = statistics_url + v_id + '&key=' + key + '&part=statistics'
            statics_response = requests.get(statics)
            statics_Object = json.loads(statics_response.text)
            statics_data = statics_Object.get('items')
            for statistics in statics_data:
                viewCount = statistics.get('statistics').get('viewCount')
                likeCount = statistics.get('statistics').get('likeCount')
                commentCount = statistics.get('statistics').get('commentCount')

            for list2 in listData2: # 호출된 동영상의 제목과 설명, 업로드 시간 추출
                print(listData2)
                v_id2 = list2.get('id')
                v_title = list2.get('snippet').get('title')
                v_desc = list2.get('snippet').get('description')
                v_ps = list2.get('snippet').get('publishedAt')
                # 호출된 동영상의 정보들을 RDS에 INSERT
                sql = "INSERT INTO youtube.video_list (v_id, viewcount, likecount, v_upload, search_txt, title, description) VALUES (%s, %s, %s, %s, %s, %s, %s);"
                val = (v_id, viewCount, likeCount, v_ps, SearchText, v_title, v_desc)
                curs.execute(sql, val)


        conn.commit()
    # conn.close() 계속 DB에 반영 해야하기 때문에 close 하면 안됨

동영상의 조회수와 좋아요 수를 먼저 가져오는 이유는 크게 없고 JSON 형식으로 봤을 때, 동영상의 제목과 설명, 업로드 시간과 다른 레벨의 하위 리소스라 따로 반복문을 돌려주기만 하면 결과 값은 동일 합니다.

 

조회수, 좋아요 => items>statistics

제목, 설명, 업로드 시간 등 => items>snippet

 

이렇게 동영상의 다양한 정보들을 한꺼번에 추출하고 삽입하면 장단점이 있습니다.

장점

- API 호출 시 모든 리소스를 불러오기 때문에 기왕 불러온거 한 번에 많은 정보를 활용할 수 있다.

 

단점

- 코드가 복잡해지고 수정이 어려워 진다.

 

단점 같은 경우에는 코드 튜닝으로 충분히 보완 가능하기 때문에 추후에 작업을 진행할 예정입니다.

 

다음 포스팅에는 계속해서 변화하는 정보 ( 조회수, 좋아요 )를 업데이트 해보도록 하겠습니다.