2024-03-08 (61일차) - Selenium 세팅

·2024년 3월 8일

프로젝트

목록 보기
22/57

📅 2024-03-08, 61일차


DONE

  • ERD o
  • 댓글 목록 불러오기 o
  • 스프링 크롤링 검색 o
  • 셀레늄 라이브러리 추가 o
  • 크롤링 dto o

TODO

  • 크롤링 컨트롤러
  • 스프링 크롤링 테스트 페이지 만들기
  • 스프링 크롤링 테스트해보기
  • 지도 api -> 카페상세보기 페이지에 적용해보기

Selenium 사용을 위한 설정

  • 크롬 드라이버 다운로드
  • 다운받은 드라이버 압축파일을 합축 해제 후 실행파일을 프로젝트 폴더의 상위폴더에 저장한다
    • 경로는 상관없다고 하지만, 나는 프로젝트 폴더 바로 옆으로 옮겨놨다.
  • 의존성 주입
    • pom.xml
    		<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
          <dependency>
              <groupId>org.seleniumhq.selenium</groupId>
              <artifactId>selenium-java</artifactId>
              <version>3.141.59</version>
          </dependency>
          <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-api -->
          <dependency>
              <groupId>org.seleniumhq.selenium</groupId>
              <artifactId>selenium-api</artifactId>
              <version>3.141.59</version>
          </dependency>
          <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-chrome-driver -->
          <dependency>
              <groupId>org.seleniumhq.selenium</groupId>
              <artifactId>selenium-chrome-driver</artifactId>
              <version>3.141.59</version>
          </dependency>
  • Maven Dependencies에 selenium 라이브러리가 추가 되었는지 확인
  • Maven - Update Project

문제상황

크롤링 예제를 시도했지만 실패했고 에러가 떴다.
프로젝트 클린도 해봤지만 실패.

This application has no explicit mapping for /error, so you are seeing this as a fallback.
Fri Mar 08 16:42:44 KST 2024
There was an unexpected error (type=Internal Server Error, status=500).
'com.google.common.collect.ImmutableMap com.google.common.collect.ImmutableMap.of(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)'
java.lang.NoSuchMethodError: 'com.google.common.collect.ImmutableMap com.google.common.collect.ImmutableMap.of(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)'

문제해결 같기도 아닌 것 같은 너낌

ChatGPT한테 이 상황을 물어 봤는데..

이 오류는 프로젝트의 종속성 충돌로 인한 문제로 보입니다. 오류 메시지를 보면 NoSuchMethodError가 발생했는데, 이는 메서드가 존재하지 않는다는 것을 의미합니다. 이 경우, 해당 메서드(com.google.common.collect.ImmutableMap.of(...))가 존재하지 않는다고 나옵니다.
이러한 종류의 오류는 일반적으로 라이브러리 버전 충돌로 인해 발생합니다. 가장 가능성 있는 원인은 프로젝트에 여러 라이브러리가 있고, 그 중 일부가 충돌하는 경우입니다.
해결하기 위한 몇 가지 방법:

  • 의존성 관리: 프로젝트의 의존성 관리 파일(예: Maven의 pom.xml 또는 Gradle의 build.gradle)에서 종속성 버전을 확인하고 충돌하는 라이브러리를 수정합니다.

그래서 셀레늄 의존성 주입을 다시 구글링 했고, 조금 더 최신 버전으로 의존성 주입을 시켰다.

 <!-- 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>

Controller 추가 ver.1

@Controller
public class CrawlingController2 {

	@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:/work/sts-4.21.0.RELEASE-workspace/2024_01_Spring_Crema/src/main/resources/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.daum.net/"); // 크롤링할 사이트의 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);
				
				System.out.println(data);
			}
			return ResponseEntity.ok(1);
		} catch (Exception e) {
			e.printStackTrace();
			return ResponseEntity.ok(0);
		} finally {
			driver.close();
		}
		
	}

저장 후 http://localhost:8081/crawling 로 접속 했더니 화면에 숫자 1만 뜬다.
500에러는 뜨지 않아서 다행이긴한데... 1이 뜨는 이유는 try-catch로 잡아낸 것 같은데, 콘솔에는 계속 1이 자동으로 반복적으로 찍힌다.
gpt한테 찍히는 내용을 물어봤더니..

이 오류 메시지는 웹 애플리케이션이 스레드를 시작했지만 정지하지 못하여 메모리 누수가 발생할 수 있다는 경고입니다. 보통 이러한 경고는 애플리케이션이 종료될 때 사용한 리소스를 정리하지 못해 발생합니다.

일단, 실패.


Controller 추가 ver.1

@Controller
public class CrawlingController {

