맨땅에 헤딩하는 사람

WICS 섹터 기업 업종 json 포맷 웹크롤링 | python 본문

퀀트/구현

WICS 섹터 기업 업종 json 포맷 웹크롤링 | python

purplechip 2020. 7. 17. 11:35

먼저 이 포스트는 아래 블로그를 기반으로 작성되었다.

http://blog.naver.com/tmddn3020/221851801072

 

R로 금융데이터 수집하기6 - (WICS 기준 섹터 정보)

5번 글에서는 우선주와 스펙주를 제외한 국내 종목들의 종목명 및 티커 데이터를 저장했습니다.이 티커데이...

blog.naver.com

 

주식 DB를 구축하기 위해 가장 먼저 기업의 리스트를 DB화 해야한다. 모든 상장 기업을 반영하는 것은 물론 좋겠지만 데이터 공백이 존재할 수 있다는 점을 염려해서 WICS 중분류로 나뉘어진 기업의 리스트만을 DB화하기로 결정하였다. WICS에 대해 자세히 알고 싶은 사람은 내가 전에 올렸던 글을 참고바란다.

2020/07/16 - [퀀트/이론] - WICS FICS GICS KRX지수 산업분류란?

 

웹크롤링 URL 확인

아래 링크에서 WiseIndex의 WICS 중분류 기업 목록을 확인할 수 있다.

http://www.wiseindex.com/Index/Index#/G1010

그리고 아래 그림처럼 해당 사이트에서 어떤 URL로부터 데이터를 요구하여 통신하는 지 확인이 가능하다.

[그림 1. WICS 중분류 기업 목록 크롤링을 위한 URL 확인]

물론 해당 사이트에서 Selenium을 이용한 동적 웹크롤링도 가능하지만 Request URL을 안다면 훨씬 빠르고 쉽게 크롤링이 가능하다. 확인 방법은 다음과 같다. 

  1. 해당 사이트 접속 후 개발자모드(F12) 실행 → Network 클릭
  2. 사이트에서 Components 탭 클릭
  3. GetIndexComponets?ceil_yn=0&dt=20200716&sec_cd=G1010 클릭
  4. Headers 탭 클릭 후 Request URL에 해당하는 주소 복사

Headers 탭에서 아래로 내려가다보면 Response Headers에 Content-Type: application/json; charset=utf-8을 통해 json 포맷으로 데이터를 통신한다는 것을 알 수 있다. json은 간단하게 데이터 교환 시 사용하는 데이터의 형식이다. 주로 인터넷에서 자료를 주고받을 때 많이 사용되며 "키-값 쌍"으로 이루어져 있다. (파이썬의 dictionary 타입을 생각하면 된다.)

 

해당 URL에서 'dt'에 날짜, 'sec_cd'에 WICS 코드를 넣으면 원하는 데이터를 수신할 수 있다는 사실을 알았다. WICS 코드는 WiseIndex 사이트에서 쉽게 확인할 수 있다.

http://www.wiseindex.com/About/WICS

 

구현 코드

코드는 두 개(qconfig.py, crowling_cmp_sec.py)로 이루어지며 qconfig.py는 설정, crowling_cmp_sec.py는 로직을 담당한다.

qconfig.py

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
wics_lc = {10:'에너지'
           15:'소재'
           20:'산업재'
           25:'경기관련소비재'
           30:'필수소비재'
           35:'건강관리',
           40:'금융'
           45:'IT'
           50:'커뮤니케이션서비스'
           55:'유틸리티'}
 
wics_mc = {1010:'에너지',
           1510:'소재',
           2010:'자본재',
           2020:'상업서비스와공급품',
           2030:'운송',
           2510:'자동차와부품',
           2520:'내구소비재와의류',
           2530:'호텔,레스토랑,레저 등',
           2550:'소매(유통)',
           2560:'교육서비스',
           3010:'식품과기본식료품소매',
           3020:'식품,음료,담배',
           3030:'가정용품과개인용품',
           3510:'건강관리장비와서비스',
           3520:'제약과생물공학',
           4010:'은행',
           4020:'증권',
           4030:'다각화된금융',
           4040:'보험',
           4050:'부동산',
           4510:'소프트웨어와서비스',
           4520:'기술하드웨어와장비',
           4530:'반도체와반도체장비',
           4535:'전자와 전기제품',
           4540:'디스플레이',
           5010:'전기통신서비스',
           5020:'미디어와엔터테인먼트',
           5510:'유틸리티'}
 
def wics_url(date, wics_code):
    '''
    Parameter
    - date[str] : the date corresponding data (yyyymmdd)
    - wics_code[int] : the wics code corresponding data (use wics_lc or wics_mc)
    
    Return
    - url[str]
    '''
    url ='http://www.wiseindex.com/Index/GetIndexComponets?ceil_yn=0&'\
          'dt=' + date + '&sec_cd=G' + str(wics_code)
    return url
 
def comp_url(code):
    '''
    Parameter
    - code[str] : the company code corresponding data
    
    Return
    - url[str]
    '''
    url = 'http://comp.fnguide.com/SVO2/ASP/SVD_Main.asp?pGB=1&'\
          'gicode=A' + code + \
          '&cID=&MenuYn=Y&ReportGB=&NewMenuID=Y&stkGb=701'
    return url
cs

 

crowling_cmp_sec.py

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
import qconfig
import requests
from pandas import DataFrame
 
if __name__=='__main__':
    df = DataFrame(columns=['code''name''ls''ms'])
    date = '20200715'
    # there is no data in the stock market closed day and before market open. 
    # weekends, Jan 1, Dec 31 etc
    
    for wics_code in qconfig.wics_mc.keys():
        response = requests.get(qconfig.wics_url(date, wics_code))
    
        if(response.status_code == 200): # request success
            json_list = response.json() # dictionary
            # response.text -> return str type
            for json in json_list['list']:
                ls = json['SEC_NM_KOR'# Large sector
                ms = json['IDX_NM_KOR'][5:] # Medium sector
                code = json['CMP_CD'# Company code
                name = json['CMP_KOR'# Company korean name
                df = df.append({'code':code, 'name':name, 'ls':ls, 'ms':ms}, 
                          ignore_index=True)
        else:
            print('Error:' + response.status_code)
            print('WICS code:' + str(wics_code))
cs

json은 requests모듈 안에 있는 메소드로 사용이 굉장히 간편하다.

  • Line 12 : requests모듈로 해당 URL을 요청한다.
  • Line 15 : json()메소드를 사용하여 dictionary 타입으로 반환
  • Line 17- : 필요한 부분을 취사선택하여 DataFrame에 저장

이와 같이 모든 WICS 섹터에 대해 크롤링이 가능하며 크롤링된 결과를 python console에서 보면 다음과 같다.

In [72] : df.tail(5)
Out[72]: 
        code      name    ls    ms
2013  003480  한진중공업홀딩스  유틸리티  유틸리티
2014  017390      서울가스  유틸리티  유틸리티
2015  117580     대성에너지  유틸리티  유틸리티
2016  034590    인천도시가스  유틸리티  유틸리티
2017  053050      지에스이  유틸리티  유틸리티
cs

2017개 기업 정보가 크롤링 되었다.

 

참고

WICS 섹터 정보 확인법

http://blog.naver.com/tmddn3020/221851801072

json 포맷 웹크롤링

www.fun-coding.org/crawl_basic3.html

Comments