πŸš€ 주식 μ’…κ°€ 쑰회 μ‹œμŠ€ν…œ(κ°œλ°œμ™„λ£Œ)

Chang-Seong KimΒ·2024λ…„ 1μ›” 9일
1

토이 ν”„λ‘œμ νŠΈ

λͺ©λ‘ 보기
1/1
post-thumbnail

Date : January 8, 2024

βœ… Stock Price Information

GitHub URL on Stock Price Information


πŸ”” 주식 μ’…κ°€ 쑰회 μ‹œμŠ€ν…œ

  • μ£Όμš” μ–Έμ–΄ : Python
  • μ£Όμš” 라이브러리 : BeautifulSoup, Pandas
  • 쑰회 μ‚¬μ΄νŠΈ : 넀이버 증ꢌ, investing
  • 주식 μ’…λͺ© : μ‚Όμ„±μ „μž(005930), SCHD ETF
  • 쑰회 λ‚΄μš© : 200일 λ™μ•ˆμ˜ μ‚Όμ„±μ „μž 일별 μ’…κ°€, SCHD ETF의 졜근 μ’…κ°€

πŸ“Œ 쑰회 방법 : BeautifulSoup

  • μ‚Όμ„±μ „μž μ’…λͺ© νŽ˜μ΄μ§€μ—μ„œ μ’…κ°€κ°€ κΈ°μž…λœ νŽ˜μ΄μ§€λ₯Ό for 반볡문으둜 쑰회
  • νŽ˜μ΄μ§€ λ‹Ή κΈ°μž…λœ 10개 행에 λŒ€ν•΄ ν•΄λ‹Ή 거래일 및 μ’…κ°€λ₯Ό for 반볡문으둜 쑰회
  • 쑰회된 λ‚΄μš©μ„ text ν˜•μ‹μœΌλ‘œ return

πŸ“Œ μ½”λ“œ μš”μ•½ : BeautifulSoup

  • bs4 : BeautifulSoup library ver. 4
  • requests : url, header 정보λ₯Ό μ΄μš©ν•˜μ—¬ μ›Ή νŽ˜μ΄μ§€μ˜ HTML λ¬Έμ„œ μš”μ²­
  • response : μš”μ²­ν•œ HTML λ¬Έμ„œ νšŒμ‹ 
  • URL Information : finance.naver.com
  • Header Information : useragentstring.com
  • parser : λ¬Έμ„œμ˜ λ‚΄μš©μ„ ν† ν°μœΌλ‘œ κ΅¬λΆ„ν•˜κ³  파슀트리 생성
  • isCheckNone : None κ°’ ν•„ν„°λ§ν•˜μ—¬ μ œμ™Έ

πŸ“Œ 쑰회 방법 : Pandas

  • μ‚Όμ„±μ „μž μ’…λͺ© νŽ˜μ΄μ§€μ—μ„œ μ’…κ°€κ°€ κΈ°μž…λœ νŽ˜μ΄μ§€λ₯Ό DataFrame λͺ¨λ“ˆλ‘œ 쑰회
  • μ‘°νšŒν•œ νŽ˜μ΄μ§€μ—μ„œ read_html λͺ¨λ“ˆλ‘œ 거래일, μ’…κ°€ λ“±μ˜ 데이터 μΆ”μΆœ
  • μΆ”μΆœλœ λ‚΄μš©μ„ text ν˜•μ‹μœΌλ‘œ return

πŸ“Œ μ½”λ“œ μš”μ•½ : Pandas

  • DataFrame : Pandas Module
  • append : Pandas Module
  • read_html : Pandas Module
  • ignore_index = True : Pandas Module
  • dropna : Pandas Module

from bs4 import BeautifulSoup # BeautifulSoup 라이브러리λ₯Ό μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
import requests # Requests 라이브러리λ₯Ό μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

