AI/Projects

Project Joing: 데이터 수집 - RecSystem

문괜 2024. 11. 12. 20:05
반응형

프로젝트의 추천 시스템은 두종류의 추천을 진행한다.

  1. 기획안 to 크리에이터
  2. 크리에이터 to 기획안

이 두 추천에 있어서 크리에이터에 대한 특징을 잡을 수 있는 정보가 지금 현재 필요하다. 그래서 아래의 로직 바탕으로 크리에이터(Youtube)에 대한 데이터를 수집하려고 한다.

 

  1. Youtube Handles 확보
  2. Handles를 Channel ID로 전환
  3. Channel ID로 Youtube Channel 정보 조회
  4. 조회된 정보를 RecSystem 요구 조건에 맞춰 전처리

Youtube Handles 확보

먼저 Youtube Handles의 경우 대한민국 유튜버 분야별 구독자수 탑 200위까지를 기준으로 확보했고 총 확도한 Handle의 수는 7729개이다. 

 

Handles를 Channel ID로 전환

안타깝게도 Handles로 직접 조회할 수 없었다. 그래서 Channel ID를 전환해야하는데 여기서 필요한 Youtube Data API 요청은 search 요청이다.

직접 Channel ID를 가져오기 위해서는 어쩔수없이 Handle을 활용해 search를 요청하고 그 다음 Channel ID를 찾으면된다.

 

!! 주의: Youtube Data API 하루에 10,000 unit의 요청을 보낼 수 있다. 허용되는 요청이 만번이 아니라 10,000 unit이다. 즉, 요청별로 unit 값이 다르다. 예르들어 search 요청의 경우 100이고 get의경우 1이다. 이점을 참고해서 구현해야한다.

 

그래서 아래와 같은 함수를 만들어서 요청과 처리를 진행하였다.

import requests
def sending_request(handle, api):
  request_url = f"https://www.googleapis.com/youtube/v3/search?part=snippet&q={handle}&type=channel&key={api}"
  response = requests.get(request_url)
  return response
  
def response_parsing(response_json):
  try:
    channel_id = response_json['items'][0]['id']['channelId']
  except:
    channel_id = None
  return channel_id

updated_count = 0
for i in range(len(combined_df)):
  row = combined_df.iloc[i]
  youtube_handle = row['youtube_handle']
  category = row['category']
  channel_id = row['channel_id']
  if (channel_id is np.nan and i not in skipping_rows):
    response = sending_request(youtube_handle, youtube_api_key)
    new_channel_id = response_parsing(response.json())
    combined_df.at[i, 'channel_id'] = new_channel_id
    if (new_channel_id is not None):
      updated_count+=1

 

Channel ID로 Youtube Channel 정보 조회 & 조회된 정보를 RecSystem 요구 조건에 맞춰 전처리

그 이후에 받은 채널 ID로 다시 get 요청을 통해 channel에 대한 정보를 끓어온다. 그리고 그중에서 RecSystem에서 필요한 정보를 가공하여 Google Sheets에 저장한다.

 

그리고 이 과정을 N8N으로 실행하였다.

이유는 간단하다. 7729개의 정보가 있었고 하루에 search 요청은 100번 밖에 보내지 못하고 추가적으로 api키를 확보한다해도 최대가 1500번이었다. 그리고 Youtube Data API의 search 요청은 handle이라는 고유값을 사용하더라도 정확성이 떨어지곤했다. 그래서 1000개 단위로 나누어 먼저 Data를 점검하고 정보를 따로 수집하는 과정이 필요하다는 생각이 들었다. 그래서 n8n을 이용해 반복하기로 결정했다. 

 

그래서 아래와 같이 노드를 구성하였다. 

 

그래서 결과적으로 조회가 애초에 실패한 180여개 정도을 재외한 총 7600여개의 Youtube Channel 정보를 조회해올수 있었다.

 

구체적인 노드의 구성은 공개하기가 어렵다 이유는 너무나도 많은 api key가 있기 때문이다. 하지만 n8n의 장점은 구체적인 정보 없이도 스스로 구성할 수 있다는 점이다.

 

추가적으로 이글에는 Youtube Data API 설정과 같은 구체적인 내용에 대해서는 언급하지 않았다. 왜냐하면 그정도는 스스로 해야한다 생각하기 때문이다.(인성ㅎ)

 

이로써 RecSystem에 사용되는 Data 수집을 완료 했다. 다음으로는 Proposal 생성으로 넘어갈 예정이다.

반응형