날씨를 불러오는 코딩인데 잘 안돼서 도움이 필요합니다.

2021.11.09 17:17 2,447 조회
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 올라온 글 따라서 해봤는데, 잘 안 됩니다. 이유를 좀 알 수 있을까요?

로그인이 필요합니다
0 / 1000
DACON.HoneyBee
2021.11.10 12:09

안녕하세요.
어떤 API를 사용하셨죠?? API 링크 부탁드립니다.

DACON.HoneyBee
2021.11.10 12:19

queryParams 변수 선언시,
urllib.parse.quote_plus('ServiceKey') : '일반 인증키', # key를 바로 입력해도 됩니다.
이 부분에 '일반 인증키' 대신 직접 발급받으신 서비스키 값을 넣으셨나요?

ㅇ초보입니다
2021.11.10 14:18

도와주셔서 감사합니다

ㅇ초보입니다
2021.11.10 14:12

https://www.data.go.kr/data/15084084/openapi.do 기상청_단기예보 조회서비스 여기서 받았고
네 서비스키 값을 넣었습니다.

DACON.HoneyBee
2021.11.10 15:12

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 변수를 만들어서 시도해보시겠어요?? 

ㅇ초보입니다
2021.11.10 20:20

response = json.loads(response)
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
제가 좀 더 공부해보고 도전할게요
도와주셔서 감사합니다.