1. ์ฑ๋ฅ ๋ถ์
์ ์ต์ ํ๊ฐ ํ์ํ ๊น?
๊ฐ๋ ฅํ ์๋์ฐจ๊ฐ ์๋ค๊ณ ์์ํด๋ด. 3์ด ๋ง์ ์์ 100km๊น์ง ๊ฐ์ํ ์ ์์ง๋ง, ์ฐ๋ฃ๋ฅผ ๊ณ ๋๊ฐ ํ๋ํฌํค์ ๋จน๋ ๊ฒ์ฒ๋ผ ์๋ชจํ๋ค๋ฉด? ๋น์ ์ ์คํฌ๋ฆฝํธ๊ฐ ๋งค์ฐ ๋น ๋ฅด๋๋ผ๋, ์์๊ณผ ์คํ ์๊ฐ ๋ฉด์์ ๋๋ฌด "ํ์์ "์ผ ์ ์์ด. ๋ ๋์๊ฐ, ์์ "๋์"๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ถ์์ ํ๊ฒ ๋ง๋ค์ด ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ ์์ด. ์ต์ ํ๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ ์ค.
๋จผ์ , ์ธ๊ณผ ์์ฌ๊ฐ ๋งํ๋ฏ์ด "์ ๊ฐ"๋ฅผ ํด๋ณด์. ์คํฌ๋ฆฝํธ์ ์ฑ๋ฅ์ ๋ถ์ํด์ ์ด๋์์ "๊ณ ํต๋ฐ๊ณ " ์๋์ง ํ์ ํด ๋ณด์.
์คํฌ๋ฆฝํธ ์๋์ ์์ ์ฑ์ ํ ์คํธํ๋ ๋ฐฉ๋ฒ
๋ถ์์ ๊ฐ๋จํ ๋ฐฉ๋ฒ ์ค ํ๋๋ time
๊ฐ์ Python ๊ธฐ๋ณธ ๋ชจ๋์ ์ฌ์ฉํ๋ ๊ฑฐ์ผ. ์คํฌ๋ฆฝํธ์ ๋ช ์ค ์ถ๊ฐํด์ ์ด๋ค ์์
์ด ๊ฐ์ฅ ์ค๋ ๊ฑธ๋ฆฌ๋์ง ํ์
ํด ๋ณด์.
import time
start_time = time.time()
# ์ฌ๊ธฐ์์ Selenium์ ์ฌ์ฉํ์ฌ ์์
์ ์ํํ๋ ์ฝ๋๋ฅผ ์์ฑํ์ธ์
end_time = time.time()
print(f"์ํ ์๊ฐ: {end_time - start_time} ์ด")
์ด ๊ฐ๋จํ ์ฝ๋ ์กฐ๊ฐ์ ์ฝ๋ ์ผ๋ถ๋ฅผ ์คํํ๋ ๋ฐ ์ผ๋ง๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋์ง ์๋ ค์ค ๊ฑฐ์ผ. ์ด๋ ๊ฒ "ํ์ด๋จธ"๋ฅผ ์ฌ์ฉํ๋ฉด "์ข์ ๋ถ๋ถ"์ ์ฐพ์๋ผ ์ ์์ด.
์ทจ์ฝํ ๋ถ๋ถ์ ํ์ธํ๊ณ ์ต์ ํํ๊ธฐ
์๊ฐ์ ๋ง์ด ์ก์๋จน๋ ์ฝ๋ ๋ถ๋ถ์ ์ฐพ์์ผ๋ฉด, ์กฐ์น๋ฅผ ์ทจํด ๋ณด์. ์๋ฅผ ๋ค์ด, ๋ถํ์ํ๊ฒ ๋์ ์์์ ๋๋ฌด ์์ฃผ ์ ๊ทผํ๊ฑฐ๋ ์ฝ๋๊ฐ "์คํ๊ฒํฐ"์ฒ๋ผ ๋์ด ์์ ์ ์์ด. ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ํ์ธ์ด๊ณ , ๋ ๋ฒ์งธ ๋จ๊ณ๋ ํ๋์ด์ผ.
์์ฒญ ์ ์ค์ด๊ธฐ: ํ์ด์ง ๊ฐ ์ด๋์ด๋ DOM ๊ฐฑ์ ์ ๋๋ฌด ์์ฃผ ํ๋์ง ํ์ธํด ๋ด. ์๋ฅผ ๋ค์ด, WebDriverWait
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ๋ ์์๊ฐ ์์ ํ ๋ก๋๋ ํ์๋ง ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์์ด.
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'myDynamicElement'))
)
๋ฐ์ดํฐ ์บ์ฑ: ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์บ์ฑ์ ๊ณ ๋ คํด ๋ด. ๋ฐ์ดํฐ๋ฅผ ๋ณ์๋ ์บ์์ ์ ์ฅํด์ ์์์ ๋ง์ด ์ฌ์ฉํ๋ ์์ ์ ์ต์ํํ ์ ์์ด.
2. ์คํฌ๋ฆฝํธ ๊ตฌ์กฐ ๊ฐ์
์ฝ๋๊ฐ ์งํ์ฒ ๋ ธ์ ๋์ฒ๋ผ ์ฝํ๋ค๋ฉด, ์ด์ ๊ฐ์ ํ ๋๊ฐ ๋ ๊ฑฐ์ผ. ์ต์ ํ๋ ์ฝ๋ ๊ตฌ์กฐ๋ ๊ฐ๋ ์ฑ๊ณผ ์ค๋ฅ ๋ด์ฑ์ ๋์ด๋ ํต์ฌ์ด์ผ.
๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ๋ฐ ์ต์ ์๊ณ ๋ฆฌ์ฆ ์๋ฃจ์ ์ฌ์ฉ
์ฝ๋๋ฅผ ๊ฐ ํจ์๋ ๋ชจ๋์ด ๊ฐ์์ ๋ ผ๋ฆฌ์ ์์ ์ ๋ด๋นํ๋ ํ์ดํ๋ผ์ธ ํํ๋ก ๊ตฌ์กฐํํ๋ ๊ฑธ ๊ณ ๋ฏผํด ๋ด. ์ฝ๋๋ฅผ ๋ ผ๋ฆฌ์ ์ธ ๋ธ๋ก์ผ๋ก ๋๋๋ฉด ๊ฐ๋ ์ฑ์ด ์ข์์ง๊ณ ๋๋ฒ๊น ๋ ์ฌ์์ ธ.
def load_page(url):
driver.get(url)
def extract_data():
# ๋ฐ์ดํฐ ์ถ์ถ ์ฝ๋
pass
def save_data():
# ๋ฐ์ดํฐ ์ ์ฅ ์ฝ๋
pass
load_page("http://example.com")
extract_data()
save_data()
์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ํ ์คํธ ์ฉ์ด์ฑ ๊ฐ์
"ํ๋์ ํจ์๋ ํ๋์ ์์ ์ ํ๋ค"๋ ์์น์ ๋ฐ๋ฅด์. ์ด๋ ๊ฒ ํ๋ฉด ํ ์คํธ์ ๋ฆฌํฉํ ๋ง์ด ์ฌ์์ ธ. "๋งค์ง ๋๋ฒ"๋ ๋ฌธ์์ด ๋์ ๋ช ๋ช ๋ ์์๋ฅผ ์ฌ์ฉํด ๋ ๋ช ํํ๊ฒ ํ์.
MAX_RETRIES = 5
def fetch_data_with_retry():
for attempt in range(MAX_RETRIES):
try:
# ๋ฐ์ดํฐ ์์ฒญ ์๋
pass
except Exception as e:
print(f"์๋ {attempt+1} ์คํจ: {e}")
3. ๊ฐ์ ํ ์ ์๋ ์ฝ๋๋ผ๋ฉด ๋ฐ๋์ ๊ฐ์ ํ์
์์์ ๋๊ธฐ ๋์ ๋ช ์์ ๋๊ธฐ ์ฌ์ฉ
๋ช
์์ ๋๊ธฐ๋ Selenium์ด ์ํ๋ ์์๊ฐ ๋ํ๋ ๋๋ง ์์
์ ์ํํ๋๋ก ์ ํํ ์ ์ด๋ฅผ ํ์ฉํด ์ค. ์์์ ๋๊ธฐ (implicitly_wait
) ๋์ , ํน์ ์์๋ฅผ ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ธฐ๋ค๋ฆด ์ ์๋ WebDriverWait
๋ฅผ ์ฌ์ฉํด ๋ด.
๋ช ์์ ๋๊ธฐ ์ฌ์ฉ ์์
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, "target_element"))
)
ํ์ด์ง ์ค๋น ์ํ ํ์ธ
ํ์ด์ง๊ฐ ๋ก๋๋ ํ์๋ ๋ชจ๋ ์์๊ฐ ์ฆ์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ์๋์ผ, ํนํ AJAX๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ. document.readyState
๋ฅผ ์ฌ์ฉํด ๋ฌธ์๊ฐ ์์ ํ ๋ก๋๋์๋์ง ํ์ธํ๊ณ ์์
์ ์์ํ์.
ํ์ด์ง ๋ก๋ ์๋ฃ ํ์ธ ์์
def wait_for_page_load(driver):
WebDriverWait(driver, 10).until(
lambda d: d.execute_script("return document.readyState") == "complete"
)
time.sleep
์ฌ์ฉ ์ต์ํ
time.sleep()
๋ ์คํฌ๋ฆฝํธ๋ฅผ ๊ณ ์ ๋ ์๊ฐ ๋์ ๊ธฐ๋ค๋ฆฌ๊ฒ ํด์ ์์
์๋๋ฅผ ๋ฆ์ถฐ. ๋์ , WebDriverWait
๋ฅผ ์ฌ์ฉํด์ ํ์ํ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋๋ก ํ์.
GO TO FULL VERSION