Selenium의 기초 WebDriver
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
3-2. 브라우저 자동화하기, Selenium¶
Selenium
을 활용해 브라우저를 조작해봅시다.
Selenium 라이브러리¶
selenium
은 Python을 이용해서 웹 브라우저를 조작할 수 있는 자동화 프레임워크입니다.
이를 사용하기 위해서는 먼저 selenium
프레임워크를 설치해야합니다.
pip install
을 통해서 이를 간단하게 설치할 수 있습니다.
Tip:
%
를 이용해서 노트북(.ipynb) 환경에서 터미널 코드를 실행할 수 있습니다.
%pip install selenium
Collecting selenium Downloading selenium-4.14.0-py3-none-any.whl (9.9 MB) ---------------------------------------- 9.9/9.9 MB 9.1 MB/s eta 0:00:00 Collecting trio~=0.17 Downloading trio-0.22.2-py3-none-any.whl (400 kB) ------------------------------------- 400.2/400.2 kB 12.6 MB/s eta 0:00:00 Requirement already satisfied: urllib3[socks]<3,>=1.26 in d:\python\anaconda3\lib\site-packages (from selenium) (1.26.14) Collecting trio-websocket~=0.9 Downloading trio_websocket-0.11.1-py3-none-any.whl (17 kB) Requirement already satisfied: certifi>=2021.10.8 in d:\python\anaconda3\lib\site-packages (from selenium) (2023.5.7) Requirement already satisfied: sortedcontainers in d:\python\anaconda3\lib\site-packages (from trio~=0.17->selenium) (2.4.0) Requirement already satisfied: attrs>=20.1.0 in d:\python\anaconda3\lib\site-packages (from trio~=0.17->selenium) (22.1.0) Collecting outcome Downloading outcome-1.3.0-py2.py3-none-any.whl (10 kB) Requirement already satisfied: sniffio in d:\python\anaconda3\lib\site-packages (from trio~=0.17->selenium) (1.2.0) Requirement already satisfied: idna in d:\python\anaconda3\lib\site-packages (from trio~=0.17->selenium) (3.4) Collecting exceptiongroup>=1.0.0rc9 Downloading exceptiongroup-1.1.3-py3-none-any.whl (14 kB) Requirement already satisfied: cffi>=1.14 in d:\python\anaconda3\lib\site-packages (from trio~=0.17->selenium) (1.15.1) Collecting wsproto>=0.14 Downloading wsproto-1.2.0-py3-none-any.whl (24 kB) Requirement already satisfied: PySocks!=1.5.7,<2.0,>=1.5.6 in d:\python\anaconda3\lib\site-packages (from urllib3[socks]<3,>=1.26->selenium) (1.7.1) Requirement already satisfied: pycparser in d:\python\anaconda3\lib\site-packages (from cffi>=1.14->trio~=0.17->selenium) (2.21) Collecting h11<1,>=0.9.0 Downloading h11-0.14.0-py3-none-any.whl (58 kB) ---------------------------------------- 58.3/58.3 kB ? eta 0:00:00 Installing collected packages: outcome, h11, exceptiongroup, wsproto, trio, trio-websocket, selenium Successfully installed exceptiongroup-1.1.3 h11-0.14.0 outcome-1.3.0 selenium-4.14.0 trio-0.22.2 trio-websocket-0.11.1 wsproto-1.2.0 Note: you may need to restart the kernel to use updated packages.
설치를 다 진행했다면, 이제 Chrome Driver를 설치하러 가봅시다.
Web Driver¶
- 웹 브라우저와 연동을 위해서는
WebDriver
가 필요합니다.
WebDriver
는 웹 브라우저를 제어할 수 있는 자동화 프레임워크입니다.
이 실습에서는 Chrome을 기준으로 설명하겠습니다.
pip insall
을 통해 webdriver를 관리하는 라이브러리 webdriver-manager
를 설치합니다.
%pip install webdriver-manager
Collecting webdriver-manager Downloading webdriver_manager-4.0.1-py2.py3-none-any.whl (27 kB) Requirement already satisfied: requests in d:\python\anaconda3\lib\site-packages (from webdriver-manager) (2.28.1) Requirement already satisfied: packaging in d:\python\anaconda3\lib\site-packages (from webdriver-manager) (22.0) Collecting python-dotenv Downloading python_dotenv-1.0.0-py3-none-any.whl (19 kB) Requirement already satisfied: idna<4,>=2.5 in d:\python\anaconda3\lib\site-packages (from requests->webdriver-manager) (3.4) Requirement already satisfied: charset-normalizer<3,>=2 in d:\python\anaconda3\lib\site-packages (from requests->webdriver-manager) (2.0.4) Requirement already satisfied: urllib3<1.27,>=1.21.1 in d:\python\anaconda3\lib\site-packages (from requests->webdriver-manager) (1.26.14) Requirement already satisfied: certifi>=2017.4.17 in d:\python\anaconda3\lib\site-packages (from requests->webdriver-manager) (2023.5.7) Installing collected packages: python-dotenv, webdriver-manager Successfully installed python-dotenv-1.0.0 webdriver-manager-4.0.1 Note: you may need to restart the kernel to use updated packages.
설치를 완료했다면 이제 Webdriver를 사용할 수 있습니다.
컴퓨터에 Chrome이 깔려있어야 이후 실습을 진행할 수 있습니다.
Chrome 설치하기
Selenium 시작하기¶
Selenium을 사용하기 위해 우선 Selenium을 불러와봅시다.
# selenium으로부터 webdriver 모듈을 불러옵니다.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
불러온 모듈 webdriver에서 Chrome() 객체를 생성합니다.
# 크롬 브라우저를 켜는 명령이라고 생각하자
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
갑자기 크롬이 실행된다구요? 정상입니다. 저희는 위 명령을 통해 웹 브라우저를 실행하고 파이썬과 연동할 수 있습니다.
여기서 그치지 않고, 저희는 이제 요청을 보내보도록 하겠습니다.
.get(url)
을 활용해 요청을 보낼 수 있습니다.
# http://www.example.com 으로 요청을 보내봅시다.
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("http://www.example.com")
요청이 잘 보내지시나요? :)
응답을 받은 후, page_source
속성을 통해 Response의 HTML 문서를 확인할 수 있습니다.
# page_source 속성을 확인해봅시다.
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("http://www.example.com")
print(driver.page_source)
<html><head> <title>Example Domain</title> <meta charset="utf-8"> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <style type="text/css"> body { background-color: #f0f0f2; margin: 0; padding: 0; font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } div { width: 600px; margin: 5em auto; padding: 2em; background-color: #fdfdff; border-radius: 0.5em; box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02); } a:link, a:visited { color: #38488f; text-decoration: none; } @media (max-width: 700px) { div { margin: 0 auto; width: auto; } } </style> </head> <body> <div> <h1>Example Domain</h1> <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p> <p><a href="https://www.iana.org/domains/example">More information...</a></p> </div> </body></html>
그런데, 프로그램들을 실행하다보면 Chrome 창이 계속 켜져있게 됩니다. 이는 저희가 해당 창을 끄라고 명령을 내린 적이 없기 때문이죠!
with-as
구문을 통해 주어진 명령이 끝나면 driver를 종료하도록 설정할 수 있습니다.
# with-as를 사용해서 위 코드를 다시 적어봅시다.
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("http://www.example.com")
print(driver.page_source)
<html><head> <title>Example Domain</title> <meta charset="utf-8"> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <style type="text/css"> body { background-color: #f0f0f2; margin: 0; padding: 0; font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } div { width: 600px; margin: 5em auto; padding: 2em; background-color: #fdfdff; border-radius: 0.5em; box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02); } a:link, a:visited { color: #38488f; text-decoration: none; } @media (max-width: 700px) { div { margin: 0 auto; width: auto; } } </style> </head> <body> <div> <h1>Example Domain</h1> <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p> <p><a href="https://www.iana.org/domains/example">More information...</a></p> </div> </body></html>
주어진 명령을 실행하고 잘 종료되는 것을 확인할 수 있습니다.
Driver에서 특정 요소 추출하기¶
selenium은 받아온 응답으로부터 특정 요소를 추출할 수도 있습니다.
이미 브라우저를 활용하기 때문이죠!
응답을 가지고 있는 driver/요소에 대해서 다음과 같은 메서드를 적용할 수 있습니다.
요소 하나 찾기
.find_element(by, target)
by
: 대상을 찾는 기준 :ID
,TAG_NAME
,CLASS_NAME
, ...target
: 대상의 속성
요소 여러개 찾기
.find_elements(by, target)
by
: 대상을 찾는 기준 :ID
,TAG_NAME
,CLASS_NAME
, ...target
: 대상의 속성
# By를 import해봅시다.
from selenium.webdriver.common.by import By
# p 태그에 해당하는 요소 하나를 찾아봅시다.
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("http://www.example.com")
print(driver.find_element(By.TAG_NAME, "p").text)
This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.
# p 태그에 해당하는 요소 여러개를 찾아봅시다.
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("http://www.example.com")
for element in driver.find_elements(By.TAG_NAME, "p"):
print("Text:", element.text)
Text: This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission. Text: More information...