inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Tạo phòng giao dịch Python cho đầu tư định lượng - Phần 1

StockListing 함수 직접 만들기 (22년 1월 이후 FinanceDataReader의 StockListing 함수 결과값이 달라짐) 강의편에서 크롤링 함수 오류가 납니다.

386

an207

1 câu hỏi đã được viết

0

알려주신대로,

def StockListing() :

import requests

import pandas as pd

import json

try :

from pandas import json_normalize

except importError:

from pandas.io.json import json_normalize

data = {'bld':'dbms/comm/finder/finder_stkisu', 'locale':'ko_KR',}

r = requests.post('http://data.krx.co.kr/comm/bldAttendant/getjsondata.cmd', data=data)

jo = json.loads(r.text)

df = json_normalize(jo,'block1')

df_info = df[['short_code', 'codeName']]

df_info.columns = ['Symbol','Name']

return df_info

df = StockListing()

JSONDecodeError                           Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_3876\2969629370.py in <module>
     19     df_info.columns = ['Symbol','Name']
     20     return df_info
---> 21 df = StockListing()

~\AppData\Local\Temp\ipykernel_3876\2969629370.py in StockListing()
     13 
     14     r = requests.post('http://data.krx.co.kr/comm/bldAttendant/getjsondata.cmd', data=data)
---> 15     jo = json.loads(r.text)
     16     df = json_normalize(jo,'block1')
     17     df_info = df[['short_code', 'codeName']]

~\anaconda3\lib\json\__init__.py in loads(s, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    344             parse_int is None and parse_float is None and
    345             parse_constant is None and object_pairs_hook is None and not kw):
--> 346         return _default_decoder.decode(s)
    347     if cls is None:
    348         cls = JSONDecoder

~\anaconda3\lib\json\decoder.py in decode(self, s, _w)
    335 
    336         """
--> 337         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    338         end = _w(s, end).end()
    339         if end != len(s):

~\anaconda3\lib\json\decoder.py in raw_decode(self, s, idx)
    353             obj, end = self.scan_once(s, idx)
    354         except StopIteration as err:
--> 355             raise JSONDecodeError("Expecting value", s, err.value) from None
    356         return obj, end

JSONDecodeError: Expecting value: line 16 column 3 (char 36)

이런 오류가 나는데, 어떻게 해결해야 할까요?

python 함수형-프로그래밍 차트분석 퀀트

Câu trả lời 1

0

JINHWANG KIM

이 오류는 fdr.StockListing('KRX') 호출 시 KRX 마켓 데이터를 가져오기 위해 요청한 URL 응답이 JSON 형식이 아닌 빈 응답 혹은 HTML이라서 json.loads()가 실패해서 발생하는 문제입니다.


핵심 원인

FinanceDataReader 내부에서 사용하는 KRX 사이트최근 변경되었거나, 크롤링 방지/접근 차단(403, 200 HTML)이 걸린 경우입니다.

특히 fdr 0.9.50 이후부터 KRX 관련 API가 자주 깨지는 현상이 발생하고 있습니다.


해결 방법 1: fdr 최신 버전으로 업그레이드

먼저 최신 버전인지 확인하세요:

pip install -U finance-datareader

현재 기준 최신 안정 버전은 0.9.81입니다.
확인:

import FinanceDataReader as fdr
print(fdr.__version__)

그럼에도 여전히 fdr.StockListing('KRX')에서 오류가 나면 다음 방법으로 우회해야 합니다.


해결 방법 2: 수동으로 KRX 상장기업 목록 가져오기 (우회)

KRX에서 직접 CSV로 받거나 GitHub에 있는 미러 데이터를 사용:

import pandas as pd

# KRX 상장 기업 목록 (코자존이 올려둔 GitHub 백업 데이터)
df_krx = pd.read_csv("https://raw.githubusercontent.com/corazzon/finance-data-analysis/main/krx.csv")

# 확인
print(df_krx.head())

이 방법은 실시간은 아니지만, 실제 fdr 내부에서도 옛날엔 이 파일을 기반으로 했습니다.


해결 방법 3: KRX Open API 직접 호출 (고급)

KRX의 공식 데이터를 직접 요청하려면 다음과 같은 POST 요청을 구성해야 합니다.
(예전엔 fdr가 이걸 대신해줬지만, 요즘 잘 안됩니다)

예:
https://data.krx.co.kr/contents/MDC/MDI/mdiLoader에 적절한 payload로 요청
하지만 이건 header, session, params 다 맞춰야 해서 꽤 번거롭습니다.


🔚 결론

  • FinanceDataReader.StockListing('KRX')는 종종 깨짐 (KRX 사이트 변경 때문)

  • 임시 해결: fdr 최신화 또는 CSV 백업본 사용

  • 장기적 해결: 별도 크롤러 구현 필요 (공식 API 쓰기)


필요하시면 최신 KRX 상장사 목록을 CSV로 직접 내려드릴 수도 있습니다. 원하시나요?

 

 

이거라도 ...

0

run012

저도 위 에러사항으로 검색이 되지 않습니다.
최신 KRX 상장사 목록을 CSV로 직접 받을 수 있는 방법을 원합니다.

안티그래비티 업데이트?

0

26

2

데이터 전처리 시 문의

0

13

1

random_state 값

0

15

1

인코딩 사용여부

0

15

1

섹션 2 확률변수 자료 문의

1

14

1

인코딩 전 데이터 합치기 질문드립니다!

0

17

0

Antigravity CLI로 완전히 통합 및 전환관련문의

0

22

1

antigravity 2.0은 화면이 많이 다르네요.

0

29

2

추가 질문사항입니다.

0

24

2

분석결과에 대한 질문

0

22

2

f를 붙여야 하는 이유

0

16

1

섹션5. 회귀 강의 관련 질문드립니다

0

24

2

36. 텔레그램 연동(특강) 노션 링크

0

21

2

수강기간연장 문의드립니다

0

25

1

수강 연장 문의

0

34

2

label 인코딩 에러 발생 원인

0

32

2

LabelEncoding 시 train data 학습(fit_transform, transform)

0

31

2

로지스틱 회귀분석은 옛날거 밖에 없나요?

0

35

2

강의 초반 질문드려요!

0

24

1

사주 정보를 넣고 웹훅

0

25

2

MACD & 오실레이터 with EXCEL 강의 데이터 문의

0

177

1

nbextension 없이는 안되나요?

0

1625

1

StockListing 함수 오류

1

471

1

part 2 강의

0

290

1