주식 종목에 대한 하루 단위의 시가, 종가, 거래량 등을 웹을 통해 얻을 수 있는데요. 이러한 데이터를 파이썬을 이용해, 네이버의 주식 서비스로부터 얻는 코드에 대해 설명합니다.
코드는 다음과 같습니다. 원하는 종목에 대해 원하는 페이지만큼.. (이 부분은 주식 서비스마다 가능 여부 및 방식이 달라짐) 정보를 얻어옵니다.
import requests
from bs4 import BeautifulSoup
def print_stock_price(code, page_num):
result = [[], [], [], [], [], [], [], [], []]
for n in range(page_num):
url = 'https://finance.naver.com/item/sise_day.nhn?code='+code+'&page='+str(n+1)
print(url)
r = requests.get(url)
if not r.ok:
print('Not more data !')
break
html = r.content
soup = BeautifulSoup(html, 'html.parser')
tr = soup.select('table > tr')
for i in range(1, len(tr)-1):
td = tr[i].select('td')
if td[0].text.strip():
result[0].append(td[0].text.strip()) # 날짜
result[1].append(td[1].text.strip()) # 종가
img = td[2].select('img')
if len(img) != 0:
if 'src' in img[0].attrs:
src = img[0]['src']
if 'up' in src: result[2].append('상승')
else: result[2].append('하락')
else: result[2].append('보합')
result[3].append(td[2].text.strip()) # 전일대비
result[4].append(td[3].text.strip()) # 시장가
result[5].append(td[4].text.strip()) # 최고가
result[6].append(td[5].text.strip()) # 최저가
result[7].append(td[6].text.strip()) # 거래량
for i in range(len(result[0])):
# 날짜 종가 상승/하락/보합+a 시장가 최고가 최저가 거래량
print(result[0][i], result[1][i], result[2][i]+result[3][i], result[4][i], result[5][i], result[6][i], result[7][i])
print_stock_price(code='005930', page_num=1)
코드를 보면, print_stock_price 함수의 url 변수에 저장된 주소에 대한 결과 DOM을 해석하고 있는 것을 알 수 있습니다. 즉, DOM에 대한 구조를 먼저 파악해야 한다는 것이 핵심인데요. 위의 코드가 정상적으로 작동할 당시의 실제 DOM의 한가지 예는 다음과 같습니다.

코드와 추출하고자 하는 DOM 요소가 명확하게 1:1로 매칭되고 있는 것을 확인할 수 있습니다.
