본문 바로가기

파이썬으로 퀀트 프로그램 만들기 project/웹 크롤링

국내 주식 섹터 데이터 크롤링

728x90

FnGuide Index에서는 WICS 산업분류를 발표합니다.

해당 사이트에서 [WICS] -> [에너지]에 들어가시면 에너지 섹터에 대한 정보가 나옵니다.

여기서 [Components] 탭에 들어가시면 구성종목을 보실 수 있습니다. 이것을  크롤링 해보겠습니다.

 

 

 

우선 해당 페이지에서 개발자 도구 화면을 열고 네트워크를 눌러줍니다. 그리고 페이지에서 조회 날짜를 2023년 9월 5일로 찍어보면 개발자 도구화면에서 통신과정을 볼 수 있습니다. (조회 버튼을 누르는게 아니라 달력에서 해당 날짜를 클릭하세요) 통신과정에서 'GetIndexComponents~' 부분을 클릭 후, request url을 복사해주세요. 그리고 이것을 브라우저 주소창에 붙여넣고 엔터 눌러주세요. 그러면 아래의 이미지 처럼 섹터 정보가 바로 페이지에 나타납니다.

 

 

이것은 JSON 형식의 데이터 입니다. 기존에 우리가 살펴보았던 HTML은 문법이 복잡하고 표현 규칙이 엄격하여 데이터의 용량이 커지는 단점이 있습니다. 반면에 JSON 형식은 문법이 단수하고 데이터의 용량이 작아 빠른 속도로 데이터를 교환할 수 있습니다. 파이썬에서는 json 패키지를 사용해 JSON 형식의 데이터를 크롤링 가능합니다.

 

 

#table 만들기

mysql에서 크롤링 데이터를 담아둘 테이블을 먼저 만들어 줍니다.

use stock_db;

create table kor_price
(
날짜 date,
시가 double,
고가 double,
저가 double,
종가 double,
거래량 double,
종목코드 varchar(6),
primary key(날짜, 종목코드)
);

 

 

#파이썬 실습

import json
import requests as rq
import pandas as pd

#dt 부분에 biz_day 
url = f'''https://www.wiseindex.com/Index/GetIndexComponets?ceil_yn=0&dt={biz_day}&sec_cd=G10'''
#json데이터 받기
data = rq.get(url).json()

#data는 딕셔너리인데 딕셔너리 내부에 각각의 값은 리스트 형태이다.
#이것을 데이터 프레임으로 바꾸겠다.
data_pd = pd.json_normalize(data['list'])

url부분에서 dt부분이 날짜 이므로 이전 포스트에서 구했던 최신 날짜를 넣어줍니다.

그리고 sec_cd부분은 섹터 코드 부분인데, 반복문을 돌리면 모든 섹터에 대한 종목을 얻어낼 수 있습니다.

섹터 코드에 대한 정보는 data안에 있는데, 우선 data.keys()를 통해 key값을 알아냅니다.

'sector'가 섹터 코드에 대한 정보를 담고 있는 것을 알아낼 수 있습니다.

data['sector']을 해보면 섹터 코드 정보를 알 수 있습니다.

 

이제 이것을 이용해 반복문을 통해 모든 섹터에 대한 종목 데이터를 구해보겠습니다.

#반복문을 통해 모든 섹터 종목 불러오기
import time
import json
import requests as rq
import pandas as pd
from tqdm import tqdm #진행속도 확인

sector_code = [
    'G25', 'G35', 'G50', 'G40', 'G10', 'G20', 'G55', 'G30', 'G15', 'G45' 
]

data_sector = []

for i in tqdm(sector_code):
    url = f'''https://www.wiseindex.com/Index/GetIndexComponets?ceil_yn=0&dt={biz_day}&sec_cd={i}'''
    data = rq.get(url).json()
    data_pd = pd.json_normalize(data['list'])

    data_sector.append(data_pd)

    time.sleep(2)#무한 크롤링 예방

 

이제 리스트로 구분되어 있던 섹터별 종목들을 합치겠습니다.

그리고 필요한 열만 선택하고, 기준일 열을 추가하겠습니다.

#데이터 합치기
kor_sector = pd.concat(data_sector, axis = 0)
kor_sector = kor_sector[['IDX_CD', 'CMP_CD', 'CMP_KOR', 'SEC_NM_KOR']]#필요한 열만 선택
kor_sector['기준일'] = biz_day
kor_sector['기준일'] = pd.to_datetime(kor_sector['기준일'])

 

이제 마지막으로 mysql로 데이터를 옮기겠습니다. 옮기기 전에 데이터를 담을 그릇을 미리 만들겠습니다.

mysql로 가서 테이블을 미리 만들어주세요.

use stock_db;

create table kor_sector
(
IDX_CD varchar(3),
CMP_CD varchar(6),
CMP_KOR varchar(20),
SEC_NM_KOR varchar(10),
기준일 date,
primary key(CMP_CD, 기준일)
);

 

다시 파이썬으로 와서 데이터를 옮겨 주시면 됩니다.

#mysql로 데이터 옮기기
import pymysql

con = pymysql.connect(user='root',
                       passwd = '8019',
                       host = '127.0.0.1',
                       db = 'stock_db',
                       charset = 'utf8')

mycursor = con.cursor()
query = f"""
    insert into kor_sector (IDX_CD, CMP_CD, CMP_KOR, SEC_NM_KOR, 기준일)
    values (%s, %s, %s, %s, %s) as new
    on duplicate key update
    IDX_CD = new.IDX_CD, CMP_KOR = new.CMP_KOR, SEC_NM_KOR = new.SEC_NM_KOR;
"""
#upsert 쿼리 작성

args = kor_sector.values.tolist()
mycursor.executemany(query, args)
con.commit()

con.close()