	@RequestMapping("/weather.json")
	public List<HashMap<String, Object>> weather() {
		List<HashMap<String, Object>> array = new ArrayList<HashMap<String, Object>>();
		try {
			// 드라이버 위치
			System.setProperty("webdriver.chrome.driver", "c:/work/sts-4.21.0.RELEASE-workspace/2024_01_Spring_Crema/src/main/resources/chromedriver.exe");
			// 드라이버 옵션
			ChromeOptions options = new ChromeOptions();
			// 웹 페이지 안열리게
			// options.addArguments("headless");
			// 웹 드라이버
			WebDriver driver = new ChromeDriver(options);
			driver.get("https://www.daum.net/");

			List<WebElement> elements = driver.findElements(By.cssSelector(".list_weather li"));
			for (WebElement e : elements) {
				HashMap<String, Object> map = new HashMap<String, Object>();
				String part = e.findElement(By.className("txt_part")).getAttribute("textContent");
				String status = e.findElement(By.tagName("strong")).getAttribute("textContent");
				String temper = e.findElement(By.className("txt_temper")).getAttribute("textContent");
				map.put("part", part);
				map.put("status", status);
				map.put("temper", temper);
				array.add(map);
			}
			driver.close();
		} catch (Exception e) {
			System.out.println("daum weather Crawling error : " + e.toString());
		}
		return array;
	}

이번에는 위의 크롤링예제를 시도해보았다
http://localhost:8081/weather.json 로 접속하니, 다음 날씨가 나오진 않지만 다음페이지가 새창으로 뜬다.

흠.. 이것도 성공인 것 같진 않다..


pom.xml을 gpt한테 복붙하고 여기서 중복되거나 최신버전 아니거나 크롤링하는데 문제가 될만한거 찾아내봐 라고 물어봤더니

gpt의 대답

주어진 Maven 프로젝트의 pom.xml 파일을 살펴보겠습니다. 크롤링에 문제가 될 수 있는 중복된 또는 최신 버전이 아닌 종속성을 확인해 보겠습니다.

tomcat-embed-jasper 종속성이 중복되어 있습니다. 이미 한 번 선언되어 있으므로 하나만 유지하고 다른 것은 제거할 수 있습니다.

jakarta.servlet.jsp.jstl-api와 jakarta.servlet.jsp.jstl이 중복되어 있습니다. 두 가지를 동시에 사용할 필요가 없으며, jakarta.servlet.jsp.jstl만을 유지할 수 있습니다.

mybatis-spring-boot-starter와 mybatis-spring-boot-starter-test의 버전이 3.0.3으로 동일하게 지정되어 있습니다. 이것은 이미 일치하므로 문제가 되지 않습니다.

Selenium의 버전은 4.9.0으로 최신 버전으로 보입니다. 일반적으로 최신 버전을 사용하는 것이 좋습니다. 다만, 프로젝트의 다른 종속성과의 호환성을 고려하여 업데이트할 때 주의해야 합니다.

불필요한 org.apache.tomcat.embed와 org.springframework.boot에 의한 종속성이 중복되어 있습니다. 예를 들어, spring-boot-starter-web 종속성은 이미 Tomcat과 관련된 종속성을 포함하므로 불필요한 것일 수 있습니다.

이상 중복되거나 업데이트가 필요한 종속성은 다음과 같습니다:

tomcat-embed-jasper 중복 제거
jakarta.servlet.jsp.jstl-api와 jakarta.servlet.jsp.jstl 중복 제거
Selenium 버전 업데이트
불필요한 종속성 제거 (예: spring-boot-starter-web에 의해 이미 포함된 것들)
의존성을 최적화하고 문제가 되는 것들을 수정한 후 프로젝트를 다시 빌드하고 테스트하여 문제가 해결되었는지 확인할 수 있습니다.

번역된 내용

주어진 Maven 프로젝트의 pom.xml 파일을 살펴보겠습니다. 크롤링에 문제가 될 수 있는 중복된 또는 최신 버전이 아닌 종속성을 확인해 보겠습니다.

tomcat-embed-jasper 종속성이 중복되어 있습니다. 이미 한 번 선언되어 있으므로 하나만 유지하고 다른 것은 제거할 수 있습니다.

jakarta.servlet.jsp.jstl-api와 jakarta.servlet.jsp.jstl이 중복되어 있습니다. 두 가지를 동시에 사용할 필요가 없으며, jakarta.servlet.jsp.jstl만을 유지할 수 있습니다.

mybatis-spring-boot-starter와 mybatis-spring-boot-starter-test의 버전이 3.0.3으로 동일하게 지정되어 있습니다. 이것은 이미 일치하므로 문제가 되지 않습니다.

Selenium의 버전은 4.9.0으로 최신 버전으로 보입니다. 일반적으로 최신 버전을 사용하는 것이 좋습니다. 다만, 프로젝트의 다른 종속성과의 호환성을 고려하여 업데이트할 때 주의해야 합니다.

불필요한 org.apache.tomcat.embed와 org.springframework.boot에 의한 종속성이 중복되어 있습니다. 예를 들어, spring-boot-starter-web 종속성은 이미 Tomcat과 관련된 종속성을 포함하므로 불필요한 것일 수 있습니다.

이상 중복되거나 업데이트가 필요한 종속성은 다음과 같습니다:

tomcat-embed-jasper 중복 제거
jakarta.servlet.jsp.jstl-api와 jakarta.servlet.jsp.jstl 중복 제거
Selenium 버전 업데이트
불필요한 종속성 제거 (예: spring-boot-starter-web에 의해 이미 포함된 것들)
의존성을 최적화하고 문제가 되는 것들을 수정한 후 프로젝트를 다시 빌드하고 테스트하여 문제가 해결되었는지 확인할 수 있습니다.


참고

https://velog.io/@kimdy0915/Selenium%EC%9C%BC%EB%A1%9C-%EB%84%A4%EC%9D%B4%EB%B2%84-%EC%A7%80%EB%8F%84-%ED%81%AC%EB%A1%A4%EB%A7%81%ED%95%98%EA%B8%B0

https://velog.io/@soyul2823/Spring-Boot-%EC%9E%90%EB%B0%94-%ED%81%AC%EB%A1%A4%EB%A7%81Crawling-Selenium
https://becomefullstackdev.tistory.com/115

https://jinseongsoft.tistory.com/310?category=823887

https://velog.io/@soyul2823/Spring-Boot-%EC%9E%90%EB%B0%94-%ED%81%AC%EB%A1%A4%EB%A7%81Crawling-Selenium

profile
hello world

0개의 댓글