파이썬/크롤링

[python-파이썬] 10 유튜브에서 동영상 정보 크롤링 (crawling) - 1탄

모두의 실험실 2022. 4. 21. 21:15
728x90

 

 

안녕하세요. 모두의 파이썬입니다. 유튜브에서 동영상 정보 크롤링 하겠습니다. 유튜브 플랫폼 안에서도 정말 많은 페이지가 있습니다. 그중에서 동영상 페이지에서 각 동영상 정보를 크롤링 하겠습니다.

전체 글을 요약하면, 특정 채널의 유튜브 동영상 페이지 주소를 알아내고, 해당 주소(url)에서, 업로드된 동영상 정보를 크를 롤링 하겠습니다

특정 채널을 선정해 보겠습니다. 모두의 파이썬은 1위를 추종합니다. 국내 유튜브 채널 중에서 구독자 수 1위는 'BLACKPINMK'입니다. 항상 '모두의 파이썬'은 구글에서 검색하고 있습니다. 검색어는 '유튜버 순위'입니다. 그러면 여러 가지가 나오지만, 그중에서 자주 들어가는 사이트는 녹스 인플루언서입니다. 주소는 https://kr.noxinfluencer.com/youtube-channel-rank/top-100-kr-all-youtuber-sorted-by-subs-weekly입니다. 블랙핑크가 현재 기준 7370만 명으로 1위이네요.

 

ⓒ한국TOP100 유튜브 채널 리스트, 출처 noxinfluencer

 

블랙핑크 유튜브 채널로 이동합니다. 홈/ 동영상/ 재생목록/ 커뮤니티 등등 베너 중에서 동영상을 클릭합니다. 그러면 주소창에서 주소가 바뀌는 것을 확인할 수 있습니다. 주소는 https://www.youtube.com/c/BLACKPINKOFFICIAL/videos 입니다.

ⓒ블랙핑크 유튜브 채널, 출처 Youtube

 

주소의 html 값을 받아서, 'tag' 정보를 확인하여, 크롤링 했으나, 값이 읽히질 않습니다. 'tag'정보를 find/find_all에 사용하였으나, 값이 나오지가 않습니다.

ⓒ블랙핑크 유튜브 채널, 출처 Youtube

 

'기본으로 돌아가라'라는 말이 있습니다. 여러분 가장 기본은 무엇이라고 생각하십니까? 여러분은 지금 웹 크롤링(web crawling)을 하고 있습니다. 웹 크롤링의 가장 기본은 web 페이지 정보입니다. html text 정보입니다. html text에서 규칙을 찾아보겠습니다.

 

 

In [22]:

## 유튜브에서 동영상 정보 크롤링 (crawling) 
## 유튜브에서 동영상 정보 크롤링 (crawling) 
import requests
from bs4 import BeautifulSoup 

def get_html(url):
    ## 브라우저 호환을 위해서 설정
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '+ \
        '(KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
                } 
    ##해당 url에 htlm(정보) 요청에사용 / url은 사용자가 원하는 url
    r = requests.get(url, headers=headers) 
    ## 해당 url의 html을 사용자가 활용하기 쉽게 변환
    html = BeautifulSoup(r.content, 'html.parser')
    ## 결과값 전달
    return html

def get_youtube_video_crawling():
    url = 'https://www.youtube.com/c/BLACKPINKOFFICIAL/videos'
    html = get_html(url)
    print(str(html)[:1000])

get_youtube_video_crawling()
 
