336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

유튜브 크롤링 글에 제목, 조회수, 댓글, 좋아요를 크롤링하는 방법에 대해서 글을 써야 하는데, 요즘 자소서를 쓰고 알고리즘 공부도 하고 이것저것 하다보니 글을 쓸 시간이 많지 않았다. 유튜브 관리도 제대로 안 되고 있어서 돈만 날리고 있다 ㅠㅠ

 

 

 

유튜브 크롤링(3) 올인원 - 채널 제목, 댓글, 조회수, 자막까지

지금 크롤링을 하고 있어서 시간이 나는 김에 글을 작성합니다. 크롤링도 크롤링이지만 이 데이터를 어떻게 정제할지가 더 고민이네요. 지난 번 글들을 활용해서 작성하오니 본인의 목적에 맞

0goodmorning.tistory.com

다른 분들도 친절하게 크롤링 방법에 대해서 언급을 하고 있어서 일단 관련 글은 미루다가 작성(9.29 수정), 구글 검색을 해도 잘 나오지 않는 유튜브 자막 다운 방법에 대해서 쓰겠습니다. 검색을 했을 때 pytube3로도 다운이 가능하다고 되어있으나 2020년 글들이고 오류가 나서 사용을 하지 못 했습니다. 사용 방법을 아시면 알려주세요 :)

 

pip install youtube-transcript-api

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
from youtube_transcript_api import YouTubeTranscriptApi
# 오징어 게임 url https://www.youtube.com/watch?v=ysz5Sl3msyk
 
srt = YouTubeTranscriptApi.get_transcript("ysz5Sl3msyk", languages=['ko'])
 
