[Spring] 웹크롤링

송현진·2023년 5월 20일
0
post-thumbnail

동적으로 웹 크롤링하기

1. build.gradle을 설정해준다

// https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java
implementation group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '4.9.0'

2. 크롤링해올 페이지에 대한 클래스를 작성한다

@Component
public class MovieCrawlingController {
    private WebDriver driver;
    
    private static final String url = "크롤링할 주소";
    
    public void process() {
        //크롬 드라이버 셋팅 (드라이버 설치한 경로 입력)
        System.setProperty("webdriver.chrome.driver", "chromedriver.exe가 있는 경로 설정");

        // 크롬 드라이버 옵션 설정
        ChromeOptions options = new ChromeOptions();
//        options.addArguments("--headless"); // 헤드리스 모드로 실행
//        options.addArguments("--disable-gpu"); // GPU 사용 안함
//        options.addArguments("--disable-popup-blocking");//팝업 창 무시

        options.addArguments("--remote-allow-origins=*");
        // 크롬 드라이버 셋팅 (드라이버 설치한 경로 입력) 및 옵션 적용
        driver = new ChromeDriver(options);

        try {
            getDataList();
        } catch (InterruptedException e) {
            e.printStackTrace();
            Thread.currentThread().interrupt(); //인터럽트 상태 복원
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        driver.close();    //탭 닫기
        driver.quit();    //브라우저 닫기
    }
    
     /**
     * data가져오기
     */
    
    private List<String> getDataList() throws InterruptedException, IOException {
        List<String> list = new ArrayList<>();
        driver.get(url);    //브라우저에서 url로 이동한다.
        Thread.sleep(2000); //브라우저 로딩될때까지 잠시 기다린다.
        
        // By.사용할방법
        WebElement lis = driver.findElement(By.cssSelector(""));
        images.click(); // 마우스 클릭과 동일
        // images.sendKeys(Keys.ENTER); // 엔터키와 동일
        Thread.sleep(2000);   
        
        String title = titleElement.getText(); // getText()를 이용해 가져옴 여기서 subString 등으로 가져오고 싶은 것만 가져올 수도 있음.
        String image = imageElement.getAttribute("src"); // 이미지는 이렇게 속성값을 이용해 가져올 수 있음
        
        driver.navigate().back(); // 뒤로가기
        Thread.sleep(2000); // 늘 다음 동작을 위해 기다리는 시간을 넣어준다.
        return list;
   }
}
함수명설명
By.id요소의 속성 id로 찾는 오브젝트를 찾습니다.
By.className요소의 속성 class가 포함된 오브젝트를 찾습니다.
By.name요소의 속성 name로 찾는 오브젝트를 찾습니다.
By.xpathxpath를 이용해서 오브젝트를 찾습니다.
By.linkText하이퍼 링크의 텍스트로 오브젝트를 찾습니다.(완전 일치) - 탐색이 잘 안됩니다.
By.partialLinkText하이퍼 링크의 텍스트로 오브젝트를 찾습니다.(포함) - 탐색이 잘 안됩니다.
By.tagName요소의 태그 이름으로 찾습니다.
By.cssSelectorcss selector(sizzle)로 오브젝트를 찾습니다.

3. 실행시킬 클래스를 작성한다.

@Component
@Getter
public class CrawlingClass {
    private final MovieCrawlingController movieCrawlingController;
    private final TvCrawlingController tvCrawlingController;

    @Autowired
    public CrawlingClass(MovieCrawlingController movieCrawlingController,
                         TvCrawlingController tvCrawlingController) {
        this.movieCrawlingController = movieCrawlingController;
        this.tvCrawlingController = tvCrawlingController;
        System.out.println("-------------MOVIE---------------");
        movieCrawlingController.process();
    }
}
profile
개발자가 되고 싶은 취준생

0개의 댓글