1 글 보임 - 1 에서 1 까지 (총 1 중에서)
  • 글쓴이
  • #8553
    허 진경허 진경
    키 마스터

    유튜브 댓글 크롤링 예

    #가장 처음에만 실행하고 삭제하면 되는 셀
    !pip install selenium
    !pip install konlpy
    ####설정부분####
    n=6
    ###############
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from selenium.common.exceptions import NoSuchElementException
    from selenium.common import exceptions
    from selenium.common.exceptions import StaleElementReferenceException
    import time
    driver = webdriver.Chrome('C:/chromedriver')
    driver.get('https://www.youtube.com/watch?v=G3qG3dVZc4o&list=UUzW0FveoY3_sTgBjvpG7Kwg')
    driver.maximize_window()
    last_index = 0
    commentlist=[]
    #페이지 우측의 동영상재생목록을 가져온다.
    time.sleep(2)
    video_list = driver.find_elements_by_css_selector('#video-title.ytd-playlist-panel-video-renderer')
    print(len(video_list))
    
    #영상목록의 영상에 한개씩 접근해 조건에 맞는 댓글을 수집해온다.
    for vid in video_list:
        try:
            vid.click()
        #특정 영상에 다음 예외가 발생하는 경우가 있어 예외처리. 댓글은 수집됨.
        except StaleElementReferenceException:
            print('StaleElementReferenceException Occured!\n')
        time.sleep(2)
        
        #[정렬기준]을 클릭할 수 있을 때까지 페이지다운버튼을 누른다.
        #timesleep을 하지 않으면 버튼이 있어도 지나친다.
        pagebody = driver.find_element_by_tag_name('body')
        while True:
            try:
                driver.find_element_by_xpath('//*[@id="icon-label"]').click()
                break;
            except NoSuchElementException:
                pagebody.send_keys(Keys.PAGE_DOWN)
                time.sleep(1)
        
        #[최신순]을 눌러 댓글을 최신순정렬한다.
        time.sleep(0.5)
        driver.find_element_by_xpath('//*[@id="menu"]/a[2]/paper-item/paper-item-body/div[1]').click()
        time.sleep(1)
        
        #작성댓글 리스트, 작성시간 리스트를 가져온다.(같은태그로 가져올 수 없음)
        comments = driver.find_elements_by_id('content-text')
        date_list = driver.find_elements_by_xpath('//*[@id="header-author"]/yt-formatted-string/a')
        
        #for문으로 조건에 맞는 댓글만 commentlist에 추가
        #시간조건을 만족하는 가장 마지막 댓글의 인덱스를 가져와 인덱스까지의 댓글을 수집하도록 함
        for d,date in enumerate(date_list):
            #시간조건에 따라 가장 처음댓글의 인덱스 지정.
            #가장 처음댓글이 'n주 전' 또는 'n개월 전'이면 인덱스==none.
            #'n시간전'이면 무조건, 'n일 전'이면 조건에 맞는 댓글의 인덱스를 저장.
            if d==0:
                if (date.text[1]=='주') or (date.text[1]=='개'):
                    last_index = None
                    break;
                elif (date.text[1]=='시'):
                    last_index = d
                elif (date.text[1]=='일'):
                    if int(date.text[0])<= n:
                        last_index = d
            #시간조건에 따라 첫번째 이후의 댓글의 인덱스 지정.
            #n시간전'이면 무조건, 'n일 전'이면 조건에 맞는 댓글의 인덱스를 저장.
            #n일을 초과하는 경우 break;로 빠져나와 이전의 인덱스를 저장하고 있음
            elif d!=0:
                if (date.text[1]=='시'):
                    last_index = d
                elif (date.text[1]=='일'):
                    if int(date.text[0])<= n:
                        last_index = d
                    else:
                        break;
                else:
                    break;
        print(last_index)
        
        #저장한 인덱스까지의 댓글을 리스트에 추가함
        try:
            for i,c in enumerate(comments):
                if(i<=last_index):
                    commentlist.append(c.text) 
                else:
                    break;
        #시간조건을 만족하는 댓글이 하나도 없어 인덱스가 None인경우 TypeError가 발생하며 아무댓글도 추가되지 않음
        except TypeError:
            print('TypeError occured!\n')
                
        time.sleep(0.1)
        driver.back()

    commentlist

    #숫자와 문자만 따로 빼서 저장(특수문자 및 이모티콘 제외)
    import re
    cmt_lst=[]
    for i in commentlist:
        i = re.sub('[^0-9a-zA-Zㄱ-힗]', ' ', i)
        cmt_lst.append(i)
    cmt_lst
    #데이터프레임으로 만들어 파일로 저장
    import pandas as pd
    comment_df=pd.DataFrame({'comment':cmt_lst})
    comment_df
1 글 보임 - 1 에서 1 까지 (총 1 중에서)

답변은 로그인 후 가능합니다. Login here