Yahoo Financeμμ μ£Όμ λ°μ΄ν°λ₯Ό μ€μκ°μΌλ‘ μμ§νκΈ°
μμκ°κ° λ³νλ μ£Όμ μμ₯! μ€μκ°μΌλ‘ μ£Όμ λ°μ΄ν°λ₯Ό μμ§ν΄ μ£ΌκΈ°μ μΌλ‘ μ μ₯νκ³ μΆλ€λ©΄ μ΄λ»κ² ν΄μΌ ν κΉμ?
μ΄λ² μμ
μμλ Selenium
μ νμ©νμ¬ Yahoo Financeμμ μ£Όμ λ°μ΄ν°λ₯Ό λμ μΌλ‘ μΆμΆνλ λ°©λ²μ μμλ³΄κ² μ΅λλ€.
λμ λ°μ΄ν° μΆμΆνκΈ°
λμ λ°μ΄ν°λ μΉ νμ΄μ§μ λλ μν μ νλ JavaScript
λ‘ μμ±λλ λ°μ΄ν°λ‘, μ¬μ©μκ° μΉμ¬μ΄νΈμ μ μν νμ μμ±λκ±°λ νΉμ νλμ μ·¨νλ©΄ λ³κ²½λ μ μμ΅λλ€.
μ΄μ κ°μ λμ λ°μ΄ν°λ BeautifulSoup
κ³Ό Requests
λ‘λ κ°μ Έμ¬ μ μμ΅λλ€.
νμ§λ§ Selenium
μ μ¬μ©νλ©΄ μΉ νμ΄μ§μμ JavaScriptλ₯Ό μ€ννκ³ , λμ λ°μ΄ν°λ₯Ό κ°μ Έμ¬ μ μμ΅λλ€.
μ€μ΅ νλ©΄μ μ½λλ₯Ό λ¨κ³λ³λ‘ μ΄ν΄λ³΄κ² μ΅λλ€.
μ€μ΅ μ½λλ΄ μ΄ν΄νκΈ° μ΄λ €μ΄ λΆλΆμ νμ΅ λꡬμ AI νν°
λ₯Ό νμ©ν΄ μ§λ¬Έν΄ 보μΈμ.
1. νμν ν¨ν€μ§ λΆλ¬μ€κΈ°
-
selenium
: μΉ νμ΄μ§μμ λμ μΈ λ°μ΄ν°λ₯Ό κ°μ Έμ΅λλ€. -
pandas
: λ°μ΄ν°λ₯Ό ν ννλ‘ μ 리νκ³ μ²λ¦¬ν©λλ€. -
webdriver
: Seleniumμ μ¬μ©ν΄ μΉ λΈλΌμ°μ λ₯Ό μ μ΄ν©λλ€. -
By
: μΉ νμ΄μ§μμ μμλ₯Ό μ°Ύλ λ°©λ²μ μ§μ ν©λλ€. -
ActionChains
: μΉ νμ΄μ§μμ λ§μ°μ€μ ν€λ³΄λ λμμ μνν©λλ€. -
EC
: μΉ νμ΄μ§μμ μμκ° λνλ λκΉμ§ κΈ°λ€λ¦½λλ€.
2. μΉ λΈλΌμ°μ μ΄κΈ°
# Chrome μΉλλΌμ΄λ²λ₯Ό μ€ννμ¬ λΈλΌμ°μ μ°½ μ΄κΈ° driver = webdriver.Chrome() # Yahoo Financeμ 'Markets' νμ΄μ§λ‘ μ΄λ driver.get('https://finance.yahoo.com/markets/')
ν¬λ‘¬ λΈλΌμ°μ λ₯Ό μ€ννκ³ Yahoo Finance
μ 'Markets' νμ΄μ§λ‘ μ΄λν©λλ€.
μ°Έκ³ λ‘ Seleniumμ ν¬λ‘¬, νμ΄μ΄νμ€ λ± λ€μν λΈλΌμ°μ λ₯Ό μ§μν©λλ€.
3. νμ΄μ§κ° μμ ν λ‘λλ λκΉμ§ λκΈ°
# νμ΄μ§κ° μμ ν λ‘λλ λκΉμ§ λκΈ° (μ΅λ 10μ΄ λκΈ°) wait = WebDriverWait(driver, 10)
μΉ νμ΄μ§κ° μμ ν λ‘λλ λκΉμ§ μ΅λ 10μ΄ λμ κΈ°λ€λ¦½λλ€.
μΉ νμ΄μ§λ λ‘λ μκ°μ΄ νμν μ μκΈ° λλ¬Έμ, μμλ€μ΄ μ€λΉλ λκΉμ§ κΈ°λ€λ¦¬λ μκ°μ μ€μ ν©λλ€.
4. 'Americas' μΉμ μ μ°Ύκ³ , μ€ν¬λ‘€ μ΄λνκΈ°
# 'Americas'λΌλ ν μ€νΈλ₯Ό κ°μ§ h3 νκ·Έ μ°ΎκΈ° americas_section = wait.until(EC.presence_of_element_located((By.XPATH, "//h3[text()='Americas']"))) # 'Americas' μΉμ κΉμ§ μ€ν¬λ‘€ μ΄λ actions = ActionChains(driver) # 'Americas' μΉμ μΌλ‘ λ§μ°μ€ μ΄λ actions.move_to_element(americas_section).perform()
XPATH
λ XML λ¬Έμμ νΉμ λΆλΆμ μ°ΎκΈ° μν κ²½λ‘ νν λ°©λ²μ
λλ€.
μλ₯Ό λ€μ΄ μμ κ°μ΄ 'Americas'λΌλ ν
μ€νΈλ₯Ό κ°μ§ h3 μμ
λ /h3[text()='Americas']
λ‘ ννν μ μμ΅λλ€.
XPATHλ μΉ νμ΄μ§μμ μμλ₯Ό μ°Ύμ λ μ¬μ©νλ λ°©λ² μ€ νλμ λλ€.
move_to_element
λ 'Americas' μΉμ
μΌλ‘ νλ©΄μ μ€ν¬λ‘€ν©λλ€.
5. 'Americas' μΉμ μμ ν μ΄λΈ μ°ΎκΈ°
# 'Americas' μΉμ μ λΆλͺ¨ μμμμ ν μ΄λΈ μ°ΎκΈ° parent_section = americas_section.find_element(By.XPATH, "./ancestor::section[contains(@data-testid, 'world-indices')]") # ν μ΄λΈ μ°ΎκΈ° table = parent_section.find_element(By.XPATH, ".//table")
"Americas" μΉμ
μ΄ μν μμ section
νκ·Έμμ table
μμλ₯Ό μ°Ύμ΅λλ€.
"./ancestor::section[contains(@data-testid, 'world-indices')]"
λ "Americas" μΉμ
μ λΆλͺ¨ μμμΈ section
νκ·Έλ₯Ό μ°Ύλ XPATHμ
λλ€.
μ΄ ν μ΄λΈμλ μ°λ¦¬κ° νμν λ°μ΄ν°(μ: μ§μ μ΄λ¦, κ°κ²© λ±)κ° ν¬ν¨λμ΄ μμ΅λλ€.
6. ν μ΄λΈμ ν€λμ λ°μ΄ν° μμ§
# ν μ΄λΈμ ν€λ μΆμΆ headers = [header.text for header in table.find_elements(By.XPATH, ".//th")] # ν μ΄λΈμ ν μΆμΆ rows = table.find_elements(By.XPATH, ".//tbody/tr")
table.find_elements(By.XPATH, ".//th")
λ ν
μ΄λΈ λ΄μμ th
νκ·Έλ₯Ό μ°Ύμ ν€λλ₯Ό μΆμΆν©λλ€.
th(Table Header) νκ·Έλ ν μ΄λΈμ μ΄ μ΄λ¦(μ: "Name", "Price")μ λνλ΄λ HTML νκ·Έμ λλ€.
ν
μ΄λΈμ κ° μ΄(th
)μ ν΄λΉνλ ν€λ(μ: "Name", "Price")λ₯Ό 리μ€νΈμ μ μ₯ν©λλ€.
tbody/tr
μ ν΅ν΄ ν
μ΄λΈμ κ° ν(tr
, table row)μ μλ λ°μ΄ν°λ₯Ό μΆμΆν©λλ€.
7. κ° νμμ 'Name'κ³Ό 'Price' κ°μ μΆμΆνμ¬ μ μ₯
# λ°μ΄ν° μ μ₯μ μν 리μ€νΈ μ΄κΈ°ν table_data = [] # κ° νμ μ΄ λ°μ΄ν°λ₯Ό μΆμΆνμ¬ λ¦¬μ€νΈμ μΆκ° for row in rows: # κ° νμ μ΄ λ°μ΄ν°λ₯Ό μΆμΆ columns = row.find_elements(By.XPATH, ".//td") row_data = {} # λ¨Όμ λΉ λμ λ리 μμ± # headers 리μ€νΈμ columns 리μ€νΈμ κΈΈμ΄κ° κ°λ€κ³ κ°μ for i in range(len(headers)): # headers 리μ€νΈμ iλ²μ§Έ μμλ₯Ό κ°μ Έμ΄ header = headers[i] # columns 리μ€νΈμ iλ²μ§Έ μμμ ν μ€νΈλ₯Ό κ°μ Έμ΄ column_value = columns[i].text # headerλ₯Ό ν€λ‘, column_valueλ₯Ό κ°μΌλ‘ νμ¬ λμ λ리μ μΆκ° row_data[header] = column_value # λ°μ΄ν°λ₯Ό 리μ€νΈμ μΆκ° table_data.append(row_data)
κ° νμ μλ λ°μ΄ν°λ₯Ό λ°λ³΅(for
λ¬Έ)νλ©΄μ, td
νκ·Έμ μλ λ°μ΄ν°(μ΄ κ°λ€)λ₯Ό μΆμΆν©λλ€.
μ΄ λ°μ΄ν°λ₯Ό row_data
λ³μμ λμ
λ리 ννλ‘ μ μ₯ν©λλ€.
λμ
λ리μ ν€λ header
(ν€λ)μ΄κ³ , κ°μ column_value
(μ΄ κ°)μ
λλ€.
λ§μ§λ§μΌλ‘, table_data
리μ€νΈμ λμ
λ리λ₯Ό μΆκ°ν©λλ€.
8. pandasλ₯Ό μ¬μ©ν΄ λ°μ΄ν°νλ μμΌλ‘ λ³ν
# μΆμΆλ λ°μ΄ν°λ₯Ό νλ€μ€ λ°μ΄ν°νλ μμΌλ‘ λ³ν df = pd.DataFrame(table_data) # 'Symbol'κ³Ό 'Price' 컬λΌλ§ μ ννμ¬ μ λ ¬λ λ°μ΄ν°νλ μ μΆλ ₯ df_filtered = df[['Symbol', 'Price']] # μ λ ¬λ λ°μ΄ν° μΆλ ₯ print(df_filtered)
μΆμΆν λ°μ΄ν°λ₯Ό pandas.DataFrame
μΌλ‘ λ³νν©λλ€.
λ°μ΄ν° νλ μμλ ν μ΄λΈμ λ°μ΄ν°κ° μλμ κ°μ΄ μ μ₯λ©λλ€.
Name | Price |
---|---|
... | ... |
... | ... |
9. 'Symbol'κ³Ό 'Price' 컬λΌλ§ μ ννκ³ μ λ ¬
df_filtered = df[['Symbol', 'Price']]
λ°μ΄ν°νλ μμμ 'Symbol'κ³Ό 'Price' 컬λΌλ§ μ ννκ³ , 'Name' 컬λΌμ κΈ°μ€μΌλ‘ μ λ ¬ν©λλ€.
Guidelines
AI Tutor
Publish
Design
Upload
Notes
Favorites
Help
Code Editor
Execution Result