반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

 

[웹 크롤링 기초]

2021.03.22 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링 기초 of 기초

2021.03.23 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 크롬드라이버 크롬 버전에 맞춰서 설치하는법

2021.03.24 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링 관련 패키지 3종 총정리

2021.03.27 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링을 위한 속성 HTML, CSS 요약 정리

2021.03.28 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 동적/정적 페이지 차이와 그에 따른 크롤링 방법 간단정리

 

[정적 웹크롤링]

2021.03.30 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링 정적 수집 방법 개념 정리_find, find_all, select, select_one

2021.04.02 - [파이썬 패키지/웹 크롤링] - [Python/Requests/Beautifulsoup] 네이버 뉴스 기사 제목 크롤링을 통한 정적 수집 기초 정리

2021.04.06 - [파이썬 패키지/웹 크롤링] - [Python/Reuqests/Beautifulsoup] 파이썬 정적 웹크롤링 텍스트, 이미지, 하이퍼링크, 속성 가져오는 법

 

[동적 웹크롤링]

2021.04.03 - [분류 전체보기] - [코딩유치원] 네이버 뉴스 기사 제목 크롤링을 통한 동적 수집 기초 정리(selenium, beautifulsoup)

2021.06.21 - [파이썬 패키지/웹 크롤링] - [Python/Selenium] 파이썬 동적 웹크롤링 텍스트, 하이퍼링크, 이미지, 속성 가져오는 법

2021.05.22 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] 잡플래닛 리뷰 정보 크롤링 GUI 프로그램

 


오늘은 Selenium으로 원하는 네이버 뉴스 기사의 댓글 정보(아이디, 작성시간, 댓글 내용)를 크롤링하고 엑셀로 저장하는 것을 해보겠습니다.

 

참고로 이번 포스팅은 '반원의 코딩 랜드'라는 유튜브 채널의 웹크롤링 강의를 참고하였습니다.

 

친절하게 잘 설명해주셔서 많은 공부가 되었습니다. 총 4편까지 있고 그리 길지 않으니 관심있으신 분들은 보시는 것을 추천드립니다.

 

<강의 링크>

https://www.youtube.com/watch?v=lK__oNsOGOY&list=PL5L3Lhdx2zrNu2PuVUyb-4UdheDcUN3K7&index=5 

 

 

1. 전체 코드

 

이해하기 쉽도록 자세하게 주석을 달아두었으니 어렵지 않을거예요.

 

# step1. 관련 패키지 및 모듈 불러오기
from selenium import webdriver
import time
import pandas as pd


# step2. 네이버 뉴스 댓글정보 수집 함수
def get_naver_news_comments(url, wait_time=5, delay_time=0.1):
    
    # 크롬 드라이버로 해당 url에 접속
    driver = webdriver.Chrome('./chromedriver')
    
    # (크롬)드라이버가 요소를 찾는데에 최대 wait_time 초까지 기다림 (함수 사용 시 설정 가능하며 기본값은 5초)
    driver.implicitly_wait(wait_time)
    
    # 인자로 입력받은 url 주소를 가져와서 접속
    driver.get(url)

    # 더보기가 안뜰 때 까지 계속 클릭 (모든 댓글의 html을 얻기 위함)
    while True:
        
        # 예외처리 구문 - 더보기 광클하다가 없어서 에러 뜨면 while문을 나감(break)
        try:
            more = driver.find_element_by_css_selector('a.u_cbox_btn_more')
            more.click()
            time.sleep(delay_time)
            
        except:
            break

    # 본격적인 크롤링 타임
    
    # 1)작성자
    # selenium으로 작성자 포함된 태그 모두 수집
    nicknames = driver.find_elements_by_css_selector('span.u_cbox_nick')
    # 리스트에 텍스트만 담기 (리스트 컴프리핸션 문법)
    list_nicknames = [nick.text for nick in nicknames]

    # 2)댓글 시간
    # selenium으로 댓글 시간 포함된 태그 모두 수집
    datetimes = driver.find_elements_by_css_selector('span.u_cbox_date')
    # 리스트에 텍스트만 담기 (리스트 컴프리핸션 문법)
    list_datetimes = [datetime.text for datetime in datetimes]

    # 3)댓글 내용
    # selenium으로 댓글내용 포함된 태그 모두 수집
    contents = driver.find_elements_by_css_selector('span.u_cbox_contents')
    # 리스트에 텍스트만 담기 (리스트 컴프리핸션 문법)
    list_contents = [content.text for content in contents]


    # 4)작성자, 댓글 시간, 내용을 셋트로 취합
    list_sum = list(zip(list_nicknames,list_datetimes,list_contents))

    # 드라이버 종료
    driver.quit()
    
    # 함수를 종료하며 list_sum을 결과물로 제출
    return list_sum

