관리 메뉴

CHIqueen

영화관 개봉정보 크롤링 vol.1 본문

프로그래밍/Golang

영화관 개봉정보 크롤링 vol.1

CHIqueen 2022. 9. 1. 19:32

어떤 영화 커뮤니티에서 아래 내용을 가지고 상업적으로

예매 시작알림을 구독형식으로 팔겠다는 글을봐서

다음 내용은 작성하지 않을예정입니다.

-2023.04.12.-

-----------------------------------------------------------------------------------------------------------------------------------------

 

저는 메가박스 특별관 Dolby Cinema를 좋아합니다.

그중에서 특히 남양주 스페이스원이랑 코엑스영화관을 자주갑니다.

 

영화 상영정보는 각 영화관 지점마다의 권한으로 언제언제뜨는지 바로 알기 어렵습니다.

(탑건 예매때 힘들었습니다.)

 

곧 아바타 리마스터링과 아바타2를 위해 명당자리를 위해 준비를 시작합니다.

 

이제 대상을 선점해야 하는데요. 당연히 대상은 메가박스입니다.

 

selenium을 쓰는방법도 있지만 json 형태로 받을 수 있는 방법이있어서 이 방법을 사용해보려합니다.

(예매까지 구현한다면 selenium을 써야겠죠)

메가박스 사이트에서 "빠른예매"를 들어가 영화랑 상영관을 선택하면 메가박스사이트는 selectBokdList.do에 질의를 보내는걸 알 수 있습니다.

 

Request, Response Header를 보시면 application/json 으로 주고받는걸 알 수 있습니다.

응답값을 잘보시면 movieFormList로 우리가 원하는 정보만 얻을 수 있습니다.



Response 값을 json으로 바꾸고 값 뽑는건 다음편에서...

추가로 메가박스 모든 상영관 정보가 필요하면 다른작업 필요없이 areaBrchList를 그냥 복붙하시면 됩니다.

지점 구분에 필요한 brchNo도 여기 다 있습니다.

 

먼저 아래 모듈을 import 합니다.

package main

import (
	"bytes"
	"encoding/json"
	"io/ioutil"
	"net/http"
	"fmt"
)

구조체 정의를 합니다.

 

type Megabox struct{
	AreaCd1			string	`json:"areaCd1"`
	AreaCd2			string	`json:"areaCd2"`
	AreaCd3 		string	`json:"areaCd3"`
	ArrMovieNo		string	`json:"arrMovieNo"`
	BrchAll			string	`json:"brchAll"`
	BrchNo1			string	`json:"brchNo1"`
	BrchNo2			string	`json:"brchNo2"`
	BrchNo3			string	`json:"brchNo3"`
	BrchNoListCnt		int	`json:"brchNoListCnt"`
	BrchSpcl		string	`json:"brchSpcl"`
	MoiveNo1		string	`json:"movieNo1"`
	MovieNo2		string	`json:"movieNo2"`
	MovieNo3		string	`json:"movieNo3"`
	PlayDe			string	`json:"playDe"`
	SellChnlCd		string	`json:"sellChnlCd"`
	SpclbYn1		string	`json:"spclbYn1"`
	SpclbYn2		string	`json:"spclbYn2"`
	SpclbYn3		string	`json:"spclbYn3"`
	TheabKindCd1		string	`json:"theabKindCd1"`
	TheabKindCd2		string	`json:"theabKindCd2"`
	TheabKindCd3		string	`json:"theabKindCd3"`
}

그 다음 Request 코드를 작성합니다.

func main(){
	url := "https://www.megabox.co.kr/on/oh/ohb/SimpleBooking/selectBokdList.do"
	megabox := Megabox{"DBC", "", "", "", "10", "1351", "", "", 1, "DBC", "", "", "", "20220902", "", "Y", "", "", "DBC", "", ""}
	pbytes, _ := json.Marshal(megabox)
	buff := bytes.NewBuffer(pbytes)
	resp, err := http.Post(url, "application/json", buff)
	if err != nil{
		panic(err)
	}
	respBody, err := ioutil.ReadAll(resp.Body)
	defer resp.Body.Close()
	if err != nil{
		panic(err)
	}
	fmt.Println(string(respBody))
}

statCd가 -1이면 오류입니다.

{"statCd":-1,"msg":"\uC785\uB825 \uC815\uBCF4\uAC00 \uC798\uBABB\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","reason":"Internal Server Error","path":"/on/oh/ohb/SimpleBooking/selectBokdList.do","locale":"ko"}

성공하면 쥬르르륵 나와야합니다.

[19:21:21] [~/Documents/study/megabox] ❱❱❱ go run main.go
{"msg":"\uC815\uC0C1\uC801\uC73C\uB85C \uC870\uD68C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","areaBrchList":[{"playDe":"20220902","areaCd":"10","areaCdNm":"\uC11C\uC6B8","areaCdEngNm":"\uC11C\uC6B8","areaBrchCnt":19,"formBrchCnt":19,"areaOnlineExpoAt":"N","brchNo":"1372","brchNm":"\uAC15\uB0A8","brchEngNm":"Gangnam","brchFormAt":"Y","brchOnlineExpoAt":"N","brchOnlineExpoStatCd":null,"brchOnlineExpoStatCdNm":null,"brchBokdUnableAt":"N","brchPopupAt":"N","brchPopupNo":0,"brchFavorAt":"N"},~~

 

'프로그래밍 > Golang' 카테고리의 다른 글

Golang Guessing game 게싱게임  (0) 2020.06.06
Comments