Toggle navigation
Toggle navigation
This project
Loading...
Sign in
임승현
/
Multiplex_Ticketing_Platform
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
임승현
2022-05-26 10:23:11 +0900
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
d12ada9c8879912a0e81af219d7ebb7d880d5462
d12ada9c
1 parent
dd5e9a1a
Enable to Select the Movie filtered by the theater and the date
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
56 additions
and
7 deletions
WebCrawling/src/CGVExample.java
WebCrawling/src/CGVExample.java
View file @
d12ada9
...
...
@@ -96,10 +96,12 @@ public class CGVExample {
Scanner
scanner
=
new
Scanner
(
System
.
in
);
String
url_movies
=
"https://www.cgv.co.kr/movies/?lt=1&ft=1"
;
//끝의 쿼리 0은 개봉 전 영화도 포함하는 것. 예매율 순위 가져오기
String
url_theaters
=
"https://www.cgv.co.kr/theaters"
;
//영화관 정보 가져오는 링크.
String
url_ticketing
=
"https://www.cgv.co.kr/ticket/"
;
//상영중인 영화 정보 가져오는 링크.
ArrayList
<
LinkedHashMap
<
String
,
String
>>
theaters
=
new
ArrayList
<>();
//지역별 영화관 HashMap(Key: 영화관, value:영화관별 고유코드)으로 이루어진 Arraylist
ArrayList
<
CGVMovieInfo
>
Movies
=
new
ArrayList
<>();
//CGVMovieInfo 클래스의 인스턴스들을 원소로 가지는 Arraylist
// 여기부터 영화관 및 영화관별 고유코드 가져오는 부분.
try
{
//드라이버 설정
System
.
setProperty
(
WEB_DRIVER_ID
,
WEB_DRIVER_PATH
);
}
catch
(
Exception
e
){
...
...
@@ -109,15 +111,15 @@ public class CGVExample {
ChromeOptions
options
=
new
ChromeOptions
();
//크롬 설정을 담은 객체 생성
options
.
addArguments
(
"headless"
);
//브라우저가 눈에 보이지 않고 컴파일러 내부에서 작동됨.
WebDriver
driver
=
new
ChromeDriver
(
options
);
//위에서 설정한 옵션을 파라미터로 넘겨주고, 드라이버 객체 생성.
driver
.
get
(
url_theaters
);
//WebDriver 객체를 해당 URL로 이동시킨다.
WebDriver
driver
_theaters
=
new
ChromeDriver
(
options
);
//위에서 설정한 옵션을 파라미터로 넘겨주고, 드라이버 객체 생성.
driver
_theaters
.
get
(
url_theaters
);
//WebDriver 객체를 해당 URL로 이동시킨다.
//브라우저 이동시 생기는 로드시간을 기다린다.
//HTTP 응답속도 보다 자바의 컴파일 속도가 더 빠르기 때문에 임의적으로 1초를 대기한다.
try
{
Thread
.
sleep
(
1000
);}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();}
//영화관 및 영화관에 대응되는 영화관별 고유 코드 가져오기.
List
<
WebElement
>
area
=
driver
.
findElements
(
By
.
className
(
"area"
));
List
<
WebElement
>
area
=
driver
_theaters
.
findElements
(
By
.
className
(
"area"
));
for
(
WebElement
elem
:
area
)
{
LinkedHashMap
<
String
,
String
>
theaters_info
=
new
LinkedHashMap
<>();
List
<
WebElement
>
theaters_by_area
=
elem
.
findElements
(
By
.
tagName
(
"a"
));
...
...
@@ -130,12 +132,13 @@ public class CGVExample {
}
try
{
driver
.
close
();
//드라이버 연결 해제
driver
.
quit
();
//프로세스 종료
driver
_theaters
.
close
();
//드라이버 연결 해제
driver
_theaters
.
quit
();
//프로세스 종료
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
e
.
getMessage
());
}
//여기부터 예매율 순위 가져오는 부분
Document
doc_movies
;
try
{
doc_movies
=
Jsoup
.
connect
(
url_movies
).
get
();
...
...
@@ -179,9 +182,55 @@ public class CGVExample {
System
.
out
.
print
(
"관람 일자를 입력하세요 : "
);
int
date
=
scanner
.
nextInt
();
String
otherFormat
=
String
.
format
(
"THEATER_CD=%s&PLAY_YMD=%s"
,
theaterCode
,
date
);
url_ticketing
+=
(
"?"
+
otherFormat
);
WebDriver
driver_ticketing
=
new
ChromeDriver
();
driver_ticketing
.
get
(
url_ticketing
);
try
{
Thread
.
sleep
(
1000
);}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();}
WebElement
selecting_area
=
driver_ticketing
.
switchTo
().
frame
(
"ticket_iframe"
).
findElement
(
By
.
className
(
"theater-area-list"
));
List
<
WebElement
>
selected_areas_list
=
selecting_area
.
findElements
(
By
.
cssSelector
(
"ul > li > a > span.name"
));
//지역 코드에 맞게 list element click
selected_areas_list
.
get
(
regionCode
).
click
();
try
{
Thread
.
sleep
(
1000
);}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();}
//선택한 지역에 대응되는 영화관 정보 가져오기
WebElement
selecting_theaters
=
selecting_area
.
findElement
(
By
.
cssSelector
(
"ul > li.selected > div > ul"
));
List
<
WebElement
>
selected_theaters_list
=
selecting_theaters
.
findElements
(
By
.
tagName
(
"li"
));
//프로그램 내부에서 가지고 있는 영화관코드와 웹에서 받아온 영화관코드가 일치하는 경우, selected_theaters_list element 클릭
for
(
WebElement
theater_element
:
selected_theaters_list
)
{
if
(
theater_element
.
getAttribute
(
"theater_cd"
).
equals
(
theaterCode
)){
theater_element
.
click
();
try
{
Thread
.
sleep
(
1000
);}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();}
break
;
}
}
//선택한 영화관에서, 선택한 일자에 상영하는 영화 목록 들고오기
WebElement
selecting_movies
=
driver_ticketing
.
findElement
(
By
.
className
(
"movie-select"
));
List
<
WebElement
>
selected_movies_list
=
selecting_movies
.
findElements
(
By
.
cssSelector
(
"#movie_list > ul > li"
));
//선택불가를 제외한 영화 제목 출력
for
(
WebElement
movie_element
:
selected_movies_list
){
String
movie_enabled
=
movie_element
.
getAttribute
(
"class"
);
if
(
movie_enabled
.
endsWith
(
"dimmed"
))
break
;
else
System
.
out
.
println
(
movie_element
.
findElement
(
By
.
cssSelector
(
"span.text"
)).
getText
());
}
try
{
driver_ticketing
.
close
();
//드라이버 연결 해제
driver_ticketing
.
quit
();
//프로세스 종료
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
e
.
getMessage
());
}
try
{
String
otherFormat
=
String
.
format
(
"&THEATER_CD=%s&PLAY_YMD=%s"
,
theaterCode
,
date
);
Desktop
.
getDesktop
().
browse
(
new
URI
(
Movies
.
get
(
inputRank
-
1
).
getLink
()
+
otherFormat
));
Desktop
.
getDesktop
().
browse
(
new
URI
(
Movies
.
get
(
inputRank
-
1
).
getLink
()
+
"&"
+
otherFormat
));
}
catch
(
IndexOutOfBoundsException
|
URISyntaxException
|
IOException
e
){
System
.
out
.
println
(
e
.
getClass
());
...
...
Please
register
or
login
to post a comment