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] 파이썬 pyupbit - 비트코인 시세 웹 페이지에 출력하기 (0) | 2022.10.05 |
---|---|
[Python] 파이썬 mplfinance로 캔들차트 그리기 (feat. OHLC) (1) | 2022.10.03 |
[Python] requirements.txt - 패키지 관리 방법과 하는 이유 (0) | 2022.10.03 |
[Python] 파이썬 pandas(판다스) 활용 - 일간 변동률, MDD 구하기 (3) | 2022.10.02 |
[Python] 파이썬 Numpy(넘파이) - 명령어 및 설명 정리 (0) | 2022.09.29 |