for page in range(1, 6): # νŽ˜μ΄μ§€ 수λ₯Ό μ˜λ―Έν•˜λŠ” 1λΆ€ν„° 5κΉŒμ§€μ˜ μˆ«μžμ— λŒ€ν•΄ λ°˜λ³΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

  print(str(page))
  # ν˜„μž¬ νŽ˜μ΄μ§€ 번호λ₯Ό 좜λ ₯ν•˜λ„λ‘ μ„€μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  
  url_005930 = "http://finance.naver.com/item/sise_day.nhn?code=005930" + "&page=" + str(page)
  # 넀이버 금육의 μ‚Όμ„±μ „μžμ˜ 주식 정보가 μžˆλŠ” νŽ˜μ΄μ§€μ—μ„œ νŽ˜μ΄μ§€ 번호(&page=)λ₯Ό str(page) νŒŒλΌλ―Έν„°λ‘œ μΆ”κ°€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

  headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}
  # μ›Ή μ„œλ²„κ°€ μ›Ή 크둀링 μš”μ²­μ„ μ›Ή λΈŒλΌμš°μ €μ—μ„œ 온 κ²ƒμœΌλ‘œ μΈμ‹ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄ User-Agent 헀더 정보λ₯Ό μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  # 참고둜 User-Agent μ •λ³΄λŠ” 'https://useragentstring.com/'μ—μ„œ νšλ“ν•  수 있으며 μ΄λŠ” μ‚¬μš©μžμ˜ μ›Ή ν™˜κ²½ λ“±μ˜ μ •λ³΄μž…λ‹ˆλ‹€.

  response = requests.get(url_005930, headers=headers)
  # μ„€μ •ν•œ url에 HTTP GET μš”μ²­μ„ 보낸 ν›„ response λ³€μˆ˜μ— ν•΄λ‹Ή 응닡을 μ €μž₯ν•˜κ²Œ μ„€μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

  soup = BeautifulSoup(response.text, "html.parser")
  # response에 μ €μž₯된 응닡 쀑 HTML λ‚΄μš©μ„ μ‚¬μš©ν•˜μ—¬ BeautifulSoup 객체λ₯Ό μƒμ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  # BeautifulSoup 객체λ₯Ό μ΄μš©ν•˜μ—¬ HTML λ‚΄μš©μ„ νŒŒμ‹±(뢄석)ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  parsing_list = soup.find_all("tr")
  # HTML λ‚΄μš© 쀑 'tr' νƒœκ·Έκ°€ ν¬ν•¨λœ λͺ¨λ“  λ¬Έμžμ—΄(ν–‰)을 μ°Ύμ•„ 리슀트둜 λ°˜ν™˜μ‹œμΌ°μŠ΅λ‹ˆλ‹€.

  isCheckNone = None
  # None 값에 λŒ€ν•œ 비ꡐλ₯Ό μœ„ν•œ λ³€μˆ˜λ₯Ό μ„€μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  
  for i in range(1, len(parsing_list)):
  # parsing_list λ‚΄μš©μ— μžˆλŠ” 'tr' νƒœκ·Έκ°€ ν¬ν•¨λœ 행을 λ°˜λ³΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

    if(parsing_list[i].span != isCheckNone):
    # μœ νš¨ν•œ 데이터 ν–‰ μ •λ³΄λ§Œ μ·¨λ“ν•˜κΈ° μœ„ν•΄ 'span' νƒœκ·Έμ˜ λ‚΄μš©μ΄ None이 μ•„λ‹Œμ§€ ν™•μΈν•˜μ˜€μŠ΅λ‹ˆλ‹€.

      print(parsing_list[i].find_all("td", align="center")[0].text,
            # ν•΄λ‹Ή 'tr' νƒœκ·Έ λ‚΄μ—μ„œ 'td' νƒœκ·Έ 쀑 align 속성이 "center"인 첫 번째 μš”μ†Œ([0])의 ν…μŠ€νŠΈ(λ‚ μ§œ)λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

            parsing_list[i].find_all("td", class_="num")[0].text)
            # 같은 'tr' νƒœκ·Έ λ‚΄μ—μ„œ 'td' νƒœκ·Έ 쀑 class 속성이 "num"인 첫 번째 μš”μ†Œ([0])의 ν…μŠ€νŠΈ(주식 μ’…κ°€)λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

🎁 References

  • FastCampus의 Selena κ°•μ‚¬λ‹˜ κ°•μ˜

GitHub URL on Stock Price Information





profile
곰곰이 κ³ λ―Όν•˜λŠ” κ³°

0개의 λŒ“κΈ€