[Spring Boot] 자바 크롤링(Crawling) -Selenium

이로률·2023년 11월 1일

SpringBoot

목록 보기
5/5
post-thumbnail

Crawling
웹 페이지를 그대로 가져와서 거기서 데이터를 추출해 내는 행위


Selenium
웹 애플리케이션 자동화 및 테스트를 위한 포터블 프레임워크

1. 의존성 주입

<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
		<dependency>
			<groupId>org.seleniumhq.selenium</groupId>
			<artifactId>selenium-java</artifactId>
			<version>4.9.0</version>
		</dependency>

2. 크롬 버전 확인 및 드라이버 설치

https://chromedriver.chromium.org/downloads
여기서 본인 크롬 버전 확인 후 해당하는 드라이버를 설치

3. DTO 생성

크롤링하여 저장할 항목들로 DTO 클래스 생성

import java.util.List;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class CrawlingDTO {
    private String data;
    private String img;

    private List<CrawlingDTO> list;
}

4. 컨트롤러

4-1) 크롬 개발자모드 실행

  • 실행 방법
    크롤링할 웹사이트에서 F12 또는
    크롤링할 데이터에 마우스를 위치시키고 오른쪽 마우스 클릭 -> 검사

4-2) 크롤링할 데이터의 class 또는 태그 추출

ex)
driver.findElements(By.className("DataSet") //클래스명 
driver.findElements(By.tagName("li")) //태그명

4-3) 예제

@Controller
public class CrawlingController {
    @GetMapping("/crawling")
    public ResponseEntity<Integer> crawling(HttpServletRequest request){
    	List<CrawlingDTO> list = new ArrayList<>();

        String WEB_DRIVER_ID = "webdriver.chrome.driver";
		String WEB_DRIVER_PATH = "C:\\chromedriver-win32\\chromedriver.exe";

		System.setProperty(WEB_DRIVER_ID, WEB_DRIVER_PATH);
		ChromeOptions options = new ChromeOptions();
		options.addArguments("--remote-allow-origins=*");
		options.addArguments("headless");

		WebDriver driver = new ChromeDriver(options);
		
        try {
                driver.get("https://www"); //크롤링할 사이트의 url 
                for(WebElement element : driver.findElements(By.className("DataSet"))){
                    String data = element.getText();
                    WebElement imgs = element.findElement(By.tagName("img"));
                    String img = imgs.getAttribute("src");

                    CrawlingDTO dto = new CrawlingDTO();
                    dto.setData(data);
                    dto.setImg(img);

                    list.add(dto);
                }
                return ResponseEntity.ok(1);
            } catch (Exception e) {
                e.printStackTrace();
                return ResponseEntity.ok(0);
            } finally {
                driver.close();
            }
    }

너무 대충적었당

profile
💻🧐💗💝💘💖

0개의 댓글