자바 / 셀레니움(selenium)으로 크롤링하기 (3)

Joy·2022년 2월 24일
0

JAVA

목록 보기
20/22

무한스크롤 적용하기
크롤링 대상 페이지를 끝까지 내려야 하기 때문에 무한스크롤을 사용하였다.

우선 무한스크롤 대상 요소를 지정한다.
내가 크롤링 하고 싶은 페이지의 요소들이 class로 묶여있어서 className 로케이터를 이용했다.
WebElement item = driver.findElement(By.className("item"));

요소를 지정했으니 while문을 돌려서 무한스크롤을 사용하자
나는 30초로 설정했지만 본인이 크롤링 하고 싶은 페이지에 따라 시간 설정해주면 된다.

Thread.sleep()을 사용해서 리소스 초과를 방지해준다. 500은 0.5초!

JAVAScriptExecutor는 셀레니움 웹드라이버를 통해 자바스크립트를 실행하는 데 도움이 되는 인터페이스이다.

executeScript 메소드는 현재 선택된 프레임 또는 윈도우의 컨텍스트에서 자바스크립트를 실행한다. 간단히 말하면 해당 페이지에 자바스크립트 명령을 보내는 것이라 생각하면 된다.

window.scrollTo(x, y)는 문서의 지정된 위치로 스크롤 하는 메소드이다.
x좌표는 문서의 왼쪽상단부터 시작하는 픽셀단위의 가로축이고, y좌표는 문서의 왼쪽상단부터 시작하는 픽셀단위의 세로축이다.

따라서 맨 위(0)부터 크롤링 대상 요소의 길이(document.body.scrollHeight)까지 스크롤을 지정하는 것!

package com.example.jsouptest;

import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

@SpringBootApplication
public class JsoupTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(JsoupTestApplication.class, args).getBean(JsoupTestApplication.class).test();
    }

    public void test(){

        ChromeOptions options = new ChromeOptions();
        options.setPageLoadStrategy(PageLoadStrategy.NORMAL);

        WebDriver driver = new ChromeDriver(options);
        WebDriver driver1 = new ChromeDriver(options);

        try {
            driver.get("https://user.tving.com/pc/user/otherLogin.tving?loginType=20&from=pc&rtUrl=https://www.tving.com&csite=&isAuto=false");
            driver.findElement(By.xpath("//*[@id=\"a\"]")).sendKeys("ott가입아이디입력");
            driver.findElement(By.xpath("//*[@id=\"b\"]")).sendKeys("ott가입비밀번호입력");
            driver.findElement(By.xpath("//*[@id=\"doLoginBtn\"]")).click();
            System.out.println("로그인 성공 = " + driver.getCurrentUrl());


            driver1.get("https://user.tving.com/pc/user/otherLogin.tving?loginType=20&from=pc&rtUrl=https://www.tving.com&csite=&isAuto=false");
            driver1.findElement(By.xpath("//*[@id=\"a\"]")).sendKeys("ott가입아이디입력");
            driver1.findElement(By.xpath("//*[@id=\"b\"]")).sendKeys("ott가입비밀번호입력");
            driver1.findElement(By.xpath("//*[@id=\"doLoginBtn\"]")).click();
            System.out.println("로그인 성공1 = " + driver1.getCurrentUrl());


            driver.navigate().to("https://www.tving.com"); //홈페이지
            System.out.println("홈페이지 = " + driver.getCurrentUrl());

            driver.navigate().to("https://www.tving.com/tv"); //tv프로그램
            System.out.println("tv프로그램 = " + driver.getCurrentUrl());

            driver.navigate().to("https://www.tving.com/list/program?genre=PCA"); //tv프로그램>드라마
            System.out.println("tv프로그램>드라마 = " + driver.getCurrentUrl());

            //무한 스크롤링 대상 요소
            WebElement item = driver.findElement(By.className("item"));
            
            var stTime = new Date().getTime(); //현재시간
            while (new Date().getTime() < stTime + 30000) { //30초 동안 무한스크롤 지속
                Thread.sleep(500); //리소스 초과 방지
                //executeScript: 해당 페이지에 JavaScript 명령을 보내는 거
                ((JavascriptExecutor)driver).executeScript("window.scrollTo(0, document.body.scrollHeight)", item);
            }
        } finally {
            driver.quit();
            driver1.quit();
        }
    }
}
profile
👻

2개의 댓글

comment-user-thumbnail
2022년 4월 15일

Thread.sleep(500) 은 0.5초입니다!

1개의 답글