관리 메뉴

bright jazz music

7. 1 네이버에서 KOSPI200 지수 수집하기(html크롤링) 본문

기타/파이썬 금융 데이터 분석

7. 1 네이버에서 KOSPI200 지수 수집하기(html크롤링)

bright jazz music 2021. 12. 27. 15:56

 

 

 

 

#!/usr/bin/env python
# coding: utf-8

# In[21]:


index_cd = 'KPI200'
page_n = 1
naver_index='https://finance.naver.com/sise/sise_index_day.naver?code=' + index_cd + '&page' + str(page_n)

#https://finance.naver.com/sise/sise_index_day.naver?code=KPI200&page=1


# In[22]:


from urllib.request import urlopen
source = urlopen(naver_index).read() #소스 읽기 함수를 source에 대입
source


# In[23]:


import bs4 #알아볼 수 없게 나와서 source를 BeautifulSoupe에 담고 해석
source = bs4.BeautifulSoup(source, 'lxml')


# In[24]:


print(source.prettify()) #읽을 수 있는 모습으로 출력


# In[25]:


#우리가 필요한 날짜와 종가(체결가) 데이터가 모두 <td>태그 안에 있음을 확인. td의 개수 확인 먼저.

td = source.find_all('td')
len(td) #td의 개수 확인


# In[26]:


# 데이터를 대량으로 사용하는 사이트에서 원하는 데이터의 위치를 찾아낼 때는 XPath주소를 이용하면 편리하다.
# XPath란 XML Path Language의 약자이며,
# 웹사이트 또는 XML 문서에 있는 각 항목의 주소를 문서에 포함된 태그를 조합한 경로 형태로 표현하는 언어이다,


# In[27]:


# /html/body/div/table[1]/tbody/tr[3]/td[1]  #사이트의 xpath. 
# 사이트(html) => body => div => table(첫 번째) => tr(세 번째) => td(첫 번째) 순서로 찾아가라는 뜻.
# tbody는 실제 코드 내용이 아니라 테이블이 시작된다고 알려주는 표시

# 찾아가는 방법은 값이 하나인 경우에는 find(태그명), 여러 개인 경우 find_all(태그명)[순서] 사용
# 단, XPath는 숫자를 1부터 세고, python은 0부터 세므로, xpath의 숫자에서 -1을 해줘야 한다.


source.find_all('table')[0].find_all('tr')[2].find_all('td')[0]

#첫 번쨰 테이블의 세 번째 tr의 첫 번째 td를 찾으라는 뜻


# In[28]:


# <td class="date">처럼 class이름을 이용해 특별히 이름을 붙인 td 태그는 이름을 지정해서 뽑아낼 수도 있음
# 이 경우 td 앞에 붙는 태그를 생략할 수 있음

d = source.find_all('td', class_='date')[0].text
d


# In[29]:


#원하는 데이터를 찾았지만 네이버의 날짜 형식은 파이썬의 날짜형식과 다름. 따라서 파이썬 형식으로 변경 필요
# ' .' 으로 구분된 년월일을 분리하고 이를 datetime 라이브러리를 이용하여 date 형식으로 변경

import datetime as dt


# In[30]:


yyyy = int(d.split('.')[0]) # 문자열.split(구분자) 구분자를 기준으로 문자열을 분해. 여기서는 년,월,일로.
mm = int(d.split('.')[1])   # dt.date(년, 월, 일) 함수를 이용하여 문자열을 날짜 형식으로 변경
dd = int(d.split('.')[2])
this_date = dt.date(yyyy, mm, dd)
this_date


# In[33]:


# 날짜 정보를 date형식으로 변경할 일이 계속 생기므로 함수를 만들어 적용
def date_format(d):
    d = str(d).replace('-', '.') #문자열.replace('A', 'B') 문자열 A를 B로 변경해줌.
    yyyy = int(d.split('.')[0])
    mm = int(d.split('.')[1])
    dd = int(d.split('.')[2])
    
    this_date = dt.date(yyyy, mm, dd)
    return this_date


# In[35]:


#함수를 만들었으니 지수를 가져올 차례. 해당 일자의 종가지수를 가져와야 한다.
# /html/body/div/table[1]/tbody/tr[3]/td[1]  #사이트의 xpath.

this_close = source.find_all('tr')[2].find_all('td')[1].text
this_close = this_close.replace(',' , '') #쉼표(,) 제거
this_close = float(this_close)
this_close


# In[37]:


#태그에 클래스 네임이 있으므로 더 쉽게 찾을 수도 있음
p = source.find_all('td', class_='number_1')[0].text
p


# In[41]:


#페이지에 있는 모든 날짜와 가격 불러오기

dates = source.find_all('td', class_='date')
prices = source.find_all('td', class_='number_1')


# In[40]:


len(dates) #날짜의 개수. 한 페이지에 6개 나온다


# In[45]:


len(prices) 
# 체결가, 등락률, 거래량, 거래대금이 모두 <td class="number_1">를 사용한다. 이중 첫 번째 값만 필요하다.
#0,4,8 ... 따라서 4*6 = 24


# In[47]:


for n in range(len(dates)):       # dates 개수만큼 반복
    this_date = dates[n].text      # n번째 dates 값 추출
    this_date =  date_format(this_date) #날짜 형식으로 변환
    
    this_close = prices[n*4].text #0, 4, 8 ... 등 4의 배수에 해당하는 종가지수 추출
    this_close = this_close.replace(',' , '') #쉼표(,) 제거
    this_close = float(this_close) #숫자 형식으로 변환
    this_close
    print(this_date, this_close)


# In[87]:


#페이지 표시에서 '맨뒤' 버튼에 우클릭 하고 검사 누르기
# <a> 태그는 <td class="pgRR">  태그이다. 따라서 다음과 같이 하이퍼 링크 주소를 따올 수 있다,

paging = source.find('td', class_='pgRR').find('a')['href']
paging


# In[88]:


#페이지 주소만 따올 거라면
paging = paging.split('&')[2]
paging


# In[89]:


#페이지 번호만 따기
paging = paging.split('=')[1]
paging


# In[92]:


#마지막 페이지를 뽑는 과정을 종합해 보면 

last_page = source.find('td', class_='pgRR').find('a')['href']
last_page = last_page.split('&')[2]
last_page = last_page.split('=')[1]
last_page = int(last_page)

last_page
Comments