분석시각화 대회 코드 공유 게시물은
내용 확인 후
좋아요(투표) 가능합니다.
날씨를 불러오는 코딩인데 잘 안돼서 도움이 필요합니다.
import urllib import urllib.request import json import pandas as pd ServiceKey = open('ServiceKey.txt', 'r').read() url = 'http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst' queryParams = '?' + urllib.parse.urlencode( { urllib.parse.quote_plus('ServiceKey') : '일반 인증키', # key를 바로 입력해도 됩니다. urllib.parse.quote_plus('numOfRows') : '113', # 총 14개의 항목을 3시간 단위로 순차적으로 불러옵니다. 다음날 24시간예보에 필요한 만큼만 가져왔습니다. urllib.parse.quote_plus('dataType') : 'JSON', # JSON, XML 두가지 포멧을 제공합니다. urllib.parse.quote_plus('base_date') : '20211109', # 예보 받을 날짜를 입력합니다. 최근 1일간의 자료만 제공합니다. urllib.parse.quote_plus('base_time') : '1400', # 예보 시간을 입력합니다. 2시부터 시작하여 3시간 단위로 입력 가능합니다. urllib.parse.quote_plus('nx') : '102', # 울산 태양광 발전소 x 좌표입니다. '기상청18_동네예보 조회서비스_오픈API활용가이드.zip'에 포함 된 excel파일을 통해 확인 가능합니다. urllib.parse.quote_plus('ny') : '83' # 울산 태양광 발전소 y 좌표입니다. '기상청18_동네예보 조회서비스_오픈API활용가이드.zip'에 포함 된 excel파일을 통해 확인 가능합니다. } ) response = urllib.request.urlopen(url + queryParams).read() response = json.loads(response) fcst_df = pd.DataFrame() date = '2021-11-09' fcst_df['Forecast_time'] = [f'{date} {hour}:00' for hour in range(24)] row_idx = 0 for i, data in enumerate(response['response']['body']['items']['item']): if i > 19: if data['category']=='REH': fcst_df.loc[row_idx, 'Humidity'] = float(data['fcstValue']) print('category:Humidity,',data['category'], 'baseTime:',data['baseTime'], ', fcstTime:', data['fcstTime'], ', fcstValue:', data['fcstValue']) elif data['category']=='T3H': fcst_df.loc[row_idx, 'Temperature'] = float(data['fcstValue']) print('category:Temperature,',data['category'], 'baseTime:',data['baseTime'], ', fcstTime:', data['fcstTime'], ', fcstValue:', data['fcstValue']) elif data['category']=='SKY': fcst_df.loc[row_idx, 'Cloud'] = float(data['fcstValue']) print('category:Cloud,',data['category'], 'baseTime:',data['baseTime'], ', fcstTime:', data['fcstTime'], ', fcstValue:', data['fcstValue']) elif data['category']=='VEC': fcst_df.loc[row_idx, 'WindDirection'] = float(data['fcstValue']) print('category:WindDirection,',data['category'], 'baseTime:',data['baseTime'], ', fcstTime:', data['fcstTime'], ', fcstValue:', data['fcstValue']) elif data['category']=='WSD': fcst_df.loc[row_idx, 'WindSpeed'] = float(data['fcstValue']) print('category:WindSpeed,',data['category'], 'baseTime:',data['baseTime'], ', fcstTime:', data['fcstTime'], ', fcstValue:', data['fcstValue'], '\n') row_idx+=3 # # See PyCharm help at https://www.jetbrains.com/help/pycharm/
C:\ProgramData\Anaconda3\envs\pythonProject4\python.exe C:/Users/dlwpe/PycharmProjects/pythonProject6/main.py
Traceback (most recent call last):
File "C:\Users\dlwpe\PycharmProjects\pythonProject6\main.py", line 29, in <module>
response = json.loads(response)
File "C:\ProgramData\Anaconda3\envs\pythonProject4\lib\json\__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "C:\ProgramData\Anaconda3\envs\pythonProject4\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\ProgramData\Anaconda3\envs\pythonProject4\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Process finished with exit code 1
https://dacon.io/codeshare/2555 올라온 글 따라서 해봤는데, 잘 안 됩니다. 이유를 좀 알 수 있을까요?
queryParams 변수 선언시,
urllib.parse.quote_plus('ServiceKey') : '일반 인증키', # key를 바로 입력해도 됩니다.
이 부분에 '일반 인증키' 대신 직접 발급받으신 서비스키 값을 넣으셨나요?
도와주셔서 감사합니다
https://www.data.go.kr/data/15084084/openapi.do 기상청_단기예보 조회서비스 여기서 받았고
네 서비스키 값을 넣었습니다.
urllib.parse.quote_plus를 사용하여 queryParams를 만드는 과정에서 의도한대로 queryParams가 만들어지지 않았을 수 있습니다.
url 뒤에 처음에는 '?'를 붙이고, 그 이후에는 '&'로 옵션 값들을 이어붙어줘야합니다.
params_dict = {
'ServiceKey' : ServiceKey,
'numOfRows' : 10, #한 페이지 결과 수
'dataType' : 'JSON', #XML or jSON
'base_date' : '20211110', # 발표일자
'base_time' : '0600', #발표시각
'nx' : 55, #예보지점 x좌표
'ny' : 127 #예보지점 y좌표
}
queryParams = ''
first_questionmark = 1
for key in params_dict.keys() :
if first_questionmark :
queryParams += '?' + key + '=' + str(params_dict[key])
first_questionmark = 0
else :
queryParams += '&' + key + '=' + str(params_dict[key])
이렇게 queryParams 변수를 만들어서 시도해보시겠어요??
response = json.loads(response)
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
제가 좀 더 공부해보고 도전할게요
도와주셔서 감사합니다.
데이콘(주) | 대표 김국진 | 699-81-01021
통신판매업 신고번호: 제 2021-서울영등포-1704호
서울특별시 영등포구 은행로 3 익스콘벤처타워 901호
이메일 dacon@dacon.io | 전화번호: 070-4102-0545
Copyright ⓒ DACON Inc. All rights reserved
안녕하세요.
어떤 API를 사용하셨죠?? API 링크 부탁드립니다.