추가사항
상영관 코드 추가
일일이 손으로… 까지는 아니고 cgv 웹사이트를 통해서 상영관 코드 데이터를 얻었고, 이를 csv 파일로 만들었다. 아이맥스관과 DRIVE IN 자동차 극장의 경우에는 따로 표시를 달았다. 다만 Cine de Chef의 경우에는 제외하였다.
csv 파일은 하술하는 Github Repo에 업로드하였으니 필요하신 분들이 다운로드하고, 이를 이용해서 더 좋은 코드를 만들 수 있을 것 같다.
영화관 및 날짜 입력
지난 포스팅에서는 영화관을 입력받지 않고 우선 지정해둔 영화관 코드를 통해서 기능만 테스트해보았다. 이제 상영관 코드 데이터를 확보했으니, 영화관 이름과 날짜를 입력받아서 영화 정보를 얻어오는 기능을 구현하였다.
현재 전체 코드
주석을 포함한 전체 코드는 현재 아래와 같다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
from pyprnt import prnt
import requests
import pandas as pd
from bs4 import BeautifulSoup
def get_theater_code_from_name(theater_data, theater_name:str):
"""get theater code from theater name
Args:
theater_data (pd.DataFrame): dataframe containing theater data
theater_name (str): theater name, requires exact match ex) 용산아이파크몰
"""
theater_code = theater_data[theater_data['name'] == theater_name]['code'].values[0]
return theater_code
def get_url_with_query(theater_code:str, date:str):
"""get url with query
Args:
theater_code (str): theater code, ex) 0013
date (str): date, follows format 'YYYYMMDD'
Returns:
url (str): url with query
"""
base_url = 'http://www.cgv.co.kr/common/showtimes/iframeTheater.aspx?theatercode={}&date={}'
return base_url.format(theater_code, date)
def get_soup(url:str):
"""get soup from url
Args:
url (str): url
Returns:
soup (BeautifulSoup): BeautifulSoup object
"""
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15"}
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'html.parser')
return soup
def clean_text(text:str):
"""remove whitespace, newline, tab, etc.
Args:
text (str): text
Returns:
text (str): cleaned text
"""
text = text.replace('\n', '')
text = text.replace(' ', '')
text = text.replace('\r', '')
text = text.replace('총', '')
return text
def crawl_movie_info(soup):
"""crawl movie info from soup
Args:
soup (BeautifulSoup): BeautifulSoup object
Returns:
data_dict_list (list): list of dicts containing movie info
"""
movies = soup.select('body > div > div.sect-showtimes > ul > li')
data_dict_list = []
for each_movie in movies:
title = each_movie.select_one('div.info-movie > a > strong').text.strip()
data_dict = {}
# Get movie hall information
hall_info = each_movie.select('div.type-hall > div.info-hall > ul')
hall_info_list = []
for each_hall_info in hall_info:
each_hall_info_dict = {}
each_hall_info_dict['hall_type'] = clean_text(each_hall_info.select('li')[0].text)
each_hall_info_dict['hall_name'] = clean_text(each_hall_info.select('li')[1].text)
each_hall_info_dict['hall_total_seat'] = clean_text(each_hall_info.select('li')[2].text)
hall_info_list.append(each_hall_info_dict)
# Get movie time information
timetable_info = each_movie.select('div.type-hall > div.info-timetable > ul')
timetable_info_list = []
for each_timetable_info in timetable_info:
each_time_list = []
for each_time in each_timetable_info.select('li'):
text = each_time.text.replace('잔여좌석', '')
try:
link = 'https://www.cgv.co.kr' + each_time.find('a')['href']
except:
link = None # 매진의 경우 link가 없음, 예외처리
each_time_list.append([text[0:5], text[5:], link]) # 시간, 잔여좌석, link
timetable_info_list.append(each_time_list)
# Build data_dict
data_dict['movie_title'] = title
data_dict['hall_list'] = hall_info_list
assert len(hall_info_list) == len(timetable_info_list)
for i in range(len(hall_info_list)):
data_dict['hall_list'][i]['timetable'] = timetable_info_list[i]
data_dict_list.append(data_dict)
return data_dict_list
def load_theater_data():
"""load theater data from csv file
Returns:
theater_data (pd.DataFrame): dataframe containing theater data
"""
df = pd.read_csv('theater_data.csv', converters={i: str for i in range(0, 200)}, encoding='utf-8')
return df
def get_movie_info(theater_name:str, date:str):
"""get movie info from cgv
Args:
theater_name (str): theater name, requires exact match ex) 용산아이파크몰
date (str): date, follows format 'YYYYMMDD'
Returns:
data_dict_list (list): list of dicts containing movie info
"""
theater_data = load_theater_data()
theater_code = get_theater_code_from_name(theater_data, theater_name)
url = get_url_with_query(theater_code, date)
soup = get_soup(url)
data_dict_list = crawl_movie_info(soup)
return data_dict_list
if __name__ == '__main__':
theater_name = input('영화관 이름을 입력하세요: ')
date = input('날짜를 입력하세요(ex: 20220101): ')
data_dict_list = get_movie_info(theater_name, date)
prnt(data_dict_list)
실행 결과
현재 실행 결과는 아래와 같다.
Github에 Repo를 업로드
Github Repo 를 생성했다!
다음 목표
- 영화관 이름을 대략적으로만 입력해도 영화관 코드를 반환할 수 있도록 하기
- 예를 들어서 울산광역시 남구 삼산동에 위치한 CGV는 이름이 ‘울산삼산’ 인데, 그 대신 ‘삼산’ 만 입력해도 코드를 반환할 수 있도록 하기
- 일종의 검색 기능을 제공
- 슬랙봇을 제작해서 연동
- 이전에 CLI 환경에서 원하는 기능을 구현해두고 슬랙봇으로 옮기는 식으로 구현