잠깐 사용할 일이 있어서 간단히 만들어보았다.

Beautifulsoup으로 처리하다가 동적(?)으로 생성되는 댓글페이지의 글들을 가져오지 못해서 selenium으로 해결했다.

언제나 처럼 osX, python 3.x으로 하였다.

1. 필요 프로그램 설치

  • Beautifulsoup4, selenium 설치
pip install --upgrade Beautifulsoup4 selenium 
  • selenium에 사용할 WebDriver 설치
    • 이 곳에서 자신에게 맞는 버젼을 설치한다.(Chrome)
    • 설치한 다음 설치된 위치를 잘 기억해둔다.

2. 크롤링해보기.

  • 우선 나는 이 기사의 댓글을 크롤링 할 것이다.
  • 기사의 내용이 있는 주소가 아닌 화면에서 전체 댓글 더 보기를 클릭한 주소에서 크롤링을 한다!
  • 위에서 말한 댓글창(?)의 주소는 원 주소의 뒤에 &m_view=1를 붙여주면 된다.
  • 그 뒤에 보통 &sort=LIKE도 붙기는 하는데 이건 좋아요의 갯수 순으로 정렬되는 옵션이다.(자세한 내용은 네이버 개발자센터를…)
import time

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.common import exceptions

wd = "./chromedriver"  # 다운 받은 웹드라이버 위치
addr = "http://m.sports.news.naver.com/kbaseball/news/read.nhn?oid=108&aid=0002688114&m_view=1&sort=LIKE" 
# 크롤링하고자하는 사이트 주소
# 개인적으론 모바일 페이지로 하는게 더 가볍고 빠를것같은 기분이 든다.

driver = webdriver.Chrome(wd)
driver.get(addr)

pages = 0 # 한 페이지당 약 20개의 댓글이 표시
try:
    while True: # 댓글 페이지가 몇개인지 모르므로.
        driver.find_element_by_css_selector(".u_cbox_btn_more").click()
        time.sleep(1.5)
        print(pages, end=" ")
        pages+=1
    
except exceptions.ElementNotVisibleException as e: # 페이지 끝
    pass
    
except Exception as e: # 다른 예외 발생시 확인
    print(e)

    
html = driver.page_source
dom = BeautifulSoup(html, "lxml")

# 댓글이 들어있는 페이지 전체 크롤링
comments_raw = dom.find_all("span", {"class" : "u_cbox_contents"})

# 댓글의 text만 뽑는다.
comments = [comment.text for comment in comments_raw]

comments[:3]


# 결과
['경기 지고있는데 쪼개고있던 이대호는 우리 정서에 맞아서 안까이냐?',
 '메이저리그 였으면 빈볼 타석마다 맞고 벤치클리어링 나서 오도어가 죽탱이 한대 칠만한 일인데.. 로저스가 과연 믈브였어도 저렇게 할 수 있었을까 싶다.',
 '다음부터는 자제 좀 하기를']