Python

주식투자 파이썬으로 해보자_금융데이터 수집하기#2

5시의그림자 2022. 9. 27. 16:20

"주식투자 파이썬으로 해보자" 두 번째 글입니다.

 

지난 글(https://makes-sense.tistory.com/2?category=958178)에 이어서 

종목별 상세 데이터를 가져오는 방법을 소개해드리겠습니다.

 

#STEP 5, PER/PBR/배당수익률(개별종목) 데이터 가져오기

방식은 앞선 글에서 했던 방식과 동일한 방식을 사용합니다.

먼저 우리가 데이터를 가져올 사이트를 파보겠습니다.

 

KRX 정보데이터시스템(data.krx.co.kr)에서

정보시스템의 [통계] > [기본통계] > [주식] > [세부안내] 중 [12021] PER/PBR/배당수익률(개별종목) 으로 들어가면

아래와 같은 화면이 나옵니다.

페이지 접속 후 F12(개발자 도구화면)을 열고 다운로드 버튼을 클릭한 후 "CSV"를 눌러줍니다.

개발자 도구의 Network 탭을 살펴보면 generate.cmd와 download.cmd 두 항목이 생성된 것을 확인할 수 있습니다.

프로세스를 뜯어보겠습니다.

앞선 글에서 했던 것과 완전히 똑같은 프로세스입니다. 바로 코드를 보여드리겠습니다.

 

# 개별종목 업종분류 OTP 발급
gen_otp_url = "http://data.krx.co.kr/comm/fileDn/GenerateOTP/generate.cmd"
gen_otp_data = {"searchType" : '1',
                "mktId" : 'ALL',
                "trdDd" : '220926',
                "csvxls_isNo" : 'false',
                "name" : 'fileDown',
                "url" : 'dbms/MDC/STAT/standard/MDCSTAT03501'}

otp = requests.post(gen_otp_url, params = gen_otp_data)
otp = BeautifulSoup(otp.content, "html.parser").text

# 코스닥 업종분류 데이터 다운로드
down_url = 'http://data.krx.co.kr/comm/fileDn/download_csv/download.cmd'
data = {"code" : otp}
header = {"referer" : gen_otp_url}
down_ind = requests.post(down_url, data= data, headers = header).content.decode('EUC-KR')
down_ind = io.StringIO(down_ind)
down_ind = pd.read_csv(down_ind, sep = ',')
down_ind['종목명'] = down_ind['종목명'].str.strip()
down_ind.to_csv('data/krx_ind.csv',encoding='UTF-8', index = False)

1. gen_otp_url에 요청사항을 제출할 URL을 입력합니다.

2. gen_otp_data에 요청사항을 dictionary 형태로 만들어줍니다.

3. request.post를 통해 gent_otp_url에 gen_otp_data를 전송합니다.

4. BeautifulSoup을 통해 HTML 내용을 text로 읽어줍니다.

5. down_url에 다운로드를 요청할 URL을 입력합니다.

6. data에 dictionary형태로 OTP값을 넣어줍니다.

7. referer에 gen_otp_url을 넣어줍니다. referer란 각각의 웹사이트로 방문할 때 남는 흔적입니다. 서버가 로봇으로 인식하지 않도록 첫 번째 방문한 URL를 referer로 사용합니다.

8. request.post를 통해 down_url로 OTP값을 제출합니다. 데이터는 EUC-KR로 인코딩 되어 있으니 decode('EUC-KR')를 통해 풀어줍니다.

9. io.StringIO를 통해 문자열을 파일처럼 변경 후 pandas로 읽어줍니다.

 

앞에서 한 방법과 완전 동일하죠?

그럼 데이터가 잘 들어왔는지 확인해보시죠.

 

2473개 종목의 상세 데이터를 잘 가져왔습니다.

 

이제 재료를 다 모았으니, 본격적인 분석작업에 들어가보겠습니다.