Selenium(headless Chrome)로 크롤링 이해 및 실습
이해하기 쉽고, 장황하지 않은 자료를 기반으로 강의를 진행합니다.
PhantomJS 지원 종료 안내
PhantomJS는 현재 개발이 중단되었습니다. Headless Chrome/Firefox와 Selenium WebDriver(ChromeDriver/GeckoDriver) 또는 Playwright 등 최신 대안을 사용하세요.
사전준비 (Selenium 설치)
1. Selenium 인스톨: pip install selenium
2. 웹드라이버 인스톨: 웹 테스트 자동화를 위해 제공되는 툴(각 browser및 os 별로 존재)
- selenium - 테스트 코드를 사용하여 브라우져에서의 액션을 테스트할 수 있게 해주는 툴
- Firefox, chromedriver 등 각 브라우져마다 웹드라이버 다운로드 가능
+ https://sites.google.com/a/chromium.org/chromedriver/ (Chrome 브라우저용)
+ https://github.com/mozilla/geckodriver/releases (Firefox 브라우저용)
확인: 설치 디렉토리를 알아두어야 함
1. Selenium 인스톨: pip install selenium
2. 웹드라이버 인스톨: 웹 테스트 자동화를 위해 제공되는 툴(각 browser및 os 별로 존재)
- selenium - 테스트 코드를 사용하여 브라우져에서의 액션을 테스트할 수 있게 해주는 툴
- Firefox, chromedriver 등 각 브라우져마다 웹드라이버 다운로드 가능
+ https://sites.google.com/a/chromium.org/chromedriver/ (Chrome 브라우저용)
+ https://github.com/mozilla/geckodriver/releases (Firefox 브라우저용)
확인: 설치 디렉토리를 알아두어야 함
In [1]:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
# 드라이버 생성
# chromedriver 설치된 경로를 정확히 기재해야 함
# chromedriver = 'C:/dev_python/Webdriver/chromedriver.exe' # 윈도우
chromedriver = '/usr/local/Cellar/chromedriver/chromedriver' # 맥
driver = webdriver.Chrome(chromedriver)
# 크롤링할 사이트 호출
driver.get("http://www.python.org")
# Selenium은 웹테스트를 위한 프레임워크로 다음과 같은 방식으로 웹테스트를 자동으로 진행함 (참고)
assert "Python" in driver.title
# <input id="id-search-field" name="q" 검색창 name으로 검색하기
# 태그 name으로 특정한 태그를 찾을 수 있음
elem = driver.find_element(By.NAME, "q")
# input 텍스트 초기화
# elem.clear()
# 키 이벤트 전송가능함
# 태그가 input 태그이므로 입력창에 키이벤트가 전달되면, 입력값이 자동으로 작성됨
elem.send_keys("pycon")
# 태그가 input 태그이므로 엔터 입력시 form action이 진행됨
elem.send_keys(Keys.RETURN)
# Selenium은 웹테스트를 위한 프레임워크로 다음과 같은 방식으로 웹테스트를 자동으로 진행함 (참고)
assert "No results found." not in driver.page_source
# 명시적으로 일정시간을 기다릴 수 있음 (10초 기다림)
time.sleep(10)
# 크롬 브라우저 닫기 가능함
driver.quit()
8.1.2 Headless Chrome¶
- GUI 없이 실행하는 크롬 브라우저
- 터미널/서버 환경에서는 headless Chrome 사용 권장 (Selenium 4에서 기본 제공)
사전준비 (Selenium + Chrome)
1. pip install selenium
2. 크롬(또는 크롬 기반 브라우저) 설치
3. Selenium 4는 드라이버를 자동 관리하므로 별도 chromedriver 다운로드가 필요 없습니다.
확인: headless 옵션을 통해 GUI 없이 실행됩니다.
1. pip install selenium
2. 크롬(또는 크롬 기반 브라우저) 설치
3. Selenium 4는 드라이버를 자동 관리하므로 별도 chromedriver 다운로드가 필요 없습니다.
확인: headless 옵션을 통해 GUI 없이 실행됩니다.
확인 사항
환경에 맞게 옵션만 추가하면 바로 실행할 수 있습니다.
In [7]:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
# 드라이버 생성 (Selenium 4는 chromedriver를 자동으로 관리)
driver = webdriver.Chrome(options=options)
8.2 Selenium 태그 검색 주요 함수¶
- 주요 함수 - find_element(By.TAG_NAME, ...), find_elements(By.TAG_NAME, ...)
- find_element(By.TAG_NAME, ...): 최초 발견한 태그만 가져오기
- find_elements(By.TAG_NAME, ...): 모든 태그 리스트로 가져오기
In [19]:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
options = Options()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=options)
driver.get('http://v.media.daum.net/v/20170202185812986')
# 최초 발견한 태그만 검색
title = driver.find_element(By.TAG_NAME, 'h3')
print(title.text)
# 모든 태그 검색
h3s = driver.find_elements(By.TAG_NAME, 'h3')
for h3 in h3s:
print(h3.text)
driver.quit()
- 주요 함수 - find_element(By.ID, ...), find_elements(By.ID, ...)
- find_element(By.ID, ...): 최초 발견한 아이디를 가진 태그만 가져오기
- find_elements(By.ID, ...): 아이디를 가진 모든 태그 리스트로 가져오기
In [ ]:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
options = Options()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=options)
driver.get('http://v.media.daum.net/v/20170202185812986')
body = driver.find_element(By.ID, 'harmonyContainer')
print(body.text)
driver.quit()
- 주요 함수 - find_element(By.NAME, ...), find_elements(By.NAME, ...)
- find_element(By.NAME, ...): 최초 발견한 태그 안에 name 값이 같은 태그 가져오기
- find_elements(By.NAME, ...): 태그 안에 name 값이 같은 태그 모두 리스트로 가져오기