평창 동계 올림픽 입장권 찾기 5부
심심풀이로 쓴 글이 벌써 5부네요.
데이터가 리스트를 어떻게 구성하는지 한번 추론해봅시다.
리스트에 보여지는 내용과 데이터를 매칭 해보았습니다.
데이터를 있는 그대로 사용해서 크게 고민할 것도 없었습니다.
예매 가능성만 빼구요.
Ctrl + Shift + C를 누르면
화면에 표시된 부분에 해당하는 HTML 코드를 찾아줍니다.
<td class="bookingPossibilityData"> ... </td>
뭔가 딱 봐도 예매 가능성처럼 생긴 부분이네요
뭔가 우리가 가진 데이터를 가지고
저 부분을 수정하는 스크립트가 있을 것 같은 느낌이 강하게 드는군요.
리스트가 없는 빈 틀이었던
HTML 파일에 검색해보니 이런 스크립트가 있네요
데이터의 저 두 숫자를 이용하는 간단한 코드네요.
GP_OrgSeatCount 중 GP_SeatCount 의 비율로 High, Medium, Low를 판단하나봅니다.
8% 이하이면 Medium
3% 이하이면 Low인가 봅니다.
무려 10%에 육박하니 예매가능성은 High 입니다!!!
아마 전체 좌석 수(GP_OrgSeatCount) 중 예매 가능 좌석수(GP_SeatCount)의 비율이 아닐까 생각합니다.
경기에 대한 정보는 충분하지만
애시당초 알고 싶었던 일반석에 대한 예매 가능성은 파악할 수 없네요
상세 정보를 보려면 위에 영역을 클릭해야 합니다.
클릭하면 호출되는 스크립트 함수가 있네요.
onclick="getSessionDetail('CUR01');"
이 함수가 무슨 함수인지 HTML 코드에서 또 한번 찾아보죠
SC라는 변수에 Code(ex. CUR01) 값을 채워서
POST 방식으로
/Session/Info에
HTTP 요청을 하는 것 같네요.
import requests
def get_session_detail(code):
url = "https://tickets.pyeongchang2018.com/Session/Info";
payload = {
"SC": code
}
req = requests.post(url, json=payload)
return req.text
import codecs
def save_file(filename, content):
file = codecs.open(filename, "w", encoding="utf-8")
file.write(content)
file.close()
res = get_session_detail("CUR01");
save_file("session_info.html", res);
비슷하게 저도 함수 형태로 만들어 보았습니다.
요청에 대한 응답을 HTML 파일로 저장해 보았습니다.
뭔가 익숙한 현상이 보이네요.
틀만 만들어져 있고, 데이터는 비어있는 형태네요.
이번에는 데이터가 어디 있을지 알 것 같네요.
정상적으로 리스트를 클릭해서
상세정보 페이지로 들어가서 XHR을 뒤져봤습니다!!
데이터를 받아오는 것이 보이네요.
이 데이터에 대한 상세한 분석은!
6부에서 이어집니다.