CHIqueen
영화관 개봉정보 크롤링 vol.1 본문
어떤 영화 커뮤니티에서 아래 내용을 가지고 상업적으로
예매 시작알림을 구독형식으로 팔겠다는 글을봐서
다음 내용은 작성하지 않을예정입니다.
-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 |
---|