<!DOCTYPE html>
<html lang="ko-KR" style="font-size: 10px;font-family: Roboto, Arial, sans-serif;" system-icons="" typography="" typography-spacing=""><head><script nonce="DmhUFCyjNnSpj/mUk8OFdw">var ytcfg={d:function(){return window.yt&&yt.config_||ytcfg.data_||(ytcfg.data_={})},get:function(k,o){return k in ytcfg.d()?ytcfg.d()[k]:o},set:function(){var a=arguments;if(a.length>1)ytcfg.d()[a[0]]=a[1];else for(var k in a[0])ytcfg.d()[k]=a[0][k]}};
window.ytcfg.set('EMERGENCY_BASE_URL', '\/error_204?t\x3djserror\x26level\x3dERROR\x26client.name\x3d1\x26client.version\x3d2.20220425.01.00');</script><script nonce="DmhUFCyjNnSpj/mUk8OFdw">(function(){window.yterr=window.yterr||true;window.unhandledErrorMessages={};window.unhandledErrorCount=0;
window.onerror=function(msg,url,line,columnNumber,error){var err;if(error)err=error;else{err=new Error;err.stack="";err.message=msg;err.fileName=url;err.lineNumber=line;if(!isNaN(columnNumber))err["columnNumber"]=columnNumber}var message=String(err.mes

 

모두의 파이썬은 블로그 작성 특성상 text 1000개를 제한하여 보이게 했습니다. 여러분은 전체를 출력하여 out을 확인하십시오. html를 출력에서 제목 부분을 찾아보겠습니다. 첫 번째 동영상 제목에 'WELCOMING'이 보입니다. 90%는 성공입니다. 제목 앞에 "title":{"runs":[{"text":의 코드가 보입니다. html에서 해당 코드의 위치정보를 받아오면, 원하는 정보를 얻을 수 있습니다. 마찬가지로 url 앞에도 "commandMetadata":{"webCommandMetadata":{"url":의 코드가 있습니다. 동일하게 적용할 수 있습니다.

 

 

 

코드로 살펴보겠습니다. 페이지의 첫 번째 동영상 제목과 url을 성공적으로 크롤링 하였습니다. html에서 제목과 url이 작성된 형식을 검색하고, html text의 위치를 확인하여, 제목과 url을 크롤링 합니다.

먼저 제목 위치 찾는 코드를 해석하겠습니다. point1 = str(html).find(title_param1, tmp_point) 은 제목의 시작점을 찾는 코드입니다. 기본적으로 str의 위치를 찾기 위해서는 html을 str 형태로 type 변형을 합니다. 그리고 find를 사용하여, title_param1이 가리키는 위치를 확인하여, text의 시작점을 얻습니다. print(str(html)[point1+len(title_param1):point2])은 제목을 출력하는 코드입니다. point1은 title_param1의 시작점이므로, title_param1의 길이만큼 shift 하여 출력해 주어야 합니다.

 

다음으로 url 위치 찾는 코드를 해석하겠습니다. upoint1 = str(html)[point1:].find(url_param1, tmp_point)에서 point1부터 시작하는 이유는 url_param1이 다른 곳에도 사용되므로, text 위치를 해당 제목 다음 case를 제한하기 위함입니다. 해당 제목 다음에 위치한 url입니다. 그래서 str(html)[point1:]의 코드를 사용하였습니다.

 

In [45]:
## 유튜브에서 동영상 정보 크롤링 (crawling) 
## 유튜브에서 동영상 정보 크롤링 (crawling) 
import requests
from bs4 import BeautifulSoup 

def get_html(url):
    ## 브라우저 호환을 위해서 설정
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '+ \
        '(KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
                } 
    ##해당 url에 htlm(정보) 요청에사용 / url은 사용자가 원하는 url
    r = requests.get(url, headers=headers) 
    ## 해당 url의 html을 사용자가 활용하기 쉽게 변환
    html = BeautifulSoup(r.content, 'html.parser')
    ## 결과값 전달
    return html

def get_youtube_video_crawling():
    url = 'https://www.youtube.com/c/BLACKPINKOFFICIAL/videos'
    html = get_html(url)
    
    tmp_point = 0
    ## html에서 제목위치 얻기
    title_param1 = '"title":{"runs":[{"text":"'
    title_param2 = '"}],"accessibility":{"accessibilityData":'
    
    ## title_param1의 html위치 구하기 (첫번째 동영상)
    point1 = str(html).find(title_param1, tmp_point)
    ## title_param2의 html위치 구하기 (첫번째 동영상)
    point2 = str(html).find(title_param2, tmp_point)
    ## 텍스트 위치정보입력
    print(str(html)[point1+len(title_param1):point2])
    
    ## html에서 url위치 얻기
    url_param1 = '"commandMetadata":{"webCommandMetadata":{"url":"'
    url_param2 = '","webPageType":"WEB_PAGE_TYPE_WATCH"'
    ## 제목위치 바탕으로 인접 url위치 추출
    ## html에서 제목위치를 기준으로 하여 url_param1/2를 추출하여 추출예외케이스 방지
    upoint1 = str(html)[point1:].find(url_param1, tmp_point)
    upoint2 = str(html)[point1:].find(url_param2, tmp_point)
    ## 텍스트 위치정보입력
    print('https://www.youtube.com'+str(html)[point1+upoint1+len(url_param1):point1+upoint2])

get_youtube_video_crawling()
 
BLACKPINK 2022 WELCOMING COLLECTION PREVIEW
https://www.youtube.com/watch?v=OZdK1czhuv8

 

1탄에서는 맨 앞의 동영상 제목과 url을 크롤링 하였습니다. 2탄에서는 여러 동영상 제목과 url을 크롤링 하겠습니다. 암기가 아니라 이해와 문제해결능력에 도움이 되길 희망합니다.

 

print('모두의 파이썬')

※좋아요/댓글은 서로를 응원합니다!

728x90
반응형