프로필사진

IT Anthology/how-to

스크래퍼 만들기 2 - Selenium으로 스크래핑(크롤링)하기

다각 2021. 11. 24. 11:56

(이 글은 2019년 8월 29일에 처음 작성한 글입니다)

 

셀레늄은 본래 웹이 잘 작동하는 지 실험하기 위한 도구였다.
하지만 자바 스크립트를 읽기 유용하다는 점에서 스크래핑 도구로 사용될 수 있다. 하지만 엄청 느리다.

 

인간이 하는 행동을 그대로 자동화 시킬 수 있다는 점에서 강력하지만 우리가 무의식적으로 하는 행동 (클릭 등)을 다 일일이 설정해줘야 하기 때문에 귀찮음 꼼꼼함이 요구된다.

 

기본적인 동작 실행

먼저 필요한 모듈을 불러온다.

from selenium import webdriver

(설치가 안되어 있다면 pip install selenium)
셀레늄은 파이썬 내에서 웹을 실행시켜 그 안에서 작업을 수행할 수 있게 해주는 도구이다.

셀레늄을 사용하기 위해서는 웹 드라이버가 필요하다. 맞는 버젼으로 재빠르게 다운로드 받는다.

driver_path = "(다운로드 받은 경로)\\chromedriver_win32//chromedriver"
driver = webdriver.Chrome(driver_path)

위의 코드까지 실행시키면 크롬의 새 창이 깜빡하면서 떠오른다.

driver.get('https://www.naver.com')

을 실행시키면 파이썬에 의해 제어되고 있는 웹 페이지가 네이버를 띄워준다.

search_elem = driver.find_element_by_css_selector('input#query)[0]
search_elem.send_keys('nlp')
btn_elem = driver.find_element_by_css_selector('span.ico_search_submit')
btn_elem.click()

이것을 실행하면 처음 검색하는 부분부터 자동화 시킬 수도 있다.

 

셀레늄으로 스크래핑

일단 빠른 진행을 위해 검색 페이지에 바로 접근하여 스크래핑하는 부분을 보자

driver.get(https://search.naver.com/search.naver?where=news&sm=tab_jum&query=nlp)
elem_li = driver.find_elements_by_css_selector('ul dt a')
for elem in elem_li:
    title = elem.get_attribute('title')
    href = elem.get_attibute('href')

나는 driver.find_elements_by_css_selector를 이용했지만,

 drive.find_element_by_css_selector를 치면 첫 항목 하나만 가져온다.

 

이외에도 xpath를 이용할 수 있는 .find_elements_by_css_selector도 있고,

class name 이나 id, tag name으로도 검색할 수 있는 .find_elements_by_class_name,.find_elements_by_id,.find_elements_by_tag_name 등이 있다.

 

셀레늄에서 screen shot

셀레늄에서는 항목 전체를 이미지 스크린 샷로 가져오는 놀라운 기능이 있다. 간단한 예시 코드를 보자
아래 빨간 박스 부분을 이미지로 저장하고자 하는 코드는 다음과 같다

driver.get(https://search.naver.com/search.naver?where=news&sm=tab_jum&query=nlp)
elem = driver.find_element_by_css_selector('ul.type01 li')
elem.screenshot('news.png')

위 이미지의 빨간 박스 부분만 이미지로 저장되는 것을 볼 수 있다.