์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Airflow
- Spark Partitioning
- off heap memory
- Spark SQL
- ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ
- ๋น ๋ฐ์ดํฐ
- topic
- colab
- backfill
- Docker
- AQE
- Dag
- Spark
- redshift
- mysql
- k8s
- etl
- DataFrame Hint
- disk spill
- spark executor memory
- Kubernetes
- Spark ์ค์ต
- CI/CD
- Kafka
- SQL
- aws
- KDT_TIL
- Salting
- Speculative Execution
- Spark Caching
- Today
- Total
JUST DO IT!
[TIL]KDT_20230420 ๋ณธ๋ฌธ
๐ KDT WEEK 3 DAY 4 TIL
- Selenium
- ์์ ์ฐพ๊ธฐ
- wait and call
์์ํ๊ธฐ ์ ์, ์ด ๊ณผ์ ์๋ ๋ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํ๋ค.
์คํ๋์ง ์๋๋ค๋ฉด, ํญ์ --upgrade๋ฅผ ํตํด ์ต์ ๋ฒ์ ์ด ๋์ด์๋์ง ํ์ธํด๋ณด์!
๐ฅ Selenium
Python์ ์ด์ฉํด์ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์กฐ์ํ ์ ์๋ ์๋ํ ํ๋ ์์ํฌ
# Selenium๊ณผ ํฌ๋กฌ ์น ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํ๋ค.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
#ํ์ด์ฌ์์ ํฌ๋กฌ์ ์คํ์ํฌ ์ ์๋ค.
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
#์คํ์ํจ ํฌ๋กฌ์์ ํด๋น ์ฌ์ดํธ๋ก ์ด๋(Request)
driver.get("https://www.example.com")
print(driver.page_source)
์ด๋ ๊ฒ ์คํํด๋ณด๋ฉด, ์๋์ผ๋ก ํฌ๋กฌ ์ฐฝ์ด ์ด๋ฆฌ๊ณ ์ ๋ ฅํ URL(example.net)์ ์ ์ํ๊ฒ ๋๋ค.
ํ์ง๋ง ์คํ์ด ๋๋ ๋ค์๋ ํฌ๋กฌ ์ฐฝ์ด ๊บผ์ง์ง ์๊ณ ์ ์ง๋๋๊ฑธ ์ ์ ์๋ค.
์ผ์ ํ ์ผ์ ์ํํ ๋ค ์๋์ผ๋ก ์คํ์ ๋๋ ์ฝ๋..
ํ์ด์ฌ์๋ ๋น์ทํ ๊ธฐ๋ฅ์ ํ๋ ๊ฐ๋ ฅํ ๊ตฌ๋ฌธ์ด ์๋ค.
with..as ๊ตฌ๋ฌธ์ ํ์ฉํ๋ค!
์ฌ๊ธฐ์ ํ ๊ฐ์ง๋ฅผ ๋ ์ถ๊ฐํด์ ๊ตฌ๋ฌธ์ ์์ฑํด๋ณด๊ฒ ๋ค.
์ด์ bs4์์ ์์๋ฅผ ์ฐพ๋ ๋ฉ์๋๊ฐ ์๋๊ฒ์ฒ๋ผ, selenium์๋ ์ด ๊ธฐ๋ฅ์ด ์กด์ฌํ๋ค.
.find_element(by, target)
- by : ๋์์ ์ฐพ๋ ๊ธฐ์ค : ID, TAG_NAME, CLASS_NAME ...
- target : ๋์์ ์์ฑ
์ฌ๋ฌ ์์๋ฅผ ์ฐพ๊ณ ์ถ์ ๋๋, .find_elements(by, target)์ ์ฌ์ฉํ๋ค.
from selenium.webdriver.common.by import By
#with..as ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ print(x)๊น์ง ๋์์ด ๋๋๋ฉด, ์๋์ผ๋ก ํฌ๋กฌ์ ์ข
๋ฃ๋๋ค.
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("http://www.example.net")
# p ํ๊ทธ ์์๋ค์ ๋ชจ๋ ๊ฐ์ ธ์์ ํด๋น ์ฝํ
์ธ ๋ฅผ ๋ฆฌ์คํธ ํํ๋ก ์ถ๋ ฅํ๋ค.
pList = [x.text for x in driver.find_elements(By.TAG_NAME, "p")]
for x in pList:
print(x)
XPath
์คํฌ๋ํ์ ํ์ฉํ ์ฌ์ดํธ : https://indistreet.com/live?sortOption=startDate%3AASC
ํญ์ํ๋ ๊ฒ์ฒ๋ผ, ํ์ํ ์์๊ฐ ์ด๋์๋์ง ์ฐพ์๋ณด์..
์์ฆ ์น์ฌ์ดํธ์ ํธ๋ ๋๊ฐ ์ฌ์ด ์คํฌ๋ํ์ ๋ง๊ธฐ ์ํด ์ด๋ฌํ ํด๋์ค ์ด๋ฆ์ ์ฌ์ฉํ๋ค๊ณ ํ๋ค..
๋ฐ๋ผ์ ํด๋์ค์ ์ด๋ฆ์ด ์๋, XPath๋ฅผ ์ฌ์ฉํ๋ค.
๊ฐ ๋ณต์ฌ๋ฌ์์ ์ ์์๋ค.
์ด XPath๋ฅผ find_element ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ธ์ค๋ ค๊ณ ํ๋ฉด..
์ด์ ๋ ์์ฒญ์ ๋ณด๋ธ ์ฌ์ดํธ๊ฐ ๋์ ์น ์ฌ์ดํธ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ดํธ๊ฐ ์จ์ ํ ๋ก๋ฉํ๋ ๋ฐ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ selenium์ wait๋ฅผ ํ์ฉํ๋ค.
Implicit Wait
.implicitly_wait(์๊ฐ) : '์ด' ๋จ์์ ์ซ์๋ฅผ ์ ๋ ฅ๋ฐ์ ํด๋น ์๊ฐ๋งํผ ๊ธฐ๋ค๋ฆฌ๋๋ก ํ๋ค.
๋จ, ๊ทธ ์๊ฐ์ ๋ชจ๋ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ ๋ก๋ฉ์ด ๋๋ฉด ๋์ด๊ฐ๋ค!
Explicit Wait
์ด๊ฑด ์ฝ๋๋ฅผ ๋จผ์ ๋ณด๊ณ ์ค๋ช ํ๊ฒ ๋ค.
#Explicit wait์ ์ฌ์ฉ๋จ
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
with webdriver.Chrome(service= Service(ChromeDriverManager().install())) as driver:
driver.get("https://indistreet.com/live?sortOption=startDate%3AASC")
#Explicit wait
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[1]/div/a/div[2]/p[1]')))
print(element.text)
๋จผ์ , Explicit Wait์ WebDriverWait() ๋ฉ์๋๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋ค.
WebDriverWait(driver, 10)์ implicit wait์ฒ๋ผ 10์ด์ ํ๊ณ ์๊ฐ์ ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ Explicit Wait์ ์ญํ ์ ํด์ค ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
- until() : ์ด๋ ํ ์ธ์์ ์กฐ๊ฑด์ด ๋ง์กฑ๋ ๋๊น์ง
- until_not() : ์ด๋ ํ ์ธ์์ ์กฐ๊ฑด์ด ๋ง์กฑ๋์ง ์์ ๋๊น์ง
์ฌ์ฉ ์๋ฅผ ๋ณด๋ฉด,
์ ๊ฐ์ ํํ๋ก ์ฌ์ฉํ๋ค.
์ฌ๊ธฐ์ EC๋ expected_conditions๋ก, selenium์์ ์ ์๋ ์กฐ๊ฑด์ด๋ค.
"~๊ฐ ์กด์ฌํ๋ฉด" ์ผ๋ก ์ดํดํ๋ฉด ๋๋ค๊ณ ํ๋ค.
๋ฐ๋ผ์, ์ ์ฝ๋๋ "target์ด๋ ID๊ฐ ๋ก๋ฉ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค๋ผ. ๋จ 10์ด๊น์ง๋ง" ์ผ๋ก ์ดํดํ๋ฉด ๋๋ค!
๊ทธ๋์.. ์๊น implicit wait์ ์ฝ๋๋ฅผ explicit 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")
#explicit wait
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[1]/div/a/div[2]/p[1]')))
print(element.text)
์ ๊ฐ์ด ์์ฑํ๋ฉด ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
ํ๋์ ๊ณต์ฐ ์ ๋ชฉ๋ฟ๋ง ์๋๋ผ, ์ฌ๋ฌ๊ฐ์ ์ ๋ชฉ์ ๋ฝ์ผ๋ ค๋ฉด ์ด๋กํ ๊น?
๋ค๋ฅธ ์ ๋ชฉ๋ค์ XPath๋ฅผ ์์๋ณด๋ฉด ๊ฒฐ๊ณผ๋ ์ฝ๋ค.
์ด์ ์ ํด๋ดค๋ ๊ฒ์ฒ๋ผ, for๋ฌธ์ ํ์ฉํ๋ฉด ์ฌ๋ฌ ์ ๋ชฉ๋ค์ ๋ฝ์๋ผ ์ ์์ ๊ฒ์ด๋ค!
๋ง์ฐ์ค ์ด๋ฒคํธ ์ฒ๋ฆฌํ๊ธฐ
๋ค์ด๋ฒ์์ ๋ก๊ทธ์ธ ๋ฒํผ์ ์ฐพ์ class ์ด๋ฆ์ ์ฐพ๊ณ , ๊ทธ ๋ฒํผ์ ํด๋ฆญํ๋ ์ฝ๋์ด๋ค.
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://www.naver.com/")
driver.implicitly_wait(5)
button = driver.find_element(By.CLASS_NAME, "link_login")
ActionChains(driver).click(button).perform() # ๊ทธ ๋ฒํผ์ ๋๋ฌ๋ผ
๊ฐ์ฅ ๋ง์ง๋ง ์ค์ด ๋ง์ฐ์ค ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ด์ฉ์ด๋ค.
ActionChains ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ์ด๋์ ์ด๋ค ๋ฒํผ์ ์ด๋ป๊ฒํ ์ง ์ ํ ์ ์๋ค.
๋๋ธํด๋ฆญ, ํ๋ ๋ฑ ๋ ๋ง์ ๊ธฐ๋ฅ์ https://www.selenium.dev/documentation/webdriver/actions_api/mouse/ ์์ ์ฐพ์ ์ ์๋ค.
ํค๋ณด๋ ์ด๋ฒคํธ ์ฒ๋ฆฌํ๊ธฐ
๋ค์ด๋ฒ์์ ์๋์ผ๋ก ๋ก๊ทธ์ธ ํ๋ฉด์ผ๋ก ๋์ด๊ฐ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๊ณ ๋ก๊ทธ์ธ์ ์๋ํ๋ ์ฝ๋์ด๋ค.
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://www.naver.com/")
driver.implicitly_wait(3)
# ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋์ด๊ฐ๊ธฐ
button = driver.find_element(By.CLASS_NAME, "link_login")
ActionChains(driver).click(button).perform()
time.sleep(1)
# ์์ด๋ ์
๋ ฅ
id_input = driver.find_element(By.ID, "id")
ActionChains(driver).send_keys_to_element(id_input, "idid1234").perform()
time.sleep(1)
# ๋น๋ฐ๋ฒํธ ์
๋ ฅ
pw_input = driver.find_element(By.ID, "pw")
ActionChains(driver).send_keys_to_element(pw_input, "pwpw1234").perform()
time.sleep(1)
#๋ก๊ทธ์ธ ๋ฒํผ ๋๋ฅด๊ธฐ
loginButton = driver.find_element(By.ID, "log.login")
ActionChains(driver).click(loginButton).perform()
๋ง์ฐ์ค ์ด๋ฒคํธ ์ฒ๋ฆฌ์ ์๋ฆฌ๋ ๋น์ทํ๋ค.
๋๊ฐ์ด ActionChains๋ฅผ ์ฌ์ฉํ์ง๋ง, ์ด๋ฒ์ send_keys_to_element ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
send_keys_to_element์ ์ ๋ ฅํ ํ๊ทธ์ ์ ๋ ฅํ ๋ฌธ์๋ฅผ ์ธ์๋ก ์ฃผ๊ณ , perform() ๋ฉ์๋๋ฅผ ๋์ํ๋ฉด ๋๋ค.
ํด๋ฆญ ์ธ์ ๋ค๋ฅธ ๋์์ https://www.selenium.dev/documentation/webdriver/actions_api/keyboard/ ์ฐธ์กฐ!
๋ง์ฐ์ค ํด๋ฆญ๊ณผ ํค๋ณด๋ ์ ๋ ฅ์ ์ ์ดํ ์ ์์ผ๋, ๋ค์ด๋ฒ์์ ๋ก๊ทธ์ธ์ ์๋ํ๋ ์ฝ๋๋ฅผ ์์ฑํ์ง๋ง..
์ด์จ๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ ๋์ํ๋ ๊ฒ๋ ํ์ธํ์ผ๋ ์ฌ๊ธฐ์ ๋ง๋ฌด๋ฆฌ! ๐
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL]KDT_20230424 (0) | 2023.04.24 |
---|---|
[TIL]KDT_20230421 (0) | 2023.04.21 |
[TIL]KDT_20230419 (0) | 2023.04.19 |
[TIL]KDT_20230418 (1) | 2023.04.18 |
[TIL]KDT_20230417 (0) | 2023.04.17 |