Guidelines

Selenium으둜 λ―Έκ΅­ μ£Όκ°€ μ§€μˆ˜ ν¬λ‘€λ§ν•˜κΈ°

이번 μˆ˜μ—…μ—μ„œλŠ” μ§€κΈˆκΉŒμ§€ 배운 Selenium 지식을 ν™œμš©ν•΄ 싀무 μˆ˜μ€€μ˜ μ›Ή 크둀링을 μ‹€μŠ΅ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

μ‹€μŠ΅ ν™”λ©΄μ˜ μ½”λ“œλŠ” Selenium을 μ‚¬μš©ν•˜μ—¬ Yahoo Finance μ›Ήμ‚¬μ΄νŠΈμ—μ„œ Americas μ„Ήμ…˜μ˜ ν…Œμ΄λΈ” 데이터λ₯Ό μΆ”μΆœν•˜κ³ , κ·Έ 데이터λ₯Ό pandas 라이브러리λ₯Ό μ΄μš©ν•΄ μ •λ¦¬ν•˜μ—¬ 좜λ ₯ν•˜λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€.

μ°Έκ³  : μ›Ή 크둀링은 μ›Ήμ‚¬μ΄νŠΈμ˜ HTML, CSS ꡬ쑰가 λ°”λ€Œλ©΄ μ½”λ“œκ°€ λ™μž‘ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. μ›Ήμ‚¬μ΄νŠΈμ˜ ꡬ쑰가 λ³€κ²½λ˜λ©΄ μ½”λ“œλ₯Ό 이에 맞게 μˆ˜μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ½”λ“œλ₯Ό λ‹¨κ³„λ³„λ‘œ μ°¨κ·Όμ°¨κ·Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.


1. ν•„μˆ˜ 라이브러리 μž„ν¬νŠΈ

라이브러리 뢈러였기
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pandas as pd import time
  • selenium : μ›Ή μžλ™ν™” 및 μŠ€ν¬λž˜ν•‘μ„ μœ„ν•œ λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€. μ›Ή νŽ˜μ΄μ§€μ—μ„œ μš”μ†Œλ₯Ό μ°Ύκ³  μƒν˜Έμž‘μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • pandas : 데이터λ₯Ό ν‘œ ν˜•μ‹μœΌλ‘œ λ‹€λ£° 수 μžˆλŠ” 라이브러리둜, μ—‘μ…€κ³Ό λΉ„μŠ·ν•œ λ°©μ‹μœΌλ‘œ 데이터λ₯Ό 뢄석할 λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

  • time : μ‹œκ°„ κ΄€λ ¨ ν•¨μˆ˜λ₯Ό μ œκ³΅ν•˜λŠ” 파이썬 λ‚΄μž₯ λͺ¨λ“ˆμž…λ‹ˆλ‹€.


2. μ›Ήλ“œλΌμ΄λ²„ μ‹€ν–‰ 및 μ›Ήμ‚¬μ΄νŠΈ 이동

Selenium μ›Ήλ“œλΌμ΄λ²„ μ‹€ν–‰ 및 μ›Ήμ‚¬μ΄νŠΈ 이동
driver = webdriver.Chrome() driver.get('https://finance.yahoo.com/markets/')
  • webdriver.Chrome() : 크둬 λΈŒλΌμš°μ €λ₯Ό μžλ™μœΌλ‘œ μ œμ–΄ν•˜κΈ° μœ„ν•΄ Chrome μ›Ήλ“œλΌμ΄λ²„λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. λ“œλΌμ΄λ²„λ₯Ό μ‚¬μš©ν•΄ μ›Ή λΈŒλΌμš°μ € 창을 μ—½λ‹ˆλ‹€.

  • driver.get(URL) : 주어진 URL둜 μ΄λ™ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” Yahoo Finance의 'Markets' νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•©λ‹ˆλ‹€.


3. νŽ˜μ΄μ§€ λ‘œλ”© λŒ€κΈ°

νŽ˜μ΄μ§€ 10초 λŒ€κΈ°
wait = WebDriverWait(driver, 10)
  • WebDriverWait(driver, 10) : μ΅œλŒ€ 10초 λ™μ•ˆ μš”μ†Œκ°€ λ‚˜νƒ€λ‚  λ•ŒκΉŒμ§€ λŒ€κΈ°ν•©λ‹ˆλ‹€. νŽ˜μ΄μ§€κ°€ λ‹€ λ‘œλ“œλ˜κΈ° 전에 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ, νŠΉμ • μš”μ†Œκ°€ λ‚˜νƒ€λ‚  λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦½λ‹ˆλ‹€.

4. 'Americas' μ„Ήμ…˜ μ°ΎκΈ°

