프로그래밍/파이썬

[Python] 파이썬 Beautiful Soup - 네이버 금융 시세 웹 크롤링(셀트리온)

매 석 2022. 10. 3. 23:12
반응형

 

1. Beautiful Soup 란?

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

- 흔히 웹 크롤러나 웹 스크레이퍼로 불리기도 한다.
- 추가로 항상 스크레이핑할 때는 저작권과 관련 법률을 위배하지 않는 것이 중요하다.

 

2. Beautiful Soup 파서 종류

파서 믄자열 장점 단점
Python's html.parser 'html.parser'  기본옵션, 속도적절 유연한 파싱 lxml 파서보다 느리고, htmllib5 파서만큼 유연x
lxml's HTML parser  'lxml'  속도 매우 빠르고,유연한 파싱  
lxml's XML PARSER  'lxml-xml','xml' 속도 매우 빠르고,유연한 파싱 XML파일만 가능
html5lib 'html5lib' 극도로 유연하여 복잡한 html문서 파싱 매우 느림

 

3. Beautiful Soup - find_all()함수와 find()함수 비교

- find_all(['검색할 태그'][, class_='클래스 속성값'][, id='아이디 속성값'][, limit=찾을 개수]) -> 아무것도 없으면 빈 리스트
- find(['검색할 태그'][, class_='클래스 속성값'][, id='아이디 속성값']) -> 아무것도 없으면 None

 

4. Beautiful Soup 활용하여 셀트리온 시세 크롤링

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

url = 'https://finance.naver.com/item/sise_day.nhn?code=068270&page=1'
#패킷 헤더의 브라우저 정보를 추가 - 없으면 봇으로 간주하여 네이버에서 차단
html = requests.get(url, headers={'User-agent': 'Mozilla/5.0'}).text
#url과 파싱방식을 념겨줌
bs = BeautifulSoup(html, 'lxml')
pgRR = bs.find('td', class_='pgRR')
#전체 텍스트를 보기 좋게 출력
#print(pgRR.prettify())
# 문자열을 리스트로 얻어서 전체 페이지 수를 확인
s = str(pgRR.a['href']).split('=')
last_page = s[-1]  

#전체 페이지 읽어오기
df = pd.DataFrame()
url2 = 'https://finance.naver.com/item/sise_day.nhn?code=068270'  
for page in range(1, int(last_page)+1):
    url = '{}&page={}'.format(url2, page)  
    html = requests.get(url, headers={'User-agent': 'Mozilla/5.0'}).text
    # read_html 함수로 읽은 한 페이지 분량의 데이터프레임을 df 객체에 추가한다.
    df = df.append(pd.read_html(html, header=0)[0])

# 차트 출력을 위해 데이터프레임 가공하기
df = df.dropna() #값이 빠진 행은 제거
df = df.iloc[0:30]  #30개의 데이터만 사용
df = df.sort_values(by='날짜')  #날짜기준으로 오름차순으로 변경

# 날짜, 종가 컬럼으로 차트 그리기
plt.title('셀트리온 (종가)')
plt.xticks(rotation=45)  #x축 레이블의 날짜가 겹쳐서 보기에 어려우므료 90도 회전하여 표시
plt.plot(df['날짜'], df['종가'], 'co-')  #검은색으로 각 좌표를 실선으로 연결
plt.grid(color='black', linestyle='--')
plt.show()

- 기본적으로 필요한 라이브러리는 pandas, requests, bs4이다. 추가로 차트를 그리면 matploblib를 사용한다.

- 코드의 자세한 설명은 주석을 참고하면 된다.

- 참고로 URL의 맨 뒤 종목코드 값만 변경해주면 네이버 금융의 등록되어있는 다른 종목의 시세를 가져올 수 있다.

 

5. 크롤링 방법 및 활용

1. bs4와 requests를 사용하여 html 값을 가져옴

2. html 값에서 find나 find_all 등을 사용해 원하는 값을 추출

3. 추출한 값을 pandas를 이용하여 데이터프레임 형태로 저장

4. 데이터프레임을 이용하여 matploblib로 데이터를 시각화

 

+ 조금 설명을 덧붙히자면 크롤링 자체는 데이터를 수집하는 과정으로

   유효한 데이터를 수집하였으면 데이터를 사용할 수 있게 보관하거나 관리하여야 한다.

   이후 데이터를 관리만 하는 것이 아니라 개인의 용도에 따라 데이터를 시각화하거나

   데이터를 이용하여 다른 값을 예측하는 등의 여러 용도로 사용한다.

 

(위에서 언급되었던 Pandas에 대해 궁금하거나 더 많은 데이터 분석은 아래 링크를 참고하길 바랍니다.)

 

[Python] 파이썬 pandas(판다스) 활용 - 일간 변동률, MDD, 산점도, 선형 회귀 모델, 상관계수 구하기

1. Pandas란 ? - 금융 데이터 분석을 목적으로 개발되었으며, 구조화된 데이터를 쉽고 빠르게 가공할 수 있다. - 시리즈와 데이터프레임 자료형 객체를 제공한다. + 시리즈 : 인덱스 처리가 된 1차원

maeseok.tistory.com