
selenium์ Python์ ์ด์ฉํด์ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์กฐ์ํ ์ ์๋ ์๋ํ ํ๋ ์์ํฌ์ ๋๋ค.
Web Driver
์น ๋ธ๋ผ์ฐ์ ์ ์ฐ๋์ ์ํด์๋ WebDriver๊ฐ ํ์ํฉ๋๋ค.
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()))
driver.get("URL์ฃผ์") #์ํ๋ URL์ฃผ์๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ํฌ๋กฌ ์ฐฝ์ด ๊ณ์ ์ผ์ ธ์๊ฒ ๋๋๋ฐ with-as๊ตฌ๋ฌธ์ผ๋ก ๋ช ๋ น์ด ๋๋๋ฉด driver์ ์ข ๋ฃํ๋๋ก ๋ช ๋ นํ ์ ์์ต๋๋ค.
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("http://www.example.com")
print(driver.page_source())\
์๋ต์ ๊ฐ์ง๊ณ ์๋ driver/์์์ ๋ํด์ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
์์ ํ๋ ์ฐพ๊ธฐ
.find_element(by, target)
by : ๋์์ ์ฐพ๋ ๊ธฐ์ค : ID, TAG_NAME, CLASS_NAME, ...
target : ๋์์ ์์ฑ
์์ ์ฌ๋ฌ๊ฐ ์ฐพ๊ธฐ
.find_elements(by, target)
by : ๋์์ ์ฐพ๋ ๊ธฐ์ค : ID, TAG_NAME, CLASS_NAME, ...
target : ๋์์ ์์ฑ
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("http://www.example.com")
print(driver.find_elements(By.TAG_NAME, "p").text)
Selenium์ ๋์ ์น ์ฌ์ดํธ์ ๋ํ ์ง์์ ์งํํ๊ธฐ ์ํด ๋ช ์์ ๊ธฐ๋ค๋ฆผ(Explicit Wait) ๊ณผ ์๋ฌต์ ๊ธฐ๋ค๋ฆผ(Implicit Wait) ์ ์ง์ํฉ๋๋ค.
Explicit Wait: ๋ค ๋ก๋ฉ์ด ๋ ๋๊น์ง ์ง์ ํ ์๊ฐ ๋์ ๊ธฐ๋ค๋ฆผ (e.g. ๋ค ๋ก๋ฉ์ด ๋ ๋๊น์ง 5์ด๋์ ๊ธฐ๋ค๋ ค!)
Implicit Wait: ํน์ ์์์ ๋ํ ์ ์ฝ์ ํตํ ๊ธฐ๋ค๋ฆผ (e.g. ์ด ํ๊ทธ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ ๋๊น์ง ๊ธฐ๋ค๋ ค!)
๐กXPath?
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("https://indistreet.com/live?sortOption=startDate%3AASC")
driver.implicitly_wait(10)
print(driver.find_element(By.XPATH,'//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[3]/div/a/div[2]/p[1]').text)
find_element๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ ธ์ค๋ ค๋ ๋ฐ์ดํฐ์ XPATH๋ฅผ ์ธ์๋ก ๋ฃ์ผ๋ฉด ์ถ์ถํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๊ฐ์ ธ์ค๋ ค๋ ์น ํ์ด์ง๊ฐ ๋์ ํ์ด์ง์ด๊ธฐ ๋๋ฌธ์ 10์ด๋์ Implicit Wait์ ์งํํ๋๋ก ํด์ ์คํฌ๋ํ์ด ์ ์ด๋ฃจ์ด์ง๋๋ก ํด์ค๋๋ค.
from selenium.webdriver.support import expected_conditions as EC
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("https://indistreet.com/live?sortOption=startDate%3AASC")
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[3]/div/a/div[2]/p[1]')))
print(element.text)
๋ง์ฐฌ๊ฐ์ง๋ก EC.presence_of_element_located()๋ฅผ ํ์ฉํ์ฌ ๋์ ์นํ์ด์ง ์คํฌ๋ํ์ด ์ด๋ฃจ์ด ์ง๋๋ก ํฉ๋๋ค.
๐กSelenium์ ์ด์ฉํด์ ๋ง์ฐ์ค Event๋ฅผ ๋์ํ ์ ์์ต๋๋ค.
์น ํ์ด์ง์์ ์ผ์ด๋๋ ์ผ๋ค์ Event๋ผ๊ณ ํฉ๋๋ค.
๋ง์ฐ์ค๋ก ์ผ์ด๋ ์ ์๋ ๋ํ์ ์ธ ์ด๋ฒคํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ง์ฐ์ค ์์ง์ด๊ธฐ(move)
๋ง์ฐ์ค ๋๋ฅด๊ธฐ(press down)
๋ง์ฐ์ค ๋ผ๊ธฐ(press up)
...
์ ํฌ๋ ๋ฒํผ์ ์ฐพ์ ํ ์ด๋ฅผ ํด๋ฆญํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
๋ง์ฐ์ค ์
๋ ฅ์ ํฌ๊ฒ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
์
๋ ฅํ๊ณ ์ ํ๋ ๋์ ์์๋ฅผ ์ฐพ์ต๋๋ค. (find_element() ์ด์ฉ)
์
๋ ฅํ๊ณ ์ ํ๋ ๋ด์ฉ์ click์ ํตํด ์ ๋ฌํฉ๋๋ค.
.perform()์ ํตํด ๋์ํฉ๋๋ค.
button = driver.find_element(By.XPATH, '//*[@id="main-app-gnb-header"]/div/div/div[1]/div/div[2]/div/div/div[1]/span[1]/a[1]')
ActionChains(driver).click(button).perform
driver๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ง์ฐ์ค๋ฅผ ํด๋ฆญํ๊ฒ ํฉ๋๋ค.
๐กSelenium์ ์ด์ฉํด์ ํค๋ณด๋ Event๋ฅผ ๋์ํ ์ ์์ต๋๋ค.
์น ํ์ด์ง์์ ์ผ์ด๋๋ ์ผ๋ค์ Event๋ผ๊ณ ํฉ๋๋ค.
ํค๋ณด๋๋ก ์ผ์ด๋ ์ ์๋ ๋ํ์ ์ธ ์ด๋ฒคํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํค๋ณด๋ ๋๋ฅด๊ธฐ(press down)
ํค๋ณด๋ ๋ผ๊ธฐ(press up)
...
์ ํฌ๋ ์
๋ ฅ์ฐฝ(input ํ๊ทธ์ form)์ ํค๋ณด๋ ์
๋ ฅ์ ์งํํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
ํค๋ณด๋ ์
๋ ฅ์ ํฌ๊ฒ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
์
๋ ฅํ๊ณ ์ ํ๋ ๋์ ์์๋ฅผ ์ฐพ์ต๋๋ค. (find_element() ์ด์ฉ)
์
๋ ฅํ๊ณ ์ ํ๋ ๋ด์ฉ์ send_keys_to_element๋ฅผ ํตํด ์ ๋ฌํฉ๋๋ค.
.perform()์ ํตํด ๋์ํฉ๋๋ค.
์๋ ์์๋ id๊ฐ textInput์ธ ์์์ "abc"๋ฅผ ์ ๋ ฅํ๋ ์์ ์ ๋๋ค.
text_input = driver.find_element(By.ID, "textInput")
ActionChains(driver).send_keys_to_element(text_input, "abc").perform()
๐กselenium์ ์ด์ฉํ์ฌ ๋์ ์ธ ์นํ์ด์ง๋ฅผ ์คํฌ๋ํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ๋ค.