티스토리 뷰
"""
안녕하세요, doriri입니다.
이 글에서는 '서울 열린데이터 광장'에 등록 된 지하철 역별 승하차 정보를 xml형태로 가져와서
출력하는 작업을 진행합니다.
"""
1. 서울 열린데이터 광장 apiKey를 준비해주세요. ( 참고 )
2. 저희가 사용할 API는 서울시 지하철호선별 역별 승하차 인원 사이트에서 확인이 가능하며, 요청 인자 및 출력인자는 다음과 같습니다.
( 샘플URL 실행 후 자신에게 맞는 API인지 확인 후에 진행하시는게 좋아요 )
승하차 API 경우에 URL에서 설정해야하는 부분은 'USE_DT'인 것이 확인됩니다.
3. 요청인자를 확인하였으니 Python 개발 작업을 진행합니다. 우선, API URL에 접속하여 xml을 가져오는 작업을 진행합니다.
Python
#-*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import urllib2
def subper(sub) :
url = 'http://openapi.seoul.go.kr:8088/{apiKey}/xml/CardSubwayStatsNew/1/549/'+'20160101'
tree = ET.ElementTree(file=urllib2.urlopen(url))
root = tree.getroot()
return root
if __name__ == "__main__" :
print subper(u'중앙선 회기')
Result
4. URL에 정상적으로 접속되는 것이 확인되었으니, 이제 xml에서 원하는 정보를 출력해보겠습니다.
Python
#-*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import urllib2
def subper(sub) :
LINE_NUM = sub.split(' ')[0]
subName = sub.split(' ')[1]
url = 'http://openapi.seoul.go.kr:8088/{apiKey{/xml/CardSubwayStatsNew/1/549/'+'20160101'
tree = ET.ElementTree(file=urllib2.urlopen(url))
root = tree.getroot()
for data in root.iter("row") :
if data.findtext("LINE_NUM").find(LINE_NUM) != -1 :
if data.findtext("SUB_STA_NM").find(subName) != -1 :
string = "승차 : {0}\n하차 : {1}".format(data.findtext("RIDE_PASGR_NUM"), data.findtext("ALIGHT_PASGR_NUM"))
return string
if __name__ == "__main__" :
print subper(u'중앙선 회기')
Result
findtext의 경우 xml에서 해당하는 태그를 찾고 태그에 둘러싸인 값을 가져옵니다. 후에 find를 통하여 원하는 호선 및 역 이름을 찾는 코드입니다. ( 출력인자 참고 )
정상적인 출력결과 ( 숫자 값은 다를 수 있습니다. )
5. 다음으로는 API가 업데이트되는 9일+넉넉하게 1일 잡아 10일전 데이터를 동적으로 가져오도록 datetime 모듈을 사용하면 완료!
Python
#-*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import urllib2
import datetime, time
from datetime import timedelta
def subper(sub) :
LINE_NUM = sub.split(' ')[0]
subName = sub.split(' ')[1]
today = str(datetime.date.today() + timedelta(days = -10))
url = 'http://openapi.seoul.go.kr:8088/{apiKey{/xml/CardSubwayStatsNew/1/549/'+today.replace('-','')
tree = ET.ElementTree(file=urllib2.urlopen(url))
root = tree.getroot()
for data in root.iter("row") :
if data.findtext("LINE_NUM").find(LINE_NUM) != -1 :
if data.findtext("SUB_STA_NM").find(subName) != -1 :
string = "승차 : {0}\n하차 : {1}".format(data.findtext("RIDE_PASGR_NUM"), data.findtext("ALIGHT_PASGR_NUM"))
return string
if __name__ == "__main__" :
print subper(u'중앙선 회기')
Result
6. 이제 작업을 모두 마쳤으니 다음과 같이 결과만 조금 꾸며주는정도로 해주시면 될 것 같아요!
"""
감사합니다!
궁금점 및 피드백 사항은 댓글로 달아주세요~
"""
'Python' 카테고리의 다른 글
[Python] 보글 게임 (BOGGLE) (1) | 2016.04.25 |
---|---|
[Python] URL Encoding & Decoding (0) | 2016.04.12 |
[Python] 16진수(Hex) < - > 문자열(String) 변환 (0) | 2016.04.11 |
[Python] 2진수, 8진수, 10진수, 16진수 변환 (0) | 2016.04.11 |
[Python] 위도, 경도 -> 기상청 X, Y 좌표 변환 (1) | 2016.02.01 |