2022. 6. 28. 22:36ㆍProject/감정분석과 노래 추천
회의록
▶ 분야 : 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
참고 자료
파이썬 셀레니움으로 인스타그램 댓글 크롤링 하기
파이썬 프로그래밍으로 업무 자동화 할 줄 아는 스마트한 퍼포먼스 마케터 되기 세번째 프로젝트! 이번에는 파이썬 셀레니움으로 인스타그램 댓글을 자동 추출하는, 크롤링, 웹 스크래핑 코드
summaryday.tistory.com
[파이썬] 유튜브 댓글 크롤링 (BTS MV)
사람들이 가장 자주 사용하는 사이트인 유튜브에는 많은 양의 데이터가 매일 쌓이고 있습니다. 오늘은 사람들의 반응을 알아볼 수 있는 동영상 댓글 데이터를 수집(크롤링)해보고 이를 가공, 전
codingspooning.tistory.com
유튜브 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
[OpenCV] 파이썬으로 동영상 프레임 초단위 저장/캡처하기 (Save Video Frame per Second by Python)
오늘은 동영상(mp4) 파일을 OpenCV를 사용하여 초단위로 저장하는 방법을 알아보도록 하겠습니다 기본적으로는 프레임 단위로 저장이 가능하나 본 예제에서는 다루고자 하는 동영상이 1초에 몇 프
thinking-developer.tistory.com
[python] 파이썬 동영상 캡처기능 구현 (opencv)
opencv라이브러리와, Pycharm을 활용해 진행하도록 하겠습니다. 파이썬 설치가 되어있지 않으시다면, 아래 URL을 확인하시고 파이썬 설치 먼저 진행 부탁드리겠습니다. https://vmpo.tistory.com/entry/python-%
vmpo.tistory.com
'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 |