정부 관련 홈페이지가 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 되기에, 이를 찾아내는 데도 엄청 오래걸렸다.
여튼 해결이 되었으니 남기는 로그!
댓글