νŠΉμ • μ„Ήμ…˜ μ°ΎκΈ°
americas_section = wait.until(EC.presence_of_element_located((By.XPATH, "//h3[text()='Americas']")))
  • wait.until() : 'Americas'λΌλŠ” ν…μŠ€νŠΈλ₯Ό 가진 h3 νƒœκ·Έκ°€ νŽ˜μ΄μ§€μ— λ‚˜νƒ€λ‚  λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦½λ‹ˆλ‹€. EC.presence_of_element_located()λŠ” ν•΄λ‹Ή μš”μ†Œκ°€ νŽ˜μ΄μ§€μ— λ‚˜νƒ€λ‚˜λŠ”μ§€ ν™•μΈν•˜λŠ” μ‘°κ±΄μž…λ‹ˆλ‹€.

5. 슀크둀 이동 및 μ„Ήμ…˜ λ‚΄λΆ€ ν…Œμ΄λΈ” μ°ΎκΈ°

νŠΉμ • μ„Ήμ…˜μ˜ ν…Œμ΄λΈ” μ°ΎκΈ°
actions = ActionChains(driver) actions.move_to_element(americas_section).perform() parent_section = americas_section.find_element(By.XPATH, "./ancestor::section[contains(@data-testid, 'world-indices')]") table = parent_section.find_element(By.XPATH, ".//table")
  • ActionChains(driver) : νŽ˜μ΄μ§€μ—μ„œ 마우슀λ₯Ό μ›€μ§μ΄κ±°λ‚˜ ν΄λ¦­ν•˜λŠ” λ™μž‘μ„ μžλ™ν™”ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” 'Americas' μ„Ήμ…˜μœΌλ‘œ μŠ€ν¬λ‘€μ„ μ΄λ™ν•©λ‹ˆλ‹€.

  • find_element(By.XPATH) : 'Americas' μ„Ήμ…˜μ˜ λΆ€λͺ¨ μš”μ†ŒμΈ section νƒœκ·Έ μ•ˆμ—μ„œ ν…Œμ΄λΈ”μ„ μ°ΎμŠ΅λ‹ˆλ‹€.


6. ν…Œμ΄λΈ” 데이터 μΆ”μΆœ

ν…Œμ΄λΈ” λ‚΄ 데이터 μΆ”μΆœν•˜κΈ°
headers = [header.text for header in table.find_elements(By.XPATH, ".//th")] rows = table.find_elements(By.XPATH, ".//tbody/tr")
  • table.find_elements(): ν…Œμ΄λΈ”μ˜ 헀더와 각 ν–‰μ˜ 데이터λ₯Ό μΆ”μΆœν•©λ‹ˆλ‹€.

    • th : ν…Œμ΄λΈ”μ˜ 헀더 정보λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

    • tr : ν…Œμ΄λΈ”μ˜ 행을 μ˜λ―Έν•©λ‹ˆλ‹€.


7. 데이터λ₯Ό 리슀트둜 μ €μž₯

ν…Œμ΄λΈ” λ‚΄ 데이터λ₯Ό λ”•μ…”λ„ˆλ¦¬λ‘œ μ €μž₯
table_data = [] for row in rows: columns = row.find_elements(By.XPATH, ".//td") row_data = {} for i in range(len(headers)): header = headers[i] column_value = columns[i].text row_data[header] = column_value table_data.append(row_data)
  • 각 ν–‰(tr)의 μ—΄ 데이터(td)λ₯Ό μΆ”μΆœν•œ ν›„, 헀더와 μΌμΉ˜ν•˜λŠ” 값듀을 λ”•μ…”λ„ˆλ¦¬λ‘œ μ €μž₯ν•©λ‹ˆλ‹€. μ΅œμ’…μ μœΌλ‘œ λ”•μ…”λ„ˆλ¦¬λ₯Ό λ¦¬μŠ€νŠΈμ— μΆ”κ°€ν•©λ‹ˆλ‹€.

8. 데이터λ₯Ό νŒλ‹€μŠ€ λ°μ΄ν„°ν”„λ ˆμž„μœΌλ‘œ λ³€ν™˜ 및 좜λ ₯

λ°μ΄ν„°ν”„λ ˆμž„μœΌλ‘œ λ³€ν™˜ 및 좜λ ₯
df = pd.DataFrame(table_data) df_filtered = df[['Symbol', 'Price']] print(df_filtered)
  • pd.DataFrame(): μΆ”μΆœλœ 데이터λ₯Ό νŒλ‹€μŠ€ λ°μ΄ν„°ν”„λ ˆμž„μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.

  • df[['Symbol', 'Price']]: Nameκ³Ό Price 컬럼만 ν•„ν„°λ§ν•˜μ—¬ μ •λ¦¬λœ 데이터λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.


9. λΈŒλΌμš°μ € μ’…λ£Œ

λΈŒλΌμš°μ € μ’…λ£Œ
driver.quit()
  • driver.quit(): λͺ¨λ“  μž‘μ—…μ΄ λλ‚œ ν›„ λΈŒλΌμš°μ €λ₯Ό λ‹«μ•„ λ¦¬μ†ŒμŠ€λ₯Ό ν•΄μ œν•©λ‹ˆλ‹€.
Mission
0 / 1

Run the code and check the results.

Guidelines

AI Tutor

Publish

Design

Upload

Notes

Favorites

Help

Code Editor

Run
Generate

Execution Result