1.3 동적 크롤링(selenium 등)
키워드 : 크롤링, 동적크롤링, driver.get(), xpath, driver.find_element().click(), driver.find_element.text, time.sleep(), driver.quit(), beautifulsoup, request, urlib, playwright, Chrome webdriver, scrapy, 정적크롤링, 머신러닝, 딥러닝, AI, 파이썬, 데이터 분석, 데이터 시각화, EDA, 데이터 전처리, 데이터 수집, 데이터 모델링
01. 동적 크롤링이란?
동적 크롤링은 동적인 데이터를 수집하는 방법을 뜻합니다. 동적인 데이터란 입력, 클릭, 로그인 등과 같이 페이지 이동이 있어야 보이는 데이터를 의미합니다. 정적 크롤링을 통해 데이터를 수집하는 속도보다 느리다는 단점이 있지만, 동적인 데이터를 수집하기 때문에 수집 데이터에 한계가 없다는 장점이 있습니다.
.png)
동적 크롤링을 하는 방법에는 다양한 방법이 있으며, 대표적으로 Selenium, Playwright 등이 있습니다. 지금부터 동적크롤링을 할 수 있는 대표적인 방법들에 대해 설명을 하려 합니다.
02. Selenium
2.1 selenium이란?
동적 크롤링을 시행하는 방법 중 가장 보편적인 방법으로는 Selenium을 꼽을 수 있습니다. 셀레니움이란 오픈 소스 테스트 자동화 프레임워크로, 다양한 웹 브라우저와 플랫폼에서 웹 애플리케이션을 테스트할 수 있는 기술입니다. 웹 상에서 정적인 페이지를 탐색하는데 사용하던 beautifulsoup같은 패키지가 하지 못하는 동적인 크롤링을 지원하는 하나의 방법입니다.
동적크롤링을 하기 위해 셀레니움을 사용해야 하는 이유는 다음과 같습니다.

첫번째로, 동적 웹 페이지는 로그인이 필요한 경우가 많습니다. 셀레니움을 이용하면 웹 브라우저를 제어하여 로그인한 후 세션을 관리하고 쿠키를 유지할 수 있기 때문에 동적 크롤링을 위해 셀레니움을 사용합니다. 두번째로 동적으로 생성된 콘텐츠는 일반적으로 JavaScript를 사용하여 로드되기 때문에, 실제 웹 브라우저 제어를 통해 JavaScript를 실행할 수 있는 셀레니움으로 원하는 콘텐츠를 가져올 수 있습니다. 이러한 이유로 셀레니움을 통해 동적 크롤링을 시행합니다.
셀레니움은 다양한 웹브라우저를 지원하고 (Chrome, Firefox, Safari 등), 다양한 언어를 지원하기 때문에 (Java,Python 등) 개발자가 사용하기 원활하다는 장점이 있습니다. 또한 실제 웹브라우저를 사용하여 테스트를 하기 때문에 실제 사용자의 경험과 가까운 결과를 얻을 수 있다는 가장 큰 장점이 있습니다. 하지만 셀레니움은 웹 브라우저를 사용하여 테스트를 하기 때문에 실행 속도가 상대적으로 느릴 수 있다는 단점이 있습니다.
2.2 Selenium 설치
a. Chrome webdriver 설치
셀레니움을 사용하기 위해서는 웹 자동화를 위해 크롬 웹 드라이버를 설치해야 합니다.
- 크롬 버전 확인하기
먼저 크롬을 실행한 후 , 오른쪽 상단 점 3개 버튼을 클릭 후 도움말 →chrome 정보를 클릭하면 크롬 버전을 확인할 수 있습니다.


- 웹드라이버 설치하기
자신의 크롬 버전을 확인했으면, 이에 따라 아래 페이지에서 웹드라이버를 설치합니다. 웹드라이브는 본인이 사용하는 브라우저에 맞춰서 다운로드하면 됩니다.

자신의 크롬 버전이 115이상인 경우, 아래의 부분을 클릭하여 크롬 드라이버 다운을 받도록 합니다.

b. 셀레니움 설치 및 import
파이썬에서 Selenium을 설치하는 방법은 pip나 아나콘다를 통해 설치가 가능합니다. 설치 방법은 각각 다음과 같습니다.
!pip install selenium
!conda install -c conda-forge selenium
위의 설치까지 다 실행했다면, 아래의 코드를 실행시켜 셀레니움을 임포트해봅니다. 빈 창이 뜬다면, 성공적으로 셀레니움이 임포트된 것입니다.
import selenium from selenium
import webdriver from selenium.webdriver.common.keys
import Keys
driver = webdriver.Chrome()

