네이버 금융 웹 스크래핑(웹 크롤링)하기
네이버 금융 홈페이지에서 삼성카드(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
https://github.com/INVESTAR/StockAnalysisInPython
'python > 금융데이터분석' 카테고리의 다른 글
python 증권데이터 분석 - maria DB 설치, 데이터베이스 생성, 확인, 제거하기 (2) | 2022.12.24 |
---|---|
python 증권데이터 분석 - OHLC와 캔들차트 그리기 (1) | 2022.12.24 |
python 증권데이터 분석 - 웹 스크래핑(웹 크롤링), HTML 예시, 한국거래소 상장법인목록 가져오기 (1) | 2022.12.23 |
python 증권데이터 분석 - 회귀 분석과 상관관계, KOSPI 다우존스 회귀분석 (0) | 2022.12.23 |
python 증권데이터 분석 - 최대손실낙폭 MDD(KOSPI MDD구하기) (0) | 2022.12.23 |
댓글