# step3. 실제 함수 실행 및 엑셀로 저장
if __name__ == '__main__': # 설명하자면 매우 길어져서 그냥 이렇게 사용하는 것을 권장
    
    # 원하는 기사 url 입력
    url = '댓글 크롤링 원하는 기사의 url (주의! 댓글보기를 클릭한 상태의 url이어야 함'
    
    # 함수 실행
    comments = get_naver_news_comments(url)
    
    # 엑셀의 첫줄에 들어갈 컬럼명
    col = ['작성자','시간','내용']
    
    # pandas 데이터 프레임 형태로 가공
    df = pd.DataFrame(comments, columns=col)
    
    # 데이터 프레임을 엑셀로 저장 (파일명은 'news.xlsx', 시트명은 '뉴스 기사 제목')
    df.to_excel('news.xlsx', sheet_name='뉴스 기사 제목')

 

 

2. 주의할 점

 

1) 그냥 기사의 url이 아니라 아래의 빨간 사각형으로 표시한 '댓글보기 버튼'을 클릭한 후의 url이어야 합니다.

 

2) 너무 댓글이 많은 경우엔 시간이 엄청 많이 걸릴 수 있음에 주의

 

참고한 강의에서는 8000개의 댓글을 40분동안 크롤링 했으며, 이 경우에는 beautifulsoup 패키지를 활용해야 합니다.

제가 예전에 작성했던 글에 selenium만으로도 충분하다고 했었는데 그렇지 않다라는 것을 알았습니다.

(제가 작은 양의 크롤링만 해왔던 것 같아요ㅎㅎ..)

 

결론적으로 최종코드에서 '# 본격적인 크롤링 타임' 아래 부분을 아래의 코드로 바꾸어주는 것이 더욱 효율적인 코드라고 할 수 있겠습니다.

# 본격적인 크롤링 타임

html = driver.page_source
# print(html)

# 모듈 참조
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml') #html.parser

# 1)작성자
nicknames = soup.select('span.u_cbox_nick')
list_nicknames = [nickname.text for nickname in nicknames]

# 2)댓글 시간
datetimes = soup.select('span.u_cbox_date')
list_datetimes = [datetime.text for datetime in datetimes]

# 3)댓글 내용
contents = soup.select('span.u_cbox_contents')
list_contents = [content.text for content in contents]

 

 

3.  새롭게 공부한  점

 

driver.implicitly_wait( )와 time.sleep( )의 차이점

 

예를 들어 implicitly_wait(5)은 크롬드라이버가 driver의 요소를 찾는데에 최대한 기다려줄 수 있는 시간을 의미합니다.

여기서 중요한 점은 기다리다가 실행이 되면 지체없이 다음 단계로 넘어가는 것과, 딱 한 번만 선언해주면 된다는 것입니다.

 

만약 5초가 지났는데도 창이 뜨지 않으면 에러를 출력합니다.

 

그리고 time.sleep( )은 아마 많이보셨을텐데 말그대로 sleep(0.1)은 0.1초동안 프로그램이 잠을 잔다는 의미입니다.

 

위의 코드에서 more.click( ) 명령 후에 time.sleep( )을 적당히 주지 않으면 드라이버가 '더보기'가 없다고 판단하고 while문을 예상보다 일찍 빠져나가버리기도 한답니다.

 

<참고 자료>

 

https://stackoverflow.com/questions/53588966/python-selenium-difference-between-driver-implicitly-wait-and-time-sleep

 

Python & Selenium: Difference between driver.implicitly_wait() and time.sleep()

Yes, I know both are used to wait for some specified time. Selenium: driver.implicitly_wait(10) Python: import time time.sleep(10) Is there any difference between these two?

stackoverflow.com

 


 

 

반응형

+ Recent posts