Emotions and Music 1
2022. 6. 28. 22:36ㆍProject/감정분석과 노래 추천
728x90
반응형
회의록
▶ 분야 : CV, NLP
▶ 프로젝트 목표 : 웹 서비스 개발 및 배포 (알파 버전 정도로..?ㅎㅎ)
▶ 주제(선정완료) : 유튜브 API 이미지 및 텍스트 데이터를 활용한 감정분석(비속어 필터링 등등)
- 선정 이유 : 제가 대충 구상한 스토리는 요즘 악플들로 상처받는 사람도 많고 해서 그걸 최대한 줄여주기 위해서 구상한다 이런 느낌이였거든요
- 화재경보
- 유튜브 API를 이용한 감정분석
- 몽타주
- 위성영상…ㅎㅎㅎ
- 기후모델링
- 온실가스배출 데이터
▶ 역할 분담 : 데이터 수집 과 웹 배포
유튜브 댓글 크롤링과 영상을 프레임 단위로 쪼개는 코드
유튜버 이름을 입력받고 영상 목록에서 영상 아이디 긁어오기
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import pandas as pd
import pymysql
from googleapiclient.discovery import build
import warnings # 경고창 무시
warnings.filterwarnings('ignore')
# 유튜브 API 사용
DEVELOPER_KEY = "Key"
YOUTUBE_API_SERVICE_NAME="youtube"
YOUTUBE_API_VERSION="v3"
youtube = build(YOUTUBE_API_SERVICE_NAME,YOUTUBE_API_VERSION,developerKey=DEVELOPER_KEY)
# mysql 연동
conn = pymysql.connect(user = '유저',
passwd = '비번',
port = '포트',
db = 'DB',
charset = 'utf8')
cur = conn.cursor()
# 유튜브 비디오 크롤링
url = "https://youtube.com/"
keyword = input("검색할 채널을 입력하세요 : ")
# 크롤링
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.implicitly_wait(3)
driver.maximize_window()
driver.get(url)
driver.implicitly_wait(5)
# 채널 검색하기
search = driver.find_element_by_name("search_query")
driver.implicitly_wait(5)
search.send_keys(keyword)
search.send_keys(Keys.ENTER)
# 정렬기준 채널으로 바꾸기
driver.find_element_by_xpath('//*[@id="container"]/ytd-toggle-button-renderer/a').click()
driver.implicitly_wait(2)
division = driver.find_element_by_xpath('//*[@id="collapse-content"]/ytd-search-filter-group-renderer[2]')
click_list_1 = division.find_elements_by_id("endpoint")
click_list_1[1].click()
driver.implicitly_wait(3)
# 가장 첫번째로 보이는 채널 클릭
driver.find_element_by_xpath('//*[@id="avatar-section"]/a').click()
driver.implicitly_wait(3)
# 동영상란으로 이동
driver.find_element_by_xpath('//*[@id="tabsContent"]/tp-yt-paper-tab[2]/div').click()
present_url = driver.current_url
driver.get(present_url)
# 채널 아이디 받아오기
channel_id = present_url.split('/')[4]
driver.implicitly_wait(3)
# 동영상 아이디 받아오기
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
temp = [i['href'].split("=")[1] for i in soup.select('#meta > h3 > a[href]')]
cnt = 0
# 동영상 아이디 하나씩 불러오기
for t in temp:
# Video 테이블에 video_id, channel_name, channel_id 적재
sc = (t, keyword, channel_id)
cur.execute('INSERT IGNORE INTO video (video_id, channel_name, channel_id) VALUES (%s ,%s, %s)', sc)
conn.commit()
comments = []
# 유튜브 API 사용해서 영상 댓글 불러오기
results = youtube.commentThreads().list(
videoId = t,
order='time',
part = 'snippet',
textFormat='plainText',
maxResults = 100
).execute()
while results:
for item in results['items']:
comment = item['snippet']['topLevelComment']['snippet']['textDisplay']
comments.append(comment)
if 'nextPageToken' in results:
pageToken = results['nextPageToken']
results = youtube.commentThreads().list(
videoId = t,
order='time',
part = 'snippet',
textFormat='plainText',
pageToken = pageToken,
maxResults = 100
).execute()
else:
break
# 댓글 하니씩 불러와서 Reviews 테이블에 video_id, reviews 적재
for comment in comments:
sc = (t, comment)
cur.execute('INSERT IGNORE INTO Reviews (video_id, reviews) VALUES (%s ,%s)', sc)
conn.commit()
# 확인
cnt += 1
print(f"총 {len(temp)} 중에 {cnt}개 완료!")
conn.close()
영상 아이디를 이용해서 영상 다운
from pytube import YouTube
import pandas as pd
import pymysql
conn = pymysql.connect(user = '유저',
passwd = '비번',
port = '포트',
db = 'DB',
charset = 'utf8')
cur = conn.cursor()
cur.execute('''
SELECT video_id FROM Video
''')
result = list(cur.fetchall())
for i in range(len(result)):
YouTube(f'https://www.youtube.com/watch?v={result[i][0]}').streams.get_highest_resolution().download(f'./video/{result[i][0]}')
print(f'{i+1}/{len(result)}번째 완료')
비디오를 프레임 단위로 이미지 변환
import cv2
import os
from unicodedata import normalize
cnt = 1
dir_list = os.listdir('./video')
for dir in dir_list:
file = normalize("NFC", os.listdir(f'./video/{dir}')[0])
filepath = f'./video/{dir}/{file}'
video = cv2.VideoCapture(filepath) #'' 사이에 사용할 비디오 파일의 경로 및 이름을 넣어주도록 함
if not video.isOpened():
print("Could not Open :", filepath)
exit(0)
fps = round(video.get(cv2.CAP_PROP_FPS))
count = 0
while(video.isOpened()):
ret, image = video.read()
if not ret:
break
if(int(video.get(1)) % 5 == 0):
cv2.imwrite(f'./video/{dir}' + f"/{dir}frame%d.jpg" % count, image, params=[cv2.IMWRITE_JPEG_QUALITY,50])
print('Saved frame number :', str(int(video.get(1))))
count += 1
video.release()
print(f"{cnt}/{len(dir_list)}")
cnt += 1
참고 자료
728x90
반응형
'Project > 감정분석과 노래 추천' 카테고리의 다른 글
Emotions and Music 6 (0) | 2022.07.03 |
---|---|
Emotions and Music 5 (0) | 2022.07.03 |
Emotions and Music 4 (0) | 2022.07.03 |
Emotions and Music 3 (0) | 2022.06.28 |
Emotions and Music 2 (0) | 2022.06.28 |