티스토리 뷰

반응형

많은 분들이 크롤링으로 CGV IMAX 예매 알림봇을 많이 만드시더라구요....!! 😎

(크롤러를 이용해 CGV IMAX 명당 자리를 예매하자Python 크롤링을 이용한 IMAX 예매 알림봇 만들기)

 

파이썬으로 영화 예매 오픈 알리미 만들기  라는 무료 인프런 강좌도 있습니다.

가까운 영화관 찾아주는 챗봇 도 좋은 것 같아요

 

저는 영화말고 다른 알림봇이 필요한게 있는데,

일단 위의 블로그들 보고 크롤링 연습만 해보려고 합니다 😉

분명 과제로 한 적이 있는 것 같은데 역시 다 까먹으니 적어둬야합니다...!!! 😓

내친김에(?) CGV, 메가박스, 롯데시네마 상영시간표를 모두 크롤링해보겠습니다 🏋️‍♀️

 

실습환경

- Beatifulsoup와 requests 라이브러리가 설치된 가상환경 (저의 가상환경 이름은  crawling_env)

- jupyter notebook

 

1.  CGV

CGV 상영시간표에 들어가보세요 

크롬 > 개발자 도구의 selector를 영화제목에 가져가보세요 

 

 

그리고 위쪽에 Showtimes  Start 주석쪽을 봐보면 (빨간 박스 쳐둔 부분!!) 

iframe 이라는 태그안에 또다른 URL이 있습니다.
iframe 태그는 현재 HTML 안에 또다른 다큐먼트를 넣을때 사용한다고 합니다. 

src에 있는 링크를 CGV 도메인 주소(www.cgv.co.kr) 뒤에 붙여넣기 해서 접속해보면

http://www.cgv.co.kr/common/showtimes/iframeTheater.aspx?areacode=01&theatercode=0056&date=20200315

오로지 상영시간표만 보여주는 페이지로 들어가게 됩니다. 

 

이 페이지에서 다시 영화제목을 클릭하고 

Copy Selector를 해보세요!! 

 

 

그러면 아래와 같은 selector가 복사됩니다. 

body > div > div.sect-showtimes > ul > li:nth-child(1) > div > div.info-movie > a > strong

 

그 아래 영화제목도 copy selector 해보면 이런 selector가 복사됩니다. 

body > div > div.sect-showtimes > ul > li:nth-child(2) > div > div.info-movie > a > strong

 

패턴을 찾았으니 이런식으로 영화제목을 구할 수 있겠습니다...!! 

 

 

 

영화시간과 좌석수도 제목처럼 selector를 복사해보겠습니다...!! 

 

영화시간

body > div > div.sect-showtimes > ul > li:nth-child(1) > div > div.type-hall > div.info-timetable > ul > li:nth-child(1) > a > em

 

좌석수

body > div > div.sect-showtimes > ul > li:nth-child(1) > div > div.type-hall > div.info-timetable > ul > li:nth-child(1) > a > span

 

 

이렇게 get_timetable  함수를 만들어서 영화시간과 좌석수를 가져올 수 있겠네요!+!

 

 

 

 

2. 메가박스

 

메가박스 상영시간표에 들어가주세요. 

위의 CGV 사이트와 다르게

메가박스는 상영관이나 날짜를 바꿔도 url이 똑같이 https://www.megabox.co.kr/booking/timetable 인 것을 볼 수 있습니다.

 

그럼 get요청이 아니라 post요청 방식이겠군요...!!

post요청을 어떤식으로 하는 지 살펴봅시다. 

크롬 개발자 도구를 켜고 Network를 눌러주세요 그리고 날짜를 바꿔보면 로그가 쌓이는데, 그것을 눌러주세요 

 

 

 

주목해서 봐야할 것은 request URL과 파라미터입니다.

 

 

그리고 Response를 눌러보면 json으로 내려주는 것을 볼 수 있습니다.

 

 

 

해당 url과 parameters를 복붙해서 post요청을 해보면 json응답을 잘 내려주네요 :-) 

 

 

 

저 JSON에서 영화정보를 뽑아서 출력해보면

 

 

아래의 응답과 같이, 같은 영화라도 시간에 따라 다른 element로 배열에 들어가있네요 😱

[{'areaCd': '10',
  'areaCdNm': '서울',
  'areaCdEngNm': '서울',
  'brchNo': '1372',
  'brchNm': '강남',
  'brchEngNm': 'Gangnam',
  'playSchdlNo': '2003151372006',
  'theabNo': '01',
  'theabExpoNm': '1관',
  'theabSeatCnt': 232,
  'theabEngNm': '1',
  'playStartTime': '12:10',
  'playEndTime': '14:27',
  'theabPopupAt': 'Y',
  'theabPopupNo': 1054,
  'seq': 1,
  'seqPopupAt': 'N',
  'seqPopupNo': 0,
  'rpstMovieNm': '다크 워터스',
  'movieNm': '다크 워터스'
  ...
  },
 {'areaCd': '10',
  'areaCdNm': '서울',
  'areaCdEngNm': '서울',
  'brchNo': '1372',
  'brchNm': '강남',
  'brchEngNm': 'Gangnam',
  'playSchdlNo': '2003151372007',
  'theabNo': '01',
  'theabExpoNm': '1관',
  'theabSeatCnt': 232,
  'theabEngNm': '1',
  'playStartTime': '14:45',
  'playEndTime': '17:02',
  'theabPopupAt': 'Y',
  'theabPopupNo': 1054,
  'seq': 2,
  'seqPopupAt': 'N',
  'seqPopupNo': 0,
  'rpstMovieNm': '다크 워터스',
  'movieNm': '다크 워터스'
  ...
  }
  ...
  ]

 

그래서 저는 movieNo으로 영화를 구분하여서 출력하는 함수를 만들었습니다..!

 

 

 

3. 롯데시네마 

롯데시네마 상영시간표에 들어가주세요

위의 메가박스과 비슷하게 날짜를 바꿔도 URL이 그대로 인 것을 보아 post요청인  것 같습니다.

크롬 개발자 도구 > 네트워크에 들어가서 로그를 눌러주세요

 

 

request URL과 파라미터에 주목해주세요 

 

여기 파라미터가 특이하게 key는 paramList, value는 딕셔너리 string으로 되어있는 점을 유의해주세요!+!

 

 

response도 json이네요..!! 

 

 

그럼 이렇게 json가져오는 코드를 작성할 수 있겠습니다. 

 

여기도 메가박스 json과 비슷하게 같은 영화라도 영화시간이 다르다면, 다른 element로 배열에 들어가있습니다.

그러면 아까 만든 함수에서 키값만 바꿔주면 되겠습니다  !+!

 

 

 

앗 그리고 3개의 영화관 모두 오늘 날짜 보다 과거의 날짜로 요청하면 오늘 날짜의 상영시간표를 주는 점을 유의해야합니다..!!

 

 

 

CGV 크롤링.ipynb
0.01MB
메가박스 크롤링.ipynb
0.00MB
롯데시네마 크롤링.ipynb
0.00MB

 

 

 

CGV 크롤링.py
0.00MB
메가박스 크롤링.py
0.00MB
롯데시네마 크롤링.py
0.00MB

 

 

 

 

 

 

반응형
댓글