자신의 크롬 드라이버가 115 이상인 경우 아래의 코드도 같이 입력을 해줍니다.
from selenium.webdriver.chrome.options
import Options from selenium.webdriver.chrome.service
import Service
# 셀레니움 옵션
option = Options()
service = Service()
driver = webdriver.Chrome(service=service, options=option)
2.3 Selenium 사용법
설치가 완료되었다면, 지금부터는 교보문고 사이트를 이용하여 Selenium의 기능을 소개해드리고자 합니다. 실습해보고자 하는 내용은 ‘교보문고 사이트 내 도서의 출판사 서평 가져오기’입니다. 실습 과정은 driver.get() → Xpath 찾기 → driver.find_element().click() → driver.find_element().text로 이루어집니다.
a. driver.get() : url 창 띄우기
먼저 driver.get()은 특정 url 창을 띄울 수 있는 기능입니다. 아래의 코드를 시행하면 교보문고 종합 월간 베스트셀러 창을 얻을 수 있게 됩니다.
driver = webdriver.Chrome()
driver.get(url=URL)

b. XPATH 값 복사하기
'/html/body/div[18]/button/span[1]’, '//*[@id="ui-id-63"]/div[2]/button[2]', '//*[@id="tabRoot"]/div[3]/ol[1]/li[1]/div[2]/div[2]/a/span'는 모두 XPATH의 주소를 뜻하는데요. 이 각각의 xpath는 다음 단계들에서 모두 필요한 값들입니다. 이 값을 얻기 위한 방법은 설명만으로는 어려울 수 있으니 아래의 단계를 따라가며 하나씩 따라가 보도록 합시다. 아래의 설명은 앞의 3개 xpath중 마지막 값인 ‘세이노의 가르침’ 위치를 기준으로 진행합니다.

먼저 chrome의 ‘도구 더보기’→ ‘개발자 도구’를 클릭하여 줍니다.

그러면 위와 같은 사이트의 html 정보를 볼 수 있는 곳으로 접속하게 되는데요, 이 html 한 줄 한 줄이 다 하나의 ‘요소(element)’입니다. 이때 왼쪽 상단의 빨간 상자 버튼을 눌러봅니다.

그러면 위의 그림과 같이 홈페이지에서 마우스를 갖다 대는 위치의 html 요소(element) 정보가 어떤 것인지 쉽게 알 수 있게 됩니다. 필자는 ‘세이노의 가르침’ 을 클릭하고 싶어 책 제목에 커서를 클릭해보았는데요, 그랬더니 위 그림의 오른쪽 박스와 같이 해당 요소가 어느 부분인지 쉽게 알아낼 수 있었습니다.

이제 우리는 알게된 html 요소 정보의 XPATH를 복사하기 위해 오른쪽 마우스를 클릭하여 Copy → Copy XPath를 클릭해줍니다.
그렇게 우리는 ‘//*[@id="tabRoot"]/div[3]/ol[1]/li[1]/div[2]/div[2]/a/span’라는 XPATH 값을 얻었습니다. 이제 driver.find_element를 사용할 준비가 완료되었습니다! 위에서 진행한 것 처럼 배너의 위치 XPATH 값도 똑같이 진행하여 XPATH 값을 얻습니다. 이 값을 driver.find_element 에 붙여넣어 사용합니다.
c. driver.find_element().click()
a 단계에서 ‘월간 종합 베스트셀러’ 창을 띄우는 데에 성공했습니다. 이제 우리는 b단계에서 얻은 xpath값으로 ‘세이노의 가르침’ 이라는 ‘출판사 서평’ 페이지를 가져오고자 합니다. 이때 driver.find_element 를 이용할 것입니다. driver.find_element는 내가 클릭하고자 하는 위치의 정보를 얻어 해당 위치를 클릭하게 해줍니다. 순서는 다음과 같습니다.

