티스토리 뷰


재미로 시작했던 이 여정의 막을 내릴 때가 왔네요.


그 동안 총 3개의 요청방법을 알게되었습니다.




요청 1. 평창 동계 올림픽의 모든 입장권 리스트 얻음


요청 2. 특정 입장권의 경기 정보를 얻음


요청 3. 특정 입장권의 가격 정보를 얻음




알고리즘은 간단합니다.


알고리즘이라고 하기도 뭐한 수준이지만

import requests

def get_session_list():
	url = "https://tickets.pyeongchang2018.com/Session/GetSessionList";
	payload = {
		"Culture":"ko-kr",
		"SDate":"2018-02-08",
		"EDate":"2018-02-25",
		"SearchKey":"",
		"SeatCount":0,
		"Disciplines":"",
		"Genders":"",
		"Times":"",
		"Stadiums":"",
		"Medal":""
	}
	req = requests.post(url, json=payload)
	res = req.json()
	return res

session_list = get_session_list()
for session in session_list:
	print session["SessionCode"];

모든 경기의 고유값(SessionCode)를 요청1을 통해 수집합니다.




코드를 실행하면 다음과 같이


모든 입장권의 고유값(SessionCode)를 얻을 수 있습니다.



def get_session_info(session_code):
	url = "https://ticketapi.pyeongchang2018.com/api/Session/GetSession/?Culture=ko-kr&SessionCode=" + session_code
	req = requests.get(url)
	res = req.json()
	return res	

def print_session_info(session_info):
	print session_info["DisciplineName"], session_info["EventName"]
	print session_info["StartDate"], session_info["StartTime"], session_info["EndTime"]
	print session_info["ClusterName"], session_info["VenueName"]

session_list = get_session_list()
for session in session_list:	
	session_code = session["SessionCode"]
	session_info = get_session_info(session_code);
	print_session_info(session_info)

각각의 입장권에 대한 경기 정보를 요청2를 통해서 얻습니다.


종목(DisciplineName), 경기명(EventName) 


날짜(StartDate), 시작시간(StartTime), 종료시간(EndTime)


장소(ClusterName), 경기장(VenueName)


이 7개의 정보를 제외하고는 필요없어 보이네요.




모든 입장권에 해당하는 경기가


어떤 경기이고, 언제하고, 어디서 하는지 수집할 수 있습니다.


def get_price_list(session_code):
	url = "https://ticketapi.pyeongchang2018.com/api/Session/GetSessionPriceList/?Culture=ko-kr&SessionCode=" + session_code
	req = requests.get(url)	
	res = req.json()["data"]
	return res

def print_price_list(price_list):	
	for price in price_list:		
		if price["PriceName"] == u"일반":
			print price["PriceLevel"], price["SalesPrice"], price["GP_SeatCount"]

session_list = get_session_list()
for session in session_list:
	session_code = session["SessionCode"]
	session_info = get_session_info(session_code)		
	print_session_info(session_info)		
	price_list = get_price_list(session_code);
	print_price_list(price_list)

각각 입장권에 대한 가격 정보를 요청3을 통해 얻습니다.


여러 카테고리의 가격 정보가 있지만


'일반' 카테고리에 해당하는 가격 정보를 수집합니다.


등급(PriceLevel), 가격(SalesPrice), 잔여석(GP_SeatCount)


등급이 A, B, C, D 최대 4개까지 있을 수 있더군요.




입장권마다의 경기정보, 가격정보가 


출력되는 것을 확인할 수 있네요.




출력된 결과를 살펴보니


이상한 현상이 발견 되었습니다!


경기정보, 가격정보가 번갈아 가면서 출력되어야 하는데


중간에 경기정보는 나오지 않고 가격정보만 나오는 현상이 발생하네요.




명령창에서 파일을 실행시켜 보니 


이런 현상은 없는 것을 확인할 수 있었습니다.


함수 실행이 생략된 것이라기 보다는


Sublime Text 출력의 문제가 아닌가 싶네요.




이제 수집한 데이터를 한 눈에 볼 수 있게 모으고 싶네요


엑셀처럼 보면 한눈에 보기도 쉽고 조작하기도 쉬울 것 같아요


그래서 CSV 파일로 저장하려고 합니다.


def get_session_info_row(session_info):
	keys = ["DisciplineName", "EventName", "StartDate", "StartTime", "EndTime", "ClusterName", "VenueName"]
	row = []
	for key in keys:
		row.append(session_info[key])
	return row

def get_price_list_row(price_list):	
	keys = ["PriceLevel", "SalesPrice", "GP_SeatCount"]
	row = []
	for price in price_list:		
		if price["PriceName"] == u"일반":
			for key in keys:
				row.append(price[key])
	return row

한줄에 들어갈 내용을 배열로 만들어야합니다.


[종목, 경기, 날짜, ... , 장소]


[좌석, 가격, 잔여석 .... 가격, 잔여석]


한 경기에 대해서 위와 같이 만드는 함수를 작성했습니다.


rows = []
session_list = get_session_list()
for session in session_list:
	session_code = session["SessionCode"]
	session_info = get_session_info(session_code)				
	session_info_row = get_session_info_row(session_info)
	price_list = get_price_list(session_code);
	price_list_row = get_price_list_row(price_list)	
	session_info_row.extend(price_list_row)
	rows.append(session_info_row)

for row in rows:	
	for value in row:
		print value
	print

경기 정보 배열(session_info_row)과 가격 정보 배열(price_list_row)을 구해서


경기 정보 배열에 합칩니다

(session_info_row.extend(price_list_row))


합쳐진 배열을 배열에 추가합니다.

(엑셀에 한줄을 추가한다고 생각하면 됩니다)


그렇게 만들어진 이차원 배열을 출력하면



데이터가 잘 저장된 것을 확인할 수 있습니다.


이제 모든 것이 준비된 것 같으니 CSV파일로 저장해봅시다




한글이 포함된 HTML 파일을 저장할 때


codec을 활용했던 것처럼 


한글이 포함된 csv파일을 저장할 때 조금 번거롭습니다.


남이 만든 것을 잘 활용하는 것도 능력이니


unicodecsv를 사용해봅시다.


import unicodecsv
file = open("tickets.csv", "wb")
writer = unicodecsv.writer(file, encoding="utf-8", lineterminator="\n")
header = ["종목","경기","날짜","시작","종료","장소","경기장","A가격","A잔여","B가격","B잔여","C가격","C잔여","D가격","D잔여"]
writer.writerow(header)
for row in rows:	
	writer.writerow(row)

이처럼 아주 간단하게


csv 파일을 생성할 수 있습니다.


첫줄은 각 열(Column)의 값이 무엇을 의미하는지로 사용합니다.


A석인지, B석인지는 굳이 필요없을 것 같아 삭제했습니다 ㅎㅎ





긴 여정 끝에 얻은 산출물이 위와 같습니다.


평창 동계 올림픽의 모든 경기의 입장권 정보를 모두 수집할 수 있었네요.


이제 제게 맞는 조건으로 필터를 적용하면


손쉽게 입장권을 선택할 수 있겠네요.





지금까지 이상한 개발자의 취미글 읽어주셔서 감사합니다


그럼 평창에서 만나요!!

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함