팀 프로젝트를 진행하면서 만난 오류가 있었다.
타 사이트를 통해 웹 크롤링 정보를 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 오류를 해결 할 수 있었지 않았을까..
'개발자노트 > Spring' 카테고리의 다른 글
Spring - 다국어처리(국제화) (0) | 2022.09.29 |
---|---|
Spring - 에러 페이지 설정 , 예외처리 (0) | 2022.09.28 |
Spring 작동순서 개인적인 정리 (0) | 2022.09.24 |
Spring - 컨트롤러, 리퀘스트 매핑 @Controller / @RequestMapping , Spring에서 매핑하는법 (0) | 2022.09.21 |
Spring - 디스패쳐서블릿 (DispatcherServlet) / 핸들러 매핑 (HandlerMapping) / 뷰 리졸버 (ViewResolver) (2) | 2022.09.19 |