.png)
.png)
아래의 코드를 실행시키면 selenium이 위 사진의 순서와 같이 1) 배너창을 지운 후 2) ‘세이노의 가르침’ 제목 버튼을 클릭하여 다음 창 (세이노의 가르침의 상세페이지 창)으로 넘어가게 됩니다.
from selenium.webdriver.common.by import By
import time
time.sleep(5)
driver.find_element(By.XPATH, '/html/body/div[18]/button/span[1]').click()
driver.find_element(By.XPATH, '//*[@id="ui-id-63"]/div[2]/button[2]').click() driver.find_element(By.XPATH, '//*[@id="tabRoot"]/div[3]/ol[1]/li[1]/div[2]/div[2]/a/span').click()
코드를 하나씩 설명하자면 다음과 같습니다. 먼저 time.sleep(5)는 5초만큼 기다리겠다는 뜻입니다. time.sleep에 관한 내용은 뒤에서 짚고 넘어가도록 하겠습니다.
driver.find_element(By.XPATH, ‘ XPATH 주소’) 는 요소의 값을 찾겠다는 뜻입니다. 이때 By.XPATH의 의미는 XPATH를 통해 요소를 찾겠다는 의미이며, By 뒤에 XPATH 이외에도 css selector, id 등이 올 수 있습니다. 하지만 저희는 XPATH 값을 복사하였으니 **By.**XPATH를 이용할 것입니다. 이 때 By 형태의 기능을 사용하기 위해서는 셀레니움에서 By를 임포트할 필요가 있어 필요한 모듈을 임포트해주었습니다.
d. driver.find_element.text
코드를 실행하였더니 아래와 같이 상세페이지에 접속하게 되었는데요. 우리가 얻고자 하는 것은 출판사 출판사 서평 텍스트이니, 위에서 진행한 방법으로 동일하게 출판사 서평 위치의 XPATH를 얻어 driver.find_element 에 복사 붙여넣기한 뒤 .text를 붙여줍니다.
.png)
.png)
코드는 다음과 같습니다.
time.sleep(5)
book = driver.find_element(By.XPATH, '//*[@id="scrollSpyProdInfo"]/div[11]/div[2]/div[1]/div/p').text print(book)
driver.quit()
.png)
이렇게 간단한 방법으로 출판사 서평의 정보를 얻었습니다.
2.4 그 외 사용한 기능
a. time.sleep()
위의 코드에서 중간 중간에 time.sleep() 기능을 집어 넣는 이유는, 웹을 너무 빨리 클릭하다 보면 서버가 봇으로 인지를 할 수 있습니다. 또한 너무 빨리 진행이 되다보면 화면이 다 나오기도 전에 클릭을 하게 될 수 있기 때문에 중간 중간 쉬는 시간을 주는 것이 좋습니다.
b. driver.quit()
driver.quit()은 이때까지 작
업했던 창을 닫아주는 기능을 합니다.
03. Playwright
3.1 Playwright란 ?
Playwright는 웹 브라우저를 자동화하고 테스트하는 데 사용되는 오픈 소스 프레임워크입니다. Playwright를 통해 크롤링을 하는 것도 가능합니다.
Playwright가 주로 동적 크롤링에 사용되는 이유는 다음과 같습니다. 먼저 실시간 업데이트와 상호 작용에 유용합니다. Playwright는 브라우저를 자동화하기 때문에 동적인 업데이트나 상호작용을 실시간으로 변경하는 데이터를 처리할 수 있습니다. 또한, 보안 및 인증 처리에 유용합니다. 동적 웹페이지는 종종 사용자 인증 및 보안을 다루는 데에 사용되는데, Playwright는 로그인 세션 관리 및 요구사항을 처리하여 웹 사이트의 보안 기능을 테스트하는 데에 유용합니다.
Playwright는 셀레니움과 같이 다양한 브라우저에서 지원이 되며, JavaScript, Python 등 다양한 프로그래밍 언어에서 지원이 되기 때문에 그 편리성이 장점입니다. 그러나, 복잡한 시나리오를 작성하기에는 코드 작성이 어려울 수 있으며, 상대적으로 새로운 프레임워크이기 때문에 온라인 자료가 상대적으로 적다는 단점이 있습니다.
3.2 Playwright 사용법
Playwright 사용법을 배울 수 있는 블로그 링크를 첨부해두었으니, 관심이 있는 분들은 스터디에 참고하시길 바랍니다.
playwright를 사용하여 웹크롤러 만들기
[Crawling] Playwright를 이용한 크롤링_1
https://lss3070.github.io/2021/09/22/Crawling-HeadlessBrowser/
04. 참고자료
Python Selenium 사용법 [파이썬 셀레늄 사용법, 크롤링]
https://greeksharifa.github.io/references/2020/10/30/python-selenium-usage/#google_vignette
이번 게시물에서 쓰이는 패키지나 함수의 경우 Da,ta 팀에서 자체적으로 진행했던 도서사이트 프로젝트를 참고하였습니다.