-
Ajax 웹 크롤러 ( 롯데시네마 )Web Crawler 2019. 12. 11. 06:32
이번에 만들어볼 크롤러는
롯데시네마의 상영 정보를 가져오는 프로그램을 만들어 볼 것이다.
해당 페이지는 사용자가 요청을 할 때 마다 하나의 새로운 페이지를 새롭게 여는 방식이 아니라
사용자가 원하는 페이지의 일부 데이터만 새롭게 불러오는 방식이다. 페이지는 그대로
위와 같은 방식은
Ajax : JavaScript를 사용한 비동기 통신, 클라이언트와 서버간에 XML 데이터를 주고받는 기술
Asynchronous JavaScript and XML
비동기적으로 JavaScript와 XML을 이용하는 방식이라고 할 수 있다.
EX )
사용자는 현재 A페이지에 머물고 있으며 A페이지에서 오늘의 상영 영화의 정보들이 필요함
이때 사용자는 필요한 정보를 서버측에 요청
서버는 사용자에게 해당 정보가 있는 B페이지의 URL 주소로 링크되어 사용자에게 정보를 제공해줌
즉 A페이지에서 -> B페이지로 이동
하지만 Ajax 라이브러리를 통해서 비동기 통신 방식으로 정보를 주고 받을 시
A페이지에서 영화 정보들을 요청할 시
서버는 해당 필요한 정보들을 B페이지에서 처리한 후 사용자가 요청한 정보들을
다시 A페이지로 보내주는 과정을 비동기 통신이라고 함
롯데시네마의 상영정보 페이지는 위와 같이 Ajax라는 JS의 라이브러리를 이용해서 구현 한 것을 확인 할 수 있다.
한번 사진을 보자
롯데시네마의 영화 상영정보 중 11일 날의 영화 정보를 로드 할 때의
network 통신이 이루어 질 때 다음과 같이 xhr 타입의 어떠한 정보들이 받아와지는 것을 볼 수 있다
xhr이란
XML HTTP Request 으로
Ajax를 통해서 이루어 지는 비동기 통신들이 위 와 같이 xhr 타입으로 나타남
즉 xht 타입의 통신이 있다는 건
해당 페이지가 내부적으로 새로운 페이지를 요청해서 새로운 페이지가 반환 해준 값을
해당 페이지가 받아서 사용자에게 보여주었다고 이해하면 됨
그렇다면 해당 xhr 통신으로 어떤 정보들이 오고 가는지 확인해 보자
내가 원하는 영화 상영 정보들이
해당 request 의 response 로 넘어오는 것을 확인 할 수 있다
그렇다면 어떠한 방식으로 어떤 값들을 가지고 요청을 하는지 확인해 보자
위와 같은 형식의 URL을 통해 POST 방식으로 요청을 보내는 것을 확인 할 수 있다.
그렇다면 해당 POST방식에 어떠한 파라미터 값들이 전달되는지 확인 해 보자
위와 같이
paramList 라는 키의 밸류 값 형태로 파라미터 값들이 전달 되는 것을 확인 할 수 있다.
그러면 이제 해당 URL에 위의 파라미터 값을 POST 방식으로 보내보자
import requests import json from datetime import datetime import pprint url = "http://www.lottecinema.co.kr/LCWS/Ticketing/TicketingData.aspx?" now = datetime.now() today = str('%s-%s-%s' % ( now.year, now.month, now.day )) dic = { "MethodName":"GetPlaySequence", "channelType":"HO", "osType":"Chrome", "osVersion":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) " "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36", "playDate": today, "cinemaID":"1|1|1013" , "representationMovieCode":""} data = {"paramList": dic} r = requests.post(url, data=data) result = json.loads(r.text) print(result)
위의 코드에 대한 결과 값이다
{'IsOK': 'false', 'ResultMessage': "Unexpected character encountered while parsing value: M. Path '', line 0, position 0.", 'ResultCode': None, 'EventResultYn': None}
다음과 같은 json 형태의 반환값을 볼 수가 있다
위의 형태는 내가 원하는 형태가 아니다 한번 해당 반환 값을 자세히 보자
Unexpected character encountered while parsing value 다음과 문제가 있다고 설명한다
한번 구글링 해보자
다음과 같은 해결책을 제시해주는 것을 확인 하였다
인코딩 문제 라는 의미 인것 같다
한번 인코딩을 한 뒤 다시한번 요청해보자
위와 같이 내가 원하는 정보들이 성공적으로 넘어오는 것을 볼 수 있다.
이제 넘어온 정보들 중 내가 필요한 부분만 불러와서
딕셔너리 형태로 담아서 list에 추가시키면 성공적으로 크롤러를 만든 것 이다.
위의 사진은 파라미터 값들을 정의한 딕셔너리의 구조이다
playDate => 원하는 상영 날짜
cinemaID => 1|1| ( 해당 상영지역 코드 )
위의 구조에 맞는 파라미터 값을 넣어서 보낸다면 해당 날짜의 해당 지역의 상영정보가 넘어온다
그렇다면 서울권의 모든 지역의 코드들을 list에 담고 for 루프를 통해서 모든 지역의 정보를 불러올 수 있다
import requests import json from datetime import datetime import pprint url = "http://www.lottecinema.co.kr/LCWS/Ticketing/TicketingData.aspx?" now = datetime.now() today = str('%s-%s-%s' % ( now.year, now.month, now.day )) movie_list = [] area_list = ["1013","1018","9010","1004","1009", "1003","1017","9056","1012","1019", "1022","1015","1007","1001","1002", "1014","1016","1021","9053","1008", "1010","1005","1011"] for area_code in area_list : dic = { "MethodName":"GetPlaySequence", "channelType":"HO", "osType":"Chrome", "osVersion":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) " "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36", "playDate": today, "cinemaID":"1|1|" + area_code , "representationMovieCode":""} # 위의 dic 변수의 내용을 paramList 라는 변수명으로 다시 설정합니다. # encode() 를 하지 않으면 해당 페이지를 접속했을경우 인코딩 오류가 발생합니다. data = {"paramList": str(dic).encode()} # 해당 주소로 paramList 변수의 데이터를 POST 형태로 전송합니다. # for i in area_list : r = requests.post(url, data=data) result = json.loads(r.text) for i in result['PlaySeqs']['Items']: if i.get('IsBookingYN') == 'N': i['BookingSeatCount'] = '마감' movie_dic = { "name": i.get('MovieNameKR'), "dt_area": i.get('ScreenNameKR'), "start_time": i.get('StartTime'), "seat": i.get('BookingSeatCount'), "area": i.get('CinemaNameKR'), "date": today } movie_list.append(movie_dic) pprint.pprint(movie_list)
'Web Crawler' 카테고리의 다른 글
CGV 파싱 (0) 2019.11.27 CGV 필요한 데이터 파싱 (0) 2019.11.27 크롤링 시작 ( 각 지역별 상영관 ) (0) 2019.11.27 CGV 크롤러 (Requests & selenium) (0) 2019.11.27 C.G.V 영화 크롤러 (0) 2019.11.27