본문 바로가기
배움 로그/data science

KRX 업종 분류 crawling error 해결

by eple 2023. 12. 7.
728x90
반응형

 

정부 관련 홈페이지가 working이 안되고나서, 복구 후에 다시 crawling 시도하자 생긴 error가 있었다. 

ValueError: Excel file format cannot be determined, you must specify an engine manually.

KRX stockcode crawling completed : 20231120
Traceback (most recent call last):
  File "crawling-candle.py", line 15, in <module>
  File "crawlingmodule.py", line 285, in krx_stock_type
  File "pandas\util\_decorators.py", line 211, in wrapper
  File "pandas\util\_decorators.py", line 331, in wrapper
  File "pandas\io\excel\_base.py", line 482, in read_excel
  File "pandas\io\excel\_base.py", line 1656, in __init__
ValueError: Excel file format cannot be determined, you must specify an engine manually.
[2832] Failed to execute script 'crawling-candle' due to unhandled exception!

 

검색하여 찾아보니 engine을 수동으로 지정해주면 되는데, xlsx 파일일 경우에는 engine 설정을 openpyxl로 지정하면 된다고 하여 지정! 그랬더니만.. 또 아래와 같이 error가 나면서 해결이 안되었다. 

zipfile.BadZipFile: File is not a zip file

Exception has occurred: BadZipFile
File is not a zip file
  File "C:\workspace\freshberries\crawling-code\crawlingmodule.py", line 255, in krx_investor
    df = pd.read_excel(BytesIO(r.content), engine="openpyxl")
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\workspace\freshberries\crawling-code\crawlingmodule.py", line 477, in krx_daily_crawling
    crawling_result.append(krx_investor(tdate, invstTpCd))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\workspace\freshberries\crawling-code\crawling-investor.py", line 26, in <module>
    agency = cm.krx_daily_crawling("investor", 7050, 20)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
zipfile.BadZipFile: File is not a zip file

 

또 stackoverflow 찾아보니 
1) zip 파일이 아니어서 그렇다와
2) 파일이 열고 닫힐 때 임시 파일이 생겨서 그렇다는 
3) Excel 말고 csv로 수집을 해라 와 같은 솔루션들을 보고 
3)번을 수행했더니, 

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xac in position 10: invalid start byte

Exception has occurred: UnicodeDecodeError
'utf-8' codec can't decode byte 0xac in position 10: invalid start byte
  File "C:\workspace\freshberries\crawling-code\crawlingmodule.py", line 397, in krx_stock_code
    df = pd.read_csv(BytesIO(r.content), encoding='utf-8', sep='\t')
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\workspace\freshberries\crawling-code\crawling-candle.py", line 15, in <module>
    stockcode = cm.krx_stock_code(tdate).merge(cm.krx_stock_type(tdate), left_on='단축코드', right_on='종목코드', how='left')
                ^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xac in position 10: invalid start byte

 

Unicode 에러는 encoding을 cp949, euc-kr등으로 바꿔도 해결이 안되길래 결국은 2)번과 편법으로 코드를 마무리하자 해결되었다. 

우선은 with 구문 추가 , 사실은 이것만으로 해결이 되지는 않았다. 

    with BytesIO(r.content) as fh:
        df = pd.read_excel(fh, engine="openpyxl")
        df['일자'] = tdate
        print('KRX sector info crawling completed :', tdate)

업종 현황의 경우, kospi, kosdaq 두개를 한 함수 내에서 동시에 요청했었는데, 함수를 분리하고
시간차를 두고 crawling을 요청하는 것으로  아예 물리적인 분리 요청을 진행하여 완성... 

 

 

다른 krx crawling은 시간차 없어도 잘 crawling 되기에, 이를 찾아내는 데도 엄청 오래걸렸다. 
여튼 해결이 되었으니 남기는 로그! 

댓글