웹 서비스를 이용하여 날씨 정보 얻기 by Python

8049 단어 WebAPI파이썬JSON
livedoor사가 제공하는 일기 예보 웹 서비스 「Weather Hacks」를 사용해, 날씨 정보를 취득해 보려고 생각합니다. WebAPI의 사양등이 여기에 쓰여져 있으므로 읽어 보세요.
그럼, 갑니다.

정보를 취득할 지역을 결정



각 지역에 대해 식별을 위한 id가 할당되며 id를 지정하여 원하는 지역의 날씨 정보를 얻습니다. id 일람 에서 정보를 얻고 싶은 지역의 ID를 확인하십시오.
<pref title="滋賀県">
<warn title="警報・注意報" source="http://weather.livedoor.com/forecast/rss/warn/25.xml"/>
<city title="大津" id="250010" source="http://weather.livedoor.com/forecast/rss/area/250010.xml"/>
<city title="彦根" id="250020" source="http://weather.livedoor.com/forecast/rss/area/250020.xml"/>
</pref>

나는 '오쓰'의 날씨 정보를 얻기로 결정합니다.

정보를 알기 위한 URL 만들기



WebAPI URL에 requests의 get() 메소드로 GET 요청을 보내 날씨 데이터를 가져옵니다. 이를 위해서는 이전에 얻은 지역 ID를 알려야합니다.
WebAPI → ぇ tp : // 우우 아테아 r. 아오오오 r. 코m/후우레카 st/우우b 세르
이 URL의 끝에 쿼리 매개변수로 지역 ID를 추가하여 제출합니다.

검색어 정보를 추가한 URL↓
ぇ tp : // 우우 아테아 r. 아오오오 r. 코 m/후우레카 st/우ぇb세rゔぃ세/j 그런/v1? ty = 250010
URL의 말미에 「?」를 붙여, 그 뒤에 「city(쿼리 정보의 키)=id(값)」를 쓰면 URL+쿼리 정보가 완성됩니다.
이 URL에 액세스해도 의미를 모르기 때문에, 다음으로 디코드를 실시해, 읽기 쉬운 형태로 해 보겠습니다.

정보 얻기



weather hacks에서 반환되는 데이터는 JSON 데이터입니다.
단순히 JSON 데이터를 가져오면 유니코드 이스케이프된 채로 읽을 수 없는 데이터가 반환되므로 디코딩하여 인간이 읽을 수 있는 형태로 고친 JSON 데이터를 가져옵니다.

getJSON.py
import requests
url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=250010'
data = requests.get(url).json()
print(data)

실행 결과
$ python getJSON.py
{'pinpointLocations': [{'link': 'http://weather.livedoor.com/area/forecast/2520101', 'name': '大津市南部'},
{'link': 'http://weather.livedoor.com/area/forecast/2520400', 'name': '近江八幡市'},

...........中略...........

地震による被災地では、災害復旧活動には十分注意してくださ\nい。', 'publicTime': '2018-09-09T19:07:00+0900'}}

범용성을 높이기 위해 getJSON.py를 다시 작성합니다. 실행 결과는 변경되지 않습니다.

getJSON.py
import requests
url = 'http://weather.livedoor.com/forecast/webservice/json/v1?'
query_params = {'city': '250010'}
data = requests.get(url, params=query_params).json()
print(data)

query_params의 id를 다시 작성하여 지역을 변경할 수 있습니다.

오늘 · 내일의 날씨를 얻는다




forecasts 키의 값으로, 오늘 · 내일의 날씨가 목록으로 저장됩니다. (JSON을 보면 내일이 없다)
forecast 키의 첫 번째 요소인 오늘의 날씨 정보를 가지고 있는 JSON 부분을 표시해 보겠습니다.

getForecasts.py
import requests
url = 'http://weather.livedoor.com/forecast/webservice/json/v1?'
query_params = {'city': '250010'}
data = requests.get(url, params=query_params).json()
# 今日の天気のJSON部分を表示する
print(data['forecasts'][0])

실행 결과
{'dateLabel': '今日', 'telop': '曇のち雨', 'date': '2018-09-13', 'temperature': {'min': {'celsius': '18', 'fahrenheit': '64.4'}, 'max': {'celsius': '24', 'fahrenheit': '75.2'}}, 'image': {'width': 50, 'url': 'http://weather.livedoor.com/img/icon/13.gif', 'title': '曇のち雨', 'height': 31}}

다음과 같이 지정하면 데이터를 얻을 수 있습니다.


명세
취득 데이터


data['forecasts'][0]['dateLabel']
오늘

data['forecasts'][0]['telop']
흐린 후 비

data['forecasts'][0]['date']
2018-09-13


그럼, 실제로 오늘・내일의 날씨 정보를 취득해, 표시하는 코드를 작성합니다.

weather.py
import requests
url = 'http://weather.livedoor.com/forecast/webservice/json/v1?'
query_params = {'city': '250010'}
data = requests.get(url, params=query_params).json()
for weather in data['forecasts']:
        print(weather['dateLabel'] + 'の天気:' + weather['telop'])

for문의 처리 내용은 data 리스트로부터 요소를 하나씩 취득해, 'dataLabel'키의 값(예보일)과 'telop'키의 값(날씨)을 출력하고 있습니다.

실행 결과
今日の天気:曇のち雨
明日の天気:曇り

이것을 응용하여 뭔가 만들어 보는 것도 좋을까.
그럼 또 ヾ(・ω・ )

좋은 웹페이지 즐겨찾기