본문 바로가기

개발자노트/Spring

프로젝트 중 만난 오류 - Crawling NosuchElementException

팀 프로젝트를 진행하면서 만난 오류가 있었다.

 

타 사이트를 통해 웹 크롤링 정보를 DB에 담는 과정에서 발생한 오류이다.

로깅을 통해 상세정보: 까지는 정상적으로 출력이 되는 것을 확인하였는데 

상세정보 다음에 들어올 내용인 상세이미지 값이 들어오지 못하고 NosuchElementException을 만났다.

 

	String detail_img = ".img_wrapper > img";
	Elements eles8 = doc2.select(detail_img);
    // ... 생략
    String detail_img2 = itr8.next().attr("src");
					System.out.println("상세 이미지: "+detail_img2);

현재 이미지의 경로는 다음과 같이 해당 페이지의 .img_wrapper > img 태그 안에 있는 

attr("src") 값에서 부터 가져온다.

 

정상적으로 크롤링이 되는 상품과 크롤링이 되지 않는 상품을 비교해보았다.

정상적으로 크롤링이 되는 주소
정상적으로 크롤링이 되지 않는 주소

간단하게 찾을 수 있었는데 상세이미지 파일이 2가지 이상 걸려있는 파일은 <b> 태그 까지 걸려있었다.

 

 

 

오류해결을 위해 한 삽질..

 

1) 처음에는 조건을 걸어서 .img_wrapper > img 로부터 정보를 갖고오지 못했다면, 

.img_wrapper > b > img 의 경로로부터 가져오게끔 설정하고 싶어서 if 문을 걸었다.

 

if(itr8.next().attr("src").isEmpty) 를 사용해봐도 조건을 만족하지 못했고

if(itr8.next().attr("src").isBlanck) 를 사용해봐도 조건을 만족하지 못했고

마지막으로 if(itr8.next().attr("src")==null) 을 사용해봐도 조건을 만족하지 못했다.

당연히 경로부터 못찾아버리는데 null일 수가.. 지금 생각해보면 엄청 삽질했다..

 

 

 

2) 그러다 Exception 인데 당연히 예외처리로 처리를 했어야하는게 아닐까 라는 생각이 들었다.

오류명부터 대놓고 Exception인데 왜 이 생각을 처음부터 하지 못했을까라는 바보같은 생각이 들었다.

그래서 시도한 방법은 NosuchElementException을 try catch로 묶어서 만약 발생을 하게 된다면

다른경로에 있는 주소값을 가져오면 되겠구나! 라고 생각했다.

try{
	String detail_img2 = itr8.next().attr("src");
	System.out.println("상세 이미지: "+detail_img2);
	vo2.setPdetail(detail_img2);
	}
catch(java.util.NoSuchElementException e) {
	String detail_img2 = itr9.next().attr("src");
	System.out.println("상세이미지2: "+detail_img2);
	vo2.setPdetail(detail_img2);
	}

 

 

결과적으로 성공적으로 크롤링이 작동하였다.

물론 다른 오류가 발생했지만 그건 다른 방법으로 고치면 되는거니까..ㅎㅎ

 

구글링을 해보아도 java 로 크롤링을 한 정보도 별로 없을 뿐더러 대부분의 NosuchElementException는

Scanner를 사용할 때 많이 발생하는 오류라 그런지 Scanner에 대한 NosuchElementException만 나와서 생각도 못했는데

그냥 단순하게 백투더베이직으로 돌아가보면 그냥 예외처리 걸어버리면 되는거였다.

 

 

이번에 느낀건 로깅기법의 중요성 ( 어느 부분에서 오류가 발생하는지 찾기 정말 쉬웠다. )

두번 째로는 예외처리를 할 줄 알았기 때문에 Exception 오류를 해결 할 수 있었지 않았을까..