본문 바로가기
python/금융데이터분석

python 증권데이터 분석 - 네이버 금융 웹 스크래핑(웹 크롤링)

by orangecode 2022. 12. 24.
728x90
네이버 금융 웹 스크래핑(웹 크롤링)하기

네이버 금융 홈페이지에서 삼성카드(029780) 검색해서 페이지를 들어가서 삼성카드 주식을 조회할 수 있다.

 

네이버 금융 일별 시세 분석하기

네이버 금융에서 제공하는 일별 시세 페이지를 이용해서 분석해보자

 

네이버 금융 일별시세 페이지는 주가가 1페이지당 10개씩 볼 수 있다.

 

[맨뒤]를 눌러 가장 오래된 날짜의 종가도 확인할 수 있다.

 

마우스 오른쪽을 클릭하여 [페이지  소스 보기]로 해당 페이지의 주소를 확인할 수 있다.

 

- 맨 앞 페이지 주소

https://finance.naver.com/item/sise.naver?code=029780&page=1

 

- 맨 뒤 페이지 주소

https://finance.naver.com/item/sise.naver?code=029780&page=383 

 

beautifulSoup으로 주식의 일별 시세 읽어오기

BeautifulSoup 라이브러리는 HTML, XML 페이지로부터 데이터를 추출하는 파이썬 라이브러리이다.

 

웹크롤러, 웹 스크롤러로 불리기도 하는데, 웹사이트의 데이터들을 읽어온다는 의미를 가지고 있다.

 

※※※※ 웹 크롤링 시 주의할 점 ※※※※

웹 스크래핑(웹 크롤링)을 이용하여 적법하게 데이터를 수집하는 것은 엄연히 웹 크롤링을 수행하는 본인의 몫이다.

접근 권한이 있는 저작권 자료를 스크래핑하여 분석하는 것은 괜찮지만, 원 저작자의 허가 없이 자신의 웹에 게시하거나 다른 사람이 다운로드 하도록 공유하면 안된다.

또한 잦은 웹 스크레핑은 상대방 시스템 성능에 지장을 줄 수 있으므로, 합법적인 범위 내에서 웹 스크래핑을 수행해야 한다.

 

BeautifulSoup 라이브러리 가져오기

# pip install 
pip install beautifulsoup4

# conda install
conda install -c anaconda beautifulsoup4

 

BeautifulSoup로 HTML 페이지를 분석할 때, 4가지 인기 파서 라이브러리를 골라서 사용할 수 있다.

4가지 파서별 장단점

파서 문자열 장점 단점
Python's html.parser 'html.parser' 기본 옵션으로 설치,
속도가 적절하고 유연한 파싱이 가능
lxml 파서보다 느리고
html5lib 파서만큼
유연하지 못함
lxml's HTML parser 'lxml' 속도가 매우 빠르고 파싱 가능  
lxml's XML parser 'lxml-xml', 'xml' 속도가 매우 빠르고 유연한 파싱 가능 XML 파일에만 사용 가능
html5lib 'html5lib' 웹 브라우저와 동일한 방식의 파싱
극도로 유연하며 복잡한 구조의
HTML 문서 파싱에 사용
매우 느림

 

beautifulSoup으로 삼성카드(029780) 시세 읽어오기

beautifulSoup의 find()함수,  find_all()함수 비교

- find() 함수 : find()함수는 더 간편하게 사용할 수 있고, 아무것도 못찾으면 None을 반환한다.

- find_all() 함수 : find_all()함수는 문서 전체를 대상으로 조건에 맞는 모든 태그를 찾는다. 아무것도 찾지 못한다면find_all()함수는 빈 리스트를 반환한다.

 

find_all(['검색할 태그'][, class_='클래스 속성값'][, id='아이디 속성값][,limit=찾을 개수])

find(['검색할 태그'][, class_='클래스 속성값'][, id='아이디 속성값])

 

삼성카드(029780)  일별 시세 데이터 읽어오기

import pandas as pd
import requests
from bs4 import BeautifulSoup
from matplotlib import pyplot as plt


url = 'https://finance.naver.com/item/sise_day.nhn?code=029780&page=1'
html = requests.get(url, headers={'User-agent': 'Mozilla/5.0'}).text

# BeautifulSoup 생성자 첫번째 인수로 HTML/XML 페이지를 넘겨주고, 두번째 인수로 페이지를 파싱할 방식을 넘겨준다.
bs = BeautifulSoup(html, 'lxml')

# find 함수를 통해 'pgRR'인 'td'태그를 찾으면, 결과값은 'bs4.element.Tag'타입으로 pgrr 변수에 반환한다.
# pgRR = Page Right Right 맨 마지막 페이지를 의미한다.
pgrr = bs.find('td', class_='pgRR')


# 삼성카드 전체 페이지 수를 구하려면 pdRR 클래스 속성값으로 <td>하위의 <a> href 속성값을 구한다.
# pfgg.a['href']를 출력하면 href의 속성값인 item/sise.naver?code=029780&page=1 문자열을 얻을 수 있다.
s = str(pgrr.a['href']).split('=')

last_page = s[-1]  

# 빈 데이터프레임 생성
df = pd.DataFrame()
sise_url = 'https://finance.naver.com/item/sise_day.nhn?code=029780'  

for page in range(1, int(last_page)+1):
    url = '{}&page={}'.format(sise_url, page)  
    html = requests.get(url, headers={'User-agent': 'Mozilla/5.0'}).text
    df = df.append(pd.read_html(html, header=0)[0])

df = df.dropna()
print(df)

# 차트 출력을 위해 데이터프레임 가공하기
df = df.dropna()
df = df.iloc[0:30]  
df = df.sort_values(by='날짜')  

# 날짜, 종가 컬럼으로 차트 그리기
plt.title('Samsung Card (close)')
plt.xticks(rotation=45)  
plt.plot(df['날짜'], df['종가'], 'co-') 
plt.grid(color='gray', linestyle='--')
plt.show()

 

 

참고도서

http://www.yes24.com/Product/Goods/90578506

 

파이썬 증권 데이터 분석 - YES24

투자 기법과 프로그래밍 기술로 자신만의 퀀트 투자 시스템을 완성하라『파이썬 증권 데이터 분석』은 웹 스크레이핑으로 증권 데이터를 주기적으로 자동 수집, 분석, 자동 매매, 예측하는 전

www.yes24.com

https://github.com/INVESTAR/StockAnalysisInPython

 

GitHub - INVESTAR/StockAnalysisInPython

Contribute to INVESTAR/StockAnalysisInPython development by creating an account on GitHub.

github.com

 

반응형

댓글