이번 포스팅에서는 웹 페이지에 있는 table 태그를 읽어서 데이터프레임(DataFrame)에 담는 과정을 설명드리겠습니다.

 

네이버 금융에서 시간별 시세(분봉)를 가져와 보도록 하겠습니다.

 

삼성전자(005930)을 조회합니다. 시세 탭을 클릭 후 '시간별 시세'의 데이터가 표시된 곳에서 마우스 오른쪽 클릭하여 프레임 소스 보기를 클릭합니다.

소스 보기에서 view-source: 를 지우고 finance.naver.com/item/sise_time.nhn?code=005930&thistime=20201204161047 만 남겨두고 접속합니다.

그러면 시간별 시세만 페이지에 표시됩니다.

 

첫 페이지에 있는 table을 DataFrame에 담아보겠습니다.

파이썬 코드는 다음과 같습니다.

import pandas as pd

url = 'https://finance.naver.com/item/sise_time.nhn?code=005930&thistime=20201204161047'
df = pd.DataFrame() # (1)
df = df.append(pd.read_html(url, header=0)[0]) # (2)
df = df.dropna() # (3)
print(df)

(1) DataFrame 변수 df를 선언하고 

(2) pandas로 html을 읽어오는데 header=0은 table의 첫 행을 DataFrame 컬럼으로 설정하라는 것이고 다음 [0]은 해당 url의 첫 번째 table을 가져오라는 것입니다.

(3) 비어 있는 행을 삭제하라는 것입니다.

 

결과는 다음과 같습니다.

이번에는 마지막 페이지를 구한 후 해당 일자의 전체 분봉 정보를 가져오겠습니다.

 

마지막 페이지를 구하기 위해 '맨뒤'를 마우스 위치시키고 마우스 오른쪽 클릭 후 '검사'를 선택합니다. 

아니면 Ctrl + Shift + c 하면 element를 선택할 수 있는 상태가 되는데 그 상태에서 '맨뒤'를 마우스 클릭합니다.

'맨뒤'의 url 주소는 /item/sise_time.nhn?code=005930&thistime=20201204161047&page=40 입니다.

뒤에 &page=40 이런 식으로 파라미터가 붙는 것을 알 수 있고 마지막 페이지는 40임을 알게 되었습니다.

 

이제 마지막 페이지를 구하는 파이썬 코드를 구현해 보도록 하겠습니다.

from urllib.request import urlopen
from bs4 import BeautifulSoup

url = 'https://finance.naver.com/item/sise_time.nhn?code=005930&thistime=20201204161047'
with urlopen(url) as doc:
    html = BeautifulSoup(doc, 'lxml')
    pgrr = html.find('td', class_='pgRR') # (1)
    s = str(pgrr.a['href']).split('=') # (2)
    last_page = s[-1] # (3)
print(last_page)

(1) 'pgRR' 클래스를 가지는 td 태그를 찾아서 pgrr에 담습니다.

(2) pgrr 아래 a 링크 주소를 '=' 기준으로 split 합니다. a 링크 주소는 /item/sise_time.nhn?code=005930&thistime=20201204161047&page=40인데 '=' 기준으로 split하면 s에는 ['/item/sise_time.nhn?code', '005930&thistime', '20201204161047&page', '40']이 될 것입니다.

(3) 리스트 데이터의 마지막 데이터를 가져옵니다.

 

이제 마지막 페이지까지 루프를 돌아 전체 페이지를 읽어오는 로직을 구현해 봅시다.

파이썬 코드는 다음과 같습니다.

from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd

url = 'https://finance.naver.com/item/sise_time.nhn?code=005930&thistime=20201204161047'
df = pd.DataFrame()
with urlopen(url) as doc:
    html = BeautifulSoup(doc, 'lxml')
    pgrr = html.find('td', class_='pgRR')
    s = str(pgrr.a['href']).split('=')
    last_page = s[-1]

for page in range(1, int(last_page)+1):
    page_url = '{}&page={}'.format(url, page) # (1)
    df = df.append(pd.read_html(page_url, header=0)[0]) # (2)

df = df.dropna()
print(df)

(1) page 파라미터에 1부터 last_page 까지 for문을 돌아 url을 갱신합니다.

(2) 각 페이지마다 읽은 데이터를 DataFrame에 append 합니다.

 

결과는 다음과 같습니다.

이제 분봉 데이터를 이용할 수 있게 되었습니다.

+ Recent posts