본문 바로가기
파이썬

공개 API로 전세계 시간 가져오기. 파이썬

by 진심블로그 2024. 3. 15.

안녕하세요. 파이신입니다.

 

오늘은 크롤링, 스크래핑 말고 전 세계 시간을 가져오는 방법을 알아봅니다.

 

- 본 글은 파이썬 중급자 이상이 읽어 보기에 적합합니다

 

복잡한 스크래핑 없이 데이터를 가져온다면 좋은 방법입니다.

 

또한 회원 가입이나 절차 없이 데이터를 가져올 수 있다면 더 좋은 방법입니다.

 

데이터를 제공하는 웹사이트들은 대부분 회원가입을 하고 키를 발급하는 등의

절차를 거쳐서 API를 사용할 수 있게 하는데요.

 

이런 게 번거로워서 그냥 네이버 같은 포털사이트의 일부 페이지에서 

데이터를 스크래핑하는 경우들을 많이 봅니다.

 

스크래핑에 익숙하다면 뭐 나쁜 방법은 아닙니다

 

그렇지만 웹페이지의 해당 부분에 조금이라도 수정이 되면,

스크래퍼가 아예 동작을 하지 않을 수도 있습니다.

 

반면, API를 제공하는 사이트들은 어지간해서는 API를 바꾸지 않습니다.

 

바꾼다고 하더라도,

사전에 사용자들이 알 수 있게 공지를 하니 대응이 가능합니다.

 

다만 오늘 알려 드릴 공개 API 같은 경우는 회원 가입등이 없으니

API 변경이 있더라고 사전 공지 같은 건 없습니다.

 

그렇지만, 간단한 내용이고 범용 API라서 인터페이스가 바뀌는 일은 거의 없다고

봐도 괜찮습니다.

 

 

오늘 알아볼 API는 timeapi입니다.

 

코드를 만들어 봅니다.

 

import requests
import json
url = 'https://timeapi.io/api/TimeZone/AvailableTimeZones'

zone_dict = requests.get(url).json()
zone_dict

 

기본 url은 timeapi... 이후 부분입니다

 

입력가능한 시간대를 모두 가져옵니다.

 

결과는 다음과 같습니다.

 

 

상당히 많습니다.

 

위에는 출력을 줄여서 보여주지만, 다 출력해서 보면 Asia/Seoul이 있습니다.

 

대한민국 서울의 시간을 가져와 봅니다.

 

url = 'https://timeapi.io/api/Time/current/zone?timeZone=Asia/Seoul'
time_dict = requests.get(url).json()
time_dict

 

 

 

 

직관적인 결과값을 가져옵니다.

 

json 타입이고, 딕셔너리로 변경해서 보고 있습니다.

 

datetime 타입뿐만 아니라, 연월일의 값을 직접 가져올 수 있어서 편합니다.

 

코딩 시에 편하라고, 파라미터로도 가져와 봅니다.

 

url = 'https://timeapi.io/api/Time/current/zone'
params = {'timeZone':'Asia/Seoul'}
time_dict = requests.get(url, params=params).json()
time_dict

 

 

다음과 같이, 같은 결과를 가져옵니다.

 

 

이젠 위 API를 활용해 봅니다.

 

서울과 LA의 시간차이를 계산해 봅니다.

 

get_current_time_api_url = 'https://timeapi.io/api/Time/current/zone'
params = {'timeZone':'Asia/Seoul'}
time_dict = requests.get(get_current_time_api_url, params=params).json()

date = time_dict['dateTime'].split('T')[0]
time = time_dict['dateTime'].split('T')[1].split('.')[0]
cur_time = datetime.strptime(f'{date} {time}','%Y-%m-%d %H:%M:%S')

data_dict = {
  "fromTimeZone": "Asia/Seoul",
  "dateTime": datetime.strftime(cur_time,'%Y-%m-%d %H:%M:%S'), #'2023-02-22 15:20:00', 
  "toTimeZone": "America/Los_Angeles",
  "dstAmbiguity": ""
}
data_json = json.dumps(data_dict)
headers = {
  'accept' : 'application/json',
  'Content-Type':'application/json'}
conversion_api_url = 'https://timeapi.io/api/Conversion/ConvertTimeZone'

 

복잡해 보이는데, 뭐 간단합니다.

 

먼저  post에 넘기는 data를 dict으로 만들어 둡니다.

다음에, json으로 넘겨야 할 때는 dict을 json으로 바꾸어 줍니다.

 

header가 나오는데, post 할 때는 header를 꼭 넣어야 합니다.

 

conv_dict = requests.post(conversion_api_url, headers=headers, data=data_json).json()
conv_dict = requests.post(conversion_api_url, json=data_dict).json()

 

이건 json() 사용과 관련한 건데, 2개 모두 동작합니다.

 

다만 data를 넘길 때 json=data_dict로 하면 headers의 'Content-Type':'application/json' 부분이 자동으로 넘어가므로 headers를 생략할 수 있습니다.

 

이제 시간차를 계산해 봅니다.

 

conv_time = conv_dict['conversionResult']['dateTime'].split('T')
conv_time = conv_time[0]+' '+conv_time[1]
conv_time = datetime.strptime(conv_time, '%Y-%m-%d %H:%M:%S')

time_diff = cur_time - conv_time
hour_diff = cur_time.hour - conv_time.hour
day_diff = cur_time.day - conv_time.day

print(cur_time, conv_time, day_diff, hour_diff)
print(time_diff)

 

여기서 많이들 실수하게 됩니다.

 

la가 우리보다 느리니 -로 계산하면 시간차가 제대로 안 나오고,

날짜로 계산하면 하루가 차이 나면서 시간이 줄어듭니다.

 

위의 코드는 정확하게 양수로 시간차이를 계산합니다.

 

시간차이 계산할 때 잘 활용하세요