0) Selenium ํจํค์ง
์ด์ ๋งํ๋ฏ, BeautifulSoup ํจํค์ง๋ก๋ ๋์ ์ผ๋ก ์์ฑ๋ ์ ๋ณด๋ ๊ฐ์ ธ์ฌ ์ ์์๋ค.
๋์ ์น์ฌ์ดํธ๋ ๋น๋๊ธฐ๋ฐฉ์์ผ๋ก ์๋ํ๋๋ฐ ๋๋๋ง์ด ์๋ฃ๋์์ ๋ ๋ฐ์ดํฐ ๋ก๋ฉ์ด ๊ผญ ์๋ฃ๋๋ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ Selenium ํจํค์ง๋ฅผ ์ฌ์ฉํด์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ค ํ๋ค.
Sellenium ํจํค์ง๋ฅผ ์ด์ฉํ๋ฉด ํ์ด์ฌ์ผ๋ก ๋ค์ ๋ ๊ฐ์ง ๋์์ด ๊ฐ๋ฅํ๋ค.
1. ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋์ ์ผ๋ก ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ์คํฌ๋ํ
2. ์ฌ์ดํธ์ ์ด๋ฒคํธ(๋ง์ฐ์ค ํด๋ฆญ, ํค๋ณด๋ ์ ๋ ฅ ๋ฑ)๋ฅผ ์ฃผ๊ธฐ
์ค์ต์ ํตํด ๋ค์ ๋ ๊ฐ์ง์ ์์ ์ ์ํํด ๋ณด์.
1) ์ํ๋ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
์ค๋๋ ์ ์น ํ์ด์ง๋ ์นํฌ๋กค๋ฌ๋ ๋ค๋ฅธ ์คํฌ๋ํ ์ฌ์ฉ์๋ค์ด ์ฝ๊ฒ ์ ๋ณด๋ฅผ ๊ฐ์ ธ๊ฐ์ง ๋ชปํ๋๋ก ํด๋์ค ์ด๋ฆ์ ๋๋ค ํ๊ฒ ์์ฑํ๋ค.
ex) Class="navbar__ADSXD"
์ด๋ฌํ ๊ฒฝ์ฐ์ "์์น"๋ฅผ ํ์ฉํด ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก XPath๊ฐ ์๋ค.
0. XPath
Xml, HTML ๋ฌธ์์ ํน์ ์์์ ์ ๊ทผํ๊ธฐ ์ํ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ ์ธ์ด
XPath๋ ์กฐ๊ฑด์ ๋ง๋ ๋ชจ๋ ๋ ธ๋๋ฅผ ๊ฐ์ ธ์์ ๋ฐฐ์ด์ ํํ๋ก ์ ์ฅํ๋๋ฐ ์ผ๋ฐ ๋ฐฐ์ด๊ณผ ๋ค๋ฅด๊ฒ ์์์์น๊ฐ 1์ด๋ค.
ex) `//*[@id="__next"]/div/main/div[2]/div/div[4]/p[1]'์ HTML ์์น๋ ๋ค์๊ณผ ๊ฐ๋ค
<div id="__next>
<div ...>
<main ...>
<div id="1">
</div>
<div id="2>
<div ...>
<div id="01">
</div>
<div id="02">
</div>
<div id="03>
</div>
<div id="04">
<p>์ํ๋์ ๋ณด์ฌ๊ธฐ์์ด์</p>
</div>
</div>
</div>
</main>
</div>
</div>
1. ๊ธฐ๋ค๋ฆผ(wait)
์์์ ๋งํ๋ฏ์ด ๋์ ์น ์ฌ์ดํธ๋ ๋ฐ์ดํฐ ๋ก๋ฉ์ด ๋๊ธฐ ์ ์๋ ์น ์ฌ์ดํธ์ ๋ ๋๋ง์ด ์๋ฃ๋๋ค๋ฉด ์ฌ์ฉ์์๊ฒ ํด๋น ํ๋ฉด์ ๋ณด์ฌ์ค ์ ์๋ค. ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์๋ ์น ์ฌ์ดํธ์ ํด๋น ๋ฐ์ดํฐ๊ฐ ๋ก๋ฉ๋์๋์ง ์ฌ๋ถ๋ฅผ ์๋ ๊ฒ์ด ํ์ํ๋ค.
์ด๋ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ธฐ๋ค๋ฆผ์ด๋ค.
๊ธฐ๋ค๋ฆผ์ ์ผ๋ฐ์ ์ผ๋ก time ํจํค์ง์ ํ์ด๋จธ๋ฅผ ์ด์ฉํ ์ ์์ง๋ง ์ด๋ฒ ์๊ฐ์๋ ๋ช ์์ ๊ธฐ๋ค๋ฆผ(Explicit wait)๊ณผ ์๋ฌต์ ๊ธฐ๋ค๋ฆผ(Implicit wait)์ ์ฌ์ฉํด ๋ณด์.
๋ช ์์ ๊ธฐ๋ค๋ฆผ(Explicit wait) : ๋ก๋ฉ์ด ๋ค ๋ ๋๊น์ง ์ง์ ํ ์๊ฐ ๋์ ๊ธฐ๋ค๋ฆผ
์๋ฌต์ ๊ธฐ๋ค๋ฆผ(Implicit wait) : ํน์ ์์์ ์ ์ฝ์ ํตํ ๊ธฐ๋ค๋ฆผ
์ด์ ๋์ ์น ํ์ด์ง์์ ๋ช ์์ ๊ธฐ๋ค๋ฆผ, ์๋ฌต์ ๊ธฐ๋ค๋ฆผ์ ์ด์ฉํด ์ํ๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค์.
2. ๋ช ์์ ๊ธฐ๋ค๋ฆผ์ ์ฌ์ฉํ ์น ์คํฌ๋ํ
๋ก๋ฉ์ด ๋ค ๋ ๋๊น์ง ์ง์ ํ ์๊ฐ ๋์ ๊ธฐ๋ค๋ฆผ
WebDriverWait()
- until() : ์ธ์์ ์กฐ๊ฑด์ด ๋ง์กฑ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผ
- until_not() : ์ธ์์ ์กฐ๊ฑด์ด ๋ง์กฑ๋์ง ์์ ๋๊น์ง ๊ธฐ๋ค๋ฆผ
# ์คํฌ๋ํ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
url="์ํ๋์ฌ์ดํธ์ฃผ์"
# ์์ ์ฌ์ดํธ์ ์์ฒญ์ ์งํํ๊ณ , ์์ ์ฌ์ดํธ์ xpath๊ฒฝ๋ก์์ ์ ๋ชฉ์ ๊ฐ์ ธ์๋ด
์๋ค.
driver=webdriver.Chrome(service=Service(ChromeDriverManager().install()))
xpath='์ํ๋๋ฐ์ดํฐ์XPATH๊ฒฝ๋ก'
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
# Explicit Wait๋ฅผ ํ์ฉํด์ ์คํฌ๋ํ์ด ์ ์ด๋ฃจ์ด์ง๋๋ก ์ฝ๋๋ฅผ ์์ฑํด๋ด
์๋ค.
# 10์ด๋์ Explicit Wait์ ์งํํ๋๋ก ํด์ ์คํฌ๋ํ์ด ์ ์ด๋ฃจ์ด์ง๋๋ก ์์ ํด๋ด
์๋ค.
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get(url)
element=WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, xpath)))
3. ์๋ฌต์ ๊ธฐ๋ค๋ฆผ์ ์ฌ์ฉํ ์น ์คํฌ๋ํ
ํน์ ์์์ ์ ์ฝ์ ํตํ ๊ธฐ๋ค๋ฆผ
implicitly_wait(time)
(ํ๊ณ์๊ฐ ์ ์ด๋ผ๋ฉด) ๋ก๋ฉ์ด ๋ค ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผ
# ์คํฌ๋ํ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
url="์ํ๋์ฌ์ดํธ์ฃผ์"
# ์์ ์ฌ์ดํธ์ ์์ฒญ์ ์งํํ๊ณ , ์์ ์ฌ์ดํธ์ xpath๊ฒฝ๋ก์์ ์ ๋ชฉ์ ๊ฐ์ ธ์๋ด
์๋ค.
driver=webdriver.Chrome(service=Service(ChromeDriverManager().install()))
xpath='์ํ๋๋ฐ์ดํฐ์XPATH๊ฒฝ๋ก'
# 10์ด๋์ Implicit Wait์ ์งํํ๋๋ก ํด์ ์คํฌ๋ํ์ด ์ ์ด๋ฃจ์ด์ง๋๋ก ์์ ํด๋ด
์๋ค.
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get(url)
driver.implicitly_wait(10)
driver.find_element(By.XPATH, xpath).text
2) ํ์ด์ฌ์ผ๋ก ์นํ์ด์ง ์ด๋ฒคํธ ์ฒ๋ฆฌํ๊ธฐ(ํค๋ณด๋, ๋ง์ฐ์ค ์ ๋ ฅ)
์ฌ์ดํธ์ ๋ก๊ทธ์ธ ์ฐฝ์ ์ ์ํ์ฌ ๋ก๊ทธ์ธ์ ์๋์ผ๋ก ํด ๋ณด์.
ํค๋ณด๋์ ๋ง์ฐ์ค ์ ๋ ฅ์ ๊ดํ ์ฌ๋ฌ ํจ์๋ ๋ค์ ์ฌ์ดํธ๋ฅผ ์ฐธ๊ณ ํ์.
Mouse actions
A representation of any pointer device for interacting with a web page.
www.selenium.dev
๋ก๊ทธ์ธ ์์ ์ ๋ง์ฐ์ค, ํค๋ณด๋ ์ ๋ ฅ์ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
1. ๋ง์ฐ์ค ์ ๋ ฅ (๋ก๊ทธ์ธ ๋ฒํผ ํด๋ฆญ). click(๋ก๊ทธ์ธ์์)
- ๋ง์ฐ์ค ์ ๋ ฅ์ ์ํ๋ ์์๋ฅผ ์ฐพ๊ณ
- ์ํ๋ ๋ง์ฐ์ค ์ ๋ ฅ์ ์ํํ๋ค.
2. ํค๋ณด๋ ์ ๋ ฅ (id, password ์ ๋ ฅ). send_keys_to_element(์ ๋ ฅ์์, ๋ฌธ์์ด)
- ํค๋ณด๋ ์ ๋ ฅ์ ์ํ๋ ์์๋ฅผ ์ฐพ๊ณ
- ๋ฌธ์์ด์ ์ ๋ ฅํ๋ค.
3. ๋ง์ฐ์ค ์ ๋ ฅ (ํ์ธ ๋ฒํผ ํด๋ฆญ)
- ๋ง์ฐ์ค ์ ๋ ฅ์ ์ํ๋ ์์๋ฅผ ์ฐพ๊ณ
- ์ํ๋ ๋ง์ฐ์ค ์ ๋ ฅ์ ์ํํ๋ค.
๊ธฐ์กด ์ฝ๋๋ ๊ณ์ ์ค๋ฅ๊ฐ ๋์ ๋ช ์์ ๊ธฐ๋ค๋ฆผ์ ์ด์ฉํด ๋์ ์นํ์ด์ง์ ํน์ฑ์ ๋ฐ์ํ์๋ค.
# ์คํฌ๋ํ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
from selenium import webdriver
from selenium.webdriver import ActionChains
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.actions.action_builder import ActionBuilder
from selenium.webdriver import Keys, ActionChains
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time
driver=webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://hashcode.co.kr")
time.sleep(1)
# "๋ก๊ทธ์ธ" ๋ฒํผ์ ์ฐพ์ ๋๋ฅธ๋ค.
id_input=WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="main-app-account"]/div/div[2]/div/div[2]/div[1]/div/div[2]/div[2]/input')))
ActionChains(driver).send_keys_to_element(id_input, "id๋ฌธ์์ด์
๋ ฅ").perform()
password_input=WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="main-app-account"]/div/div[2]/div/div[2]/div[1]/div/div[2]/div[4]/input')))
ActionChains(driver).send_keys_to_element(password_input, "password๋ฌธ์์ด์
๋ ฅ").perform()
# "๋ก๊ทธ์ธ" ๋ฒํผ์ ๋๋ฌ์ ๋ก๊ทธ์ธ์ ์๋ฃํฉ๋๋ค.
button=WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,'//*[@id="main-app-account"]/div/div[2]/div/div[2]/div[1]/div/div[2]/button')))
ActionChains(driver).click(button).perform()
๋ฐฉ๊ณผ ํ ํ์ต)
์ค๋ ๋ฐฐ์ด ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์๋์ผ๋ก ๋ก๊ทธ์ธ ํ ๋ค, ๋ฐ์ดํฐ ์์ง๋์ด๋ง ๊ฐ์์ ๋์๋ณด๋์ ์ง์ ํ ์ ์๋ ์๋ํ ํ๋ก๊ทธ๋จ์ ์์ฑํด ๋ณด์๋ค. ๊ด๋ จ ๊นํ๋ธ ์ฃผ์-ํ์ผ์ ๋ค์๊ณผ ๊ฐ๋ค