IT지식/빅데이터

토이프로젝트 - (2) 데이터 수집 (with pandas)

매 석 2023. 5. 6. 23:20
반응형

- 배경

 

 

토이프로젝트 - (1) 데이터 수집 (코스피 크롤링)

기본 배경 중간고사 기간은 끝났지만 아직 다음주에 시험이 1개 남아있다. 그래도 최근에 하루 1시간 정도 ...

blog.naver.com

 

과거 라이브러리 사용 대신에 직접 크롤링하여 주가 데이터를 수집하려고 했다.

그래서 네이버 금융을 통해 수집하려 했으나, 코스피와 S&P500의 형식이 달라

다른 사이트에서 데이터를 수집하려고 한 상황이다.

하지만 현재 네이버의 데이터 형식을 수정하여 데이터를 정상적으로

수집을 완료한 상태이다.

 

 

- 코스피 데이터 수집

from bs4 import BeautifulSoup
import pandas as pd
import urllib.request as req
import requests
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62'}
for i in range(1,2):
            url="https://m.stock.naver.com/api/json/sise/dailySiseIndexListJson.nhn?code=KOSPI&pageSize=200&page="+str(i)
            data = requests.get(url,headers=headers)
            value= data.json()   
            kospi = value['result']['siseList']
            df=pd.DataFrame(kospi)
            df=df[['cd','dt','ov','ncv','cv','cr']] #특정 열 선택
            df = df.rename(columns={'cd':'code',"dt":"date",'ov':'open','ncv':'close','cv':'diff','cr':'rate'}) #열 이름 변경
print(df)

 

기본적으로 저번 포스팅에 있던 코드와 비슷하나

for문의 마지막 2줄에서 미국 증시 데이터와 형식을 맞추기 위해

특정 열을 원하는 이름으로 바꾸어 데이터를 저장하였다.

 

 

- 미국 증시 데이터 수집

from bs4 import BeautifulSoup
import pandas as pd
import urllib.request as req
import requests
df=[]

symb=[]
xymd=[]
open=[]
close=[]
diff=[]
rate=[]
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62'}
for i in range(1,100):
            url="https://finance.naver.com/world/worldDayListJson.naver?symbol=SPI@SPX&fdtc=0&page="+str(i)
            data = requests.get(url,headers=headers)
            value= data.json()
            #01       
            for j in range(len(value[0])):
                symb.append(value[j]["symb"])
                xymd.append(value[j]["xymd"])
                open.append(value[j]["open"])
                close.append(value[j]["clos"])
                diff.append(value[j]["diff"])
                rate.append(value[j]["rate"])
            #02
            df=pd.DataFrame({"code":symb, "date":xymd,"open":open,"close":close,
                                  "diff":diff,"rate":rate})
print(df)

 

#01 : 핵심은 이것이다. json 형태이기에 바로 pd.DataFrame을 사용하면 정상적으로 데이터를 사용할 수 없다.

그렇기에, 각각의 요소들을 list에 따로 저장한다.

#02 : 최종적으로 다시 형식에 맞춰 데이터프레임화 시킨다.

+ 위의 코드는 S&P500인데, 다우존스와 나스닥도 위의 url부분만 수정하면 데이터를 얻을 수 있다.

- 결과

이렇게 같은 형식으로 데이터를 얻을 수 있었다.

참고로 데이터의 기간은 for문의 범위를 통해 조절이 가능하다.