with open("subtitles.txt""w", encoding='utf-8'as f:  
    for i in srt:
        # writing each element of srt on a new line
        f.write("{}\n".format(i))


# {'text': '저는...', 'start': 0.0, 'duration': 0.584} 이런 식으로 저장됨
cs

이걸로 srt 느낌의 자막을 다운로드 받을 수 있습니다. 쉽죠? 자막 다운이 급하신 분들을 위해서 먼저 설명을 드렸고, 딱 자막 부분만 필요하신 분들은 더 따라와 주세요. 오타나 인식이 잘못된 부분은 구글의 SST를 탓하세요! 

 

 

※ 야매 주의 ※

(야매가 싫으시면 뒤로가기 버튼을)

 

 

[사용]

pykospacing(맞춤법), kkma.sentence(kss도 가능!)

 

[시도]

kss(문장분리) / mecab, kkma, okt pos

 

[순서]

자막 다운 -> 띄어쓰기 제거, kkma.sentence -> 야매 문장 분리 -> 띄어쓰기 제거, spacing

-kss 시도를 해봤지만, 문장 부호가 없으면 시간이 많이 걸리고 모든 문장으로 안 나뉘어지는 단점 // 다시 해보니 0.3초 뭐지...

-spacing을 먼저 해봤으나 맞춤법 전문이라 제대로 안 나뉘어짐 ('~요' 인식이 잘 안 됨)

-꼬꼬마로 문장을 어느정도 나누고, 문장 부호를 추가하니 그나마 나아짐

 

 

 

1
2
3
4
5
6
7
from youtube_transcript_api import YouTubeTranscriptApi
# 오징어 게임 url https://www.youtube.com/watch?v=ysz5Sl3msyk
 
srt = YouTubeTranscriptApi.get_transcript("ysz5Sl3msyk", languages=['ko'])
 
for i in srt :
    print(i)
cs

어떤 식으로 자막이 이루어졌는지 확인을 해보기 전에, 영상이 자막을 지원하는 영상인지 아닌지부터 확인을 합니다. 자동생성 자막을 지원하지 않을 경우 에러가 납니다.

 

 

 

 

결과를 확인해보면 리스트 형식 안에 딕셔너리 형식이 있습니다. 우리는 'text'만 필요하기 때문에 딕셔너리에서 'text' 부분만 가져오면 됩니다. 

 

 

 

 

1
2
3
4
5
6
text = ''
 
for i in range(len(srt)):
    text += srt[i]['text'+ ' ' # text 부분만 가져옴
    
text_ = text.replace(' ','')
cs

간단하게 가져왔지만 문제가 하나 있습니다. 띄어쓰기가 제대로 되어 있지 않아서 잘 알아볼 수가 없습니다. 한국어 전처리 패키지인 PyKoSpacing을 바로 사용하려고 했으나, 문장 부호가 없어서 잘 되지 않습니다. 영어의 경우 친절하게 '.'을 찍어주는데 한국은 차별하는게 아닌가... 

 

kss 한국어 문장 분리기를 사용해보았으나 특정 어휘(EX : 처음)에서 이상하게 분리를 하고, 모든 문장을 나눠주지는 않았다. 글 쓰기 전에 kss를 사용하는데 상당한 시간이 걸려서 사용하지 않았는데, 글 쓰는 중에 다시 테스트를 하니 깔끔하게 잘 나뉘어서 당황스럽다. 그래서 Kkma.sentence()를 사용했던건데 어떤 것을 사용하든 상관은 없어보인다. 

 

그 후 종결어미인지 확인하기 위해서 mecab, kkma, okt를 사용해서 확인을 하려고 했으나 case를 나눌 것들이 너무 많아서 야매를 사용했다. kkma는 품사 분류표가 너무 복잡하고 pos로 나눌 때 명사가 포함되면 종결어미인지 분간이 잘 안 갔다. okt의 경우 품사 분류표가 간단하지만 (verb, noun 등..) 얘도 생각보다 case가 많았다.

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from konlpy.tag import Kkma
import pandas as pd
 
#문장 분리 / kss 사용해도 무방
kkma = Kkma()
text_sentences = kkma.sentences(text_)
 
#종결 단어
lst = ['죠','다','요','시오''습니까','십니까','됩니까','옵니까','뭡니까',]
 
df = pd.read_csv('not_verb.csv',encoding='utf-8')
not_verb = df.stop.to_list()
 
#단어 단위로 끊기
text_all = ' '.join(text_sentences).split(' ')
 
for n in range(len(text_all)) :
    i = text_all[n]
    if len(i) == 1 : #한글자일 경우 추가로 작업x
        continue
    
    else :
        for j in lst : #종결 단어
            #질문형
            if j in lst[4:]:
                i += '?'
            
            #명령형                
            elif j == '시오' :
                i += '!'
            
            #마침표    
            else :
                if i in not_verb : #특정 단어 제외
                    continue
                else :        
                    if j == i[len(i)-1] : #종결
                            text_all[n] += '.'
                            print(text_all[n], end = '/ ')
cs

여기서부터 야매 방법이다.

 

종결형 단어를 뽑아서 lst로 만들었다. 구어체는 제외하고 뉴스기사를 여러개 찾아보면서 거의 웬만한 종결형 단어를 넣었다. 문제가 있으면 추가로 집어넣으면 된다. 그리고 문장을 모두 단어로 쪼개서 실행을 했다. 

 

처음에는 '죠, 다, 요'로만 구성하려고 했으나 질문, 감탄형 문장부호도 필요할 것 같아서 추가했다. 마지막 단어에 '다, 요'가 쓰인 경우, 무조건 종결형 어미가 아니라서 특정 단어를 제외했다. 바다, 날마다, 우간다, 노가다 / 필요, 수요, 중요, 노동요  ... 같은 단어를 찾아서 csv파일에 추가했다. 다로 끝나는 단어는 10만개가 넘어서 추후에 더 추가하면 될 듯 하다.

 

 

 

결과를 보면 나쁘지 않다. 걸러지는 걸 보여주면 효과가 더 좋아보일텐데 일단 변경되는 것만 보여드립니다. 그리고 나서 한국 전처리 기본 패키지인 pykospacing을 사용하게 되면 나름 괜찮게 결과가 나온다.

 

 

 

1
2
3
4
5
from pykospacing import Spacing
 
spacing = Spacing()
text_all_in_one = ' '.join(text_all)
print(spacing(text_all_in_one.replace(' ','')))
cs

단점은 마침표 다음에 띄어쓰기가 안 되어 있는 경우도 있어서. split으로 나누고 다시 붙이면 된다.

 

+ Recent posts