안녕하세요. 파이신입니다.
오늘은 크롤링, 스크래핑 말고 전 세계 시간을 가져오는 방법을 알아봅니다.
- 본 글은 파이썬 중급자 이상이 읽어 보기에 적합합니다
복잡한 스크래핑 없이 데이터를 가져온다면 좋은 방법입니다.
또한 회원 가입이나 절차 없이 데이터를 가져올 수 있다면 더 좋은 방법입니다.
데이터를 제공하는 웹사이트들은 대부분 회원가입을 하고 키를 발급하는 등의
절차를 거쳐서 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가 우리보다 느리니 -로 계산하면 시간차가 제대로 안 나오고,
날짜로 계산하면 하루가 차이 나면서 시간이 줄어듭니다.
위의 코드는 정확하게 양수로 시간차이를 계산합니다.
시간차이 계산할 때 잘 활용하세요
'파이썬' 카테고리의 다른 글
깃허브 git download 사용방법 sqlcipher3 설치 파이썬 (0) | 2024.03.19 |
---|---|
파이썬 datetime, locale, schedule의 다양한 사용사례 (0) | 2024.03.18 |
FreeTypeFont object has no attribute 'measure_text' (0) | 2024.03.17 |
카카오 API 이미지 가져오는 방법. 파이썬 (0) | 2024.03.16 |
카카오 API 파이썬으로 사용하는 방법 (0) | 2024.03.14 |
PIXABAY REST API.by Python. (0) | 2024.03.13 |
픽사베이 무료이미지 사이트 API로 가져오는 방법 (0) | 2024.03.12 |
픽사베이 사이트 무료이미지 API 이용하는 방법 (0) | 2024.03.11 |