Emotions and Music 1

2022. 6. 28. 22:36Project/감정분석과 노래 추천

728x90
반응형

회의록

▶ 분야 : CV, NLP
 프로젝트 목표 : 웹 서비스 개발 및 배포 (알파 버전 정도로..?ㅎㅎ)
 주제(선정완료) : 유튜브 API 이미지 및 텍스트 데이터를 활용한 감정분석(비속어 필터링 등등)

  • 선정 이유 : 제가 대충 구상한 스토리는 요즘 악플들로 상처받는 사람도 많고 해서 그걸 최대한 줄여주기 위해서 구상한다 이런 느낌이였거든요
    1. 화재경보
    2. 유튜브 API를 이용한 감정분석
    3. 몽타주
    4. 위성영상…ㅎㅎㅎ
    5. 기후모델링
    6. 온실가스배출 데이터

▶ 역할 분담 : 데이터 수집 과 웹 배포

유튜브 댓글 크롤링과 영상을 프레임 단위로 쪼개는 코드

유튜버 이름을 입력받고 영상 목록에서 영상 아이디 긁어오기

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

참고 자료

인스타 댓글 크롤링

 

파이썬 셀레니움으로 인스타그램 댓글 크롤링 하기

파이썬 프로그래밍으로 업무 자동화 할 줄 아는 스마트한 퍼포먼스 마케터 되기 세번째 프로젝트! 이번에는 파이썬 셀레니움으로 인스타그램 댓글을 자동 추출하는, 크롤링, 웹 스크래핑 코드

summaryday.tistory.com

유튜브 댓글 크롤링

 

[파이썬] 유튜브 댓글 크롤링 (BTS MV)

사람들이 가장 자주 사용하는 사이트인 유튜브에는 많은 양의 데이터가 매일 쌓이고 있습니다. 오늘은 사람들의 반응을 알아볼 수 있는 동영상 댓글 데이터를 수집(크롤링)해보고 이를 가공, 전

codingspooning.tistory.com

유튜브 댓글 크롤링 2

 

유튜브 API를 사용한 유튜브 댓글 크롤링

유튜브 댓글을 수집하는 방법은 크게 두 가지입니다. 첫번째는 Google에서 제공하는 유튜브 API를 사용하는 것이고, 두번째는 직접 HTML 문서에서 크롤링하는 방법이 있습니다. 이번에는 유튜브 API

velog.io

유튜브 영상

 

[파이썬 유튜브 다운로드] 파이썬으로 유튜브 영상 다운로드하기

from pytube import YouTube YouTube('https://www.youtube.com/watch?v=qQgcIA8AgLk').streams.get_highest_resolution().download() vscode에서 작업하였고 파이썬 버전은 3.8이다. pip install pytube 을 통해..

animoto1.tistory.com

영상을 이미지로 변환 1

 

[OpenCV] 파이썬으로 동영상 프레임 초단위 저장/캡처하기 (Save Video Frame per Second by Python)

오늘은 동영상(mp4) 파일을 OpenCV를 사용하여 초단위로 저장하는 방법을 알아보도록 하겠습니다 기본적으로는 프레임 단위로 저장이 가능하나 본 예제에서는 다루고자 하는 동영상이 1초에 몇 프

thinking-developer.tistory.com

영상을 이미지로 변환 2

 

[python] 파이썬 동영상 캡처기능 구현 (opencv)

opencv라이브러리와, Pycharm을 활용해 진행하도록 하겠습니다. 파이썬 설치가 되어있지 않으시다면, 아래 URL을 확인하시고 파이썬 설치 먼저 진행 부탁드리겠습니다. https://vmpo.tistory.com/entry/python-%

vmpo.tistory.com

 

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