Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 데이터캠프
- 비즈니스 분석가
- stratascratch
- sql문제
- sql문제풀이
- for
- SQL
- 데이터베이스
- SubQuery
- 패스트캠퍼스
- 데이터분석가양성과정
- 파이썬
- GA
- eda
- Tableau
- BDA과정
- Python
- groupby
- sql with
- 비즈니스분석가양성과정
- sql partition by
- 데이터 분석을 위한 sql 레시피
- 데이터분석
- while
- 태블로
- 크롤링
- 데이터분석가 과정
- 국비지원
- 논리적사고
- 시각화
Archives
- Today
- Total
원시인
[15일차] BDA과정 - 동적페이지 크롤링 본문
[KDT] 패스트캠퍼스 비즈니스 데이터 분석가 양성과정 15일 차
Python Crawler(파이썬 동적 크롤링)
안녕하세요 어제가 입동이었다는데 오늘 비가 오면서 온도가 낮아지다 보니
확실히 겨울이 왔구나라는 느낌을 받았습니다 ㅎㅎ
겨울과 함께 새로운 한주가 시작되었습니다. 오늘은 저번 주에 이어 크롤링을 배우는 시간을 가졌습니다.
저번 주와 다르게 입력, 클릭, 로그인 등과 같이 페이지 이동이 있어야 보이는 데이터 즉 동적 데이터에 대한
크롤링을 배우는 하루였습니다.
밑에 주피터 노트북으로 이루어진 작업은 동적 크롤링을 이용해 네이버 금융에 나스닥 종합지수 데이터를
크롤링해와 간단한 시각화까지 진행한 작업입니다.
동적 페이지 크롤링
동적인 데이터를 수집하는 방법
입력, 클릭, 로그인 등과 같이 페이지 이동이 있어야 보이는 데이터를 크롤링
import numpy as np
import pandas as pd
import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
네이버 금융에서 나스닥 종합지수(일별 시세) 크롤링
# url 정의 일반적으로 정적 크롤링과 다르게 숨겨진 url를 찾아줘야한다.
i = []
url = f'https://finance.naver.com/world/worldDayListJson.naver?symbol=NAS@IXIC&fdtc=0&page={i}'
# url 요청하기 동적크롤링에서는 referer과 user-agent도 같이 정의가 필요
#info 변수에 정의
info = {"referer" : "https://finance.naver.com/world/sise.naver?symbol=NAS@IXIC",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"}
resp = requests.post(url , headers = info)
resp
<Response [200]>
resp.text
'[{"symb":"NAS@IXIC","xymd":"20211105","open":16003.56,"high":16053.39,"low":15900.78,"clos":15971.59,"diff":31.28,"rate":0.2,"gvol":546997312},{"symb":"NAS@IXIC","xymd":"20211104","open":15849.74,"high":15966.09,"low":15827.66,"clos":15940.31,"diff":128.73,"rate":0.81,"gvol":516636763},{"symb":"NAS@IXIC","xymd":"20211103","open":15658.52,"high":15821.58,"low":15616.44,"clos":15811.58,"diff":161.98,"rate":1.04,"gvol":522563636},{"symb":"NAS@IXIC","xymd":"20211102","open":15583.99,"high":15656.6,"low":15569.27,"clos":15649.6,"diff":53.68,"rate":0.34,"gvol":502425436},{"symb":"NAS@IXIC","xymd":"20211101","open":15541.26,"high":15598.95,"low":15470.82,"clos":15595.92,"diff":97.53,"rate":0.63,"gvol":519013761},{"symb":"NAS@IXIC","xymd":"20211029","open":15323.29,"high":15504.12,"low":15323.29,"clos":15498.39,"diff":50.27,"rate":0.33,"gvol":526752112},{"symb":"NAS@IXIC","xymd":"20211028","open":15304.74,"high":15452.3,"low":15290.31,"clos":15448.12,"diff":212.28,"rate":1.39,"gvol":559756554},{"symb":"NAS@IXIC","xymd":"20211027","open":15276.0,"high":15364.54,"low":15235.84,"clos":15235.84,"diff":0.12,"rate":0.0,"gvol":601068064},{"symb":"NAS@IXIC","xymd":"20211026","open":15317.5,"high":15384.0,"low":15198.23,"clos":15235.72,"diff":9.01,"rate":0.06,"gvol":693369567},{"symb":"NAS@IXIC","xymd":"20211025","open":15142.92,"high":15259.63,"low":15070.75,"clos":15226.71,"diff":136.51,"rate":0.9,"gvol":558646713}]'
동적 크롤링하는 과정에서 텍스트 데이터를 갖고 올 시에는 정적크롤링과 같이 텍스트데이터를 html로 변경해서 사용해야 한다. 하지만 위에 데이터처럼 json 파일로 데이터가 넘어 올 시에는 html 변경 없이 바로 사용 가능하다.
import json # jsno 데이터를 사용하기 위해 필요
data = json.loads(resp.text)
data[0]
{'symb': 'NAS@IXIC',
'xymd': '20211105',
'open': 16003.56,
'high': 16053.39,
'low': 15900.78,
'clos': 15971.59,
'diff': 31.28,
'rate': 0.2,
'gvol': 546997312}
# json데이터의 장점은 딕션으로 데이터들의 관계가 정의되었기 때문에 데이터프레임에서 바로 사용이 가능하다.
df = pd.DataFrame(data)
df
symb | xymd | open | high | low | clos | diff | rate | gvol | |
---|---|---|---|---|---|---|---|---|---|
0 | NAS@IXIC | 20211105 | 16003.56 | 16053.39 | 15900.78 | 15971.59 | 31.28 | 0.20 | 546997312 |
1 | NAS@IXIC | 20211104 | 15849.74 | 15966.09 | 15827.66 | 15940.31 | 128.73 | 0.81 | 516636763 |
2 | NAS@IXIC | 20211103 | 15658.52 | 15821.58 | 15616.44 | 15811.58 | 161.98 | 1.04 | 522563636 |
3 | NAS@IXIC | 20211102 | 15583.99 | 15656.60 | 15569.27 | 15649.60 | 53.68 | 0.34 | 502425436 |
4 | NAS@IXIC | 20211101 | 15541.26 | 15598.95 | 15470.82 | 15595.92 | 97.53 | 0.63 | 519013761 |
5 | NAS@IXIC | 20211029 | 15323.29 | 15504.12 | 15323.29 | 15498.39 | 50.27 | 0.33 | 526752112 |
6 | NAS@IXIC | 20211028 | 15304.74 | 15452.30 | 15290.31 | 15448.12 | 212.28 | 1.39 | 559756554 |
7 | NAS@IXIC | 20211027 | 15276.00 | 15364.54 | 15235.84 | 15235.84 | 0.12 | 0.00 | 601068064 |
8 | NAS@IXIC | 20211026 | 15317.50 | 15384.00 | 15198.23 | 15235.72 | 9.01 | 0.06 | 693369567 |
9 | NAS@IXIC | 20211025 | 15142.92 | 15259.63 | 15070.75 | 15226.71 | 136.51 | 0.90 | 558646713 |
df.rename({"xymd":"date"}, axis =1,inplace =True) # xymd column을 date로 변경
symb | date | open | high | low | clos | diff | rate | gvol | |
---|---|---|---|---|---|---|---|---|---|
0 | NAS@IXIC | 20211105 | 16003.56 | 16053.39 | 15900.78 | 15971.59 | 31.28 | 0.20 | 546997312 |
1 | NAS@IXIC | 20211104 | 15849.74 | 15966.09 | 15827.66 | 15940.31 | 128.73 | 0.81 | 516636763 |
2 | NAS@IXIC | 20211103 | 15658.52 | 15821.58 | 15616.44 | 15811.58 | 161.98 | 1.04 | 522563636 |
3 | NAS@IXIC | 20211102 | 15583.99 | 15656.60 | 15569.27 | 15649.60 | 53.68 | 0.34 | 502425436 |
4 | NAS@IXIC | 20211101 | 15541.26 | 15598.95 | 15470.82 | 15595.92 | 97.53 | 0.63 | 519013761 |
df["date"] = pd.to_datetime(df["date"]) # date를 날짜 데이터로 변환
df.set_index("date").sort_index(ascending = True) # date를 index 설정
symb | open | high | low | clos | diff | rate | gvol | |
---|---|---|---|---|---|---|---|---|
date | ||||||||
2021-10-25 | NAS@IXIC | 15142.92 | 15259.63 | 15070.75 | 15226.71 | 136.51 | 0.90 | 558646713 |
2021-10-26 | NAS@IXIC | 15317.50 | 15384.00 | 15198.23 | 15235.72 | 9.01 | 0.06 | 693369567 |
2021-10-27 | NAS@IXIC | 15276.00 | 15364.54 | 15235.84 | 15235.84 | 0.12 | 0.00 | 601068064 |
2021-10-28 | NAS@IXIC | 15304.74 | 15452.30 | 15290.31 | 15448.12 | 212.28 | 1.39 | 559756554 |
2021-10-29 | NAS@IXIC | 15323.29 | 15504.12 | 15323.29 | 15498.39 | 50.27 | 0.33 | 526752112 |
2021-11-01 | NAS@IXIC | 15541.26 | 15598.95 | 15470.82 | 15595.92 | 97.53 | 0.63 | 519013761 |
2021-11-02 | NAS@IXIC | 15583.99 | 15656.60 | 15569.27 | 15649.60 | 53.68 | 0.34 | 502425436 |
2021-11-03 | NAS@IXIC | 15658.52 | 15821.58 | 15616.44 | 15811.58 | 161.98 | 1.04 | 522563636 |
2021-11-04 | NAS@IXIC | 15849.74 | 15966.09 | 15827.66 | 15940.31 | 128.73 | 0.81 | 516636763 |
2021-11-05 | NAS@IXIC | 16003.56 | 16053.39 | 15900.78 | 15971.59 | 31.28 | 0.20 | 546997312 |
df.corr()
open | high | low | clos | diff | rate | gvol | |
---|---|---|---|---|---|---|---|
open | 1.000000 | 0.986202 | 0.989495 | 0.951494 | -0.033554 | -0.052020 | -0.435202 |
high | 0.986202 | 1.000000 | 0.991748 | 0.981937 | 0.059802 | 0.040944 | -0.499299 |
low | 0.989495 | 0.991748 | 1.000000 | 0.974921 | 0.019876 | 0.000597 | -0.526592 |
clos | 0.951494 | 0.981937 | 0.974921 | 1.000000 | 0.190835 | 0.172378 | -0.636568 |
diff | -0.033554 | 0.059802 | 0.019876 | 0.190835 | 1.000000 | 0.999689 | -0.423279 |
rate | -0.052020 | 0.040944 | 0.000597 | 0.172378 | 0.999689 | 1.000000 | -0.413365 |
gvol | -0.435202 | -0.499299 | -0.526592 | -0.636568 | -0.423279 | -0.413365 | 1.000000 |
sns.heatmap(df.corr() , vmin=-1, vmax=1,
cmap=sns.diverging_palette(20, 220, as_cmap=True) )
'비즈니스 분석가 양성과정' 카테고리의 다른 글
[21일차] BDA과정 데이터베이스와 SQL (0) | 2021.11.16 |
---|---|
[16일,17일,18일,19일,20일 ] BDA과정 EDA-Project (0) | 2021.11.16 |
[14일차] BDA과정 - Python Crawler(파이썬 크롤링) (0) | 2021.11.05 |
[12일 ,13일] BDA 과정 - 탐색적분석 (0) | 2021.11.04 |
[11일차] BDA 과정 - 데이터분석을 위한 파이썬 (0) | 2021.11.02 |
Comments