Skip to content

bigstar017/Selenium_Crawling

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 

Repository files navigation

Selenium_Crawling

동적 웹페이지 크롤링 연습 (Spring)


크롬 버전 : 114 버젼

여름 프로젝트에서 데이터를 크롤링해 DB에 저장하는 역할을 맡아 SpringBoot와 Selenium을 이용해 예시 코드를 작성해 보았다.


1. 개요

1) Selenium을 통해 동적 크롤링 코드를 작성함.

2) Chrome에서 Css Selector Copy를 통해서 쉽게 원하는 요소에 접근.

3) 무신사스토어의 각각의 상품 페이지의 HTML 코드가 동일하여 반복문을 통해 구현.

4) 처음 구현할 때 크롤링이 끝난 후 뒤로가기를 통해서 구현.
  - 사용자가 웹페이지를 이용하는 방식 채택
  - 특정 페이지(코디 페이지, 상품 페이지)에서 뒤로가기가 실행이 되지 않는 경우가 다수 발생..
  - Unknown Exception 발생..

5) 직접 메서드로 주소 String 값을 넘겨서 크롤링 하는 방식으로 변경
  - Unknown Exception 상당히 감소
  - 정상 동작 확인

6) 크롤링 정보
  - 성별 : 남성
  - 스타일 카테고리 : 캐주얼(6,178개), 댄디(1,967개), 포멀(1,258개), 스트릿(1,845개) (23. 06. 19 기준)
    - 카테고리는 1,000개 이상의 코디 수를 가진 카테고리만 크롤링
    - 1년 단위의 코디 정보를 크롤링하기 위해 캐주얼만 30페이지 크롤링 나머지는 20페이지 크롤링 진행
  - 코디 상세페이지로 이동 후, 코디 상품란의 모든 상품을 조회
  - 상품 상세페이지에서 아우터, 상의, 하의, 신발의 여부를 먼저 확인 후 각각 객체를 생성하여 크롤링 진행
  - 크롤링이 끝나면 이전 페이지로 이동, 반복 수행

2. 사이트의 이동을 뒤로가기를 통해 구현했을 때 오류 발생

1) 특정 상품 페이지에서 뒤로가기가 동작하지 않아서 다음 상품 페이지로 넘어가지 못하는 오류 발생
  - 예외가 발생하는 곳을 먼저 확인 후 try catch문을 작성하여 다시 뒤로가기 후 다음 상품 크롤링을 진행

2) 특정 코디 페이지에서 뒤로가기가 동작하지 않아서 다음 코디 페이지로 넘어가지 못하는 오류 발생
  - 예외가 발생하는 곳을 먼저 확인 후 try catch문을 작성하여 다시 뒤로가기 후 다음 코디 페이지로 이동
  - 부가적으로 스타일 카테고리 설정이 풀려 있어 다시 클릭하도록 하였음.

3) 특정 상품의 시즌 정보가 누락이 되어 있거나, 다르게 적혀있는 경우가 있었다.
  - 시즌 정보를 크롤링 할 때만 try catch문을 작성하여, 누락된 경우 null 값이 저장되도록 작성함.
  - Data Cleansing

4) 뒤로가기 했을 때 스타일 카테고리의 항목이 변경되는 경우가 발생
  - 페이지를 넘어갈 때 마다 현재 크롤링하고 있는 스타일 카테고리를 한 번 더 클릭하도록 하였음.
  - 추가적인 동작을 수행하는 것이기 때문에 좋은 해결 방식은 아니라고 생각했음.

-> 뒤로가기를 통한 웹페이지 이동이 Unknown Error를 발생시킨다고 판단.
-> 결국 페이지 주소를 넘겨주어 주소로 이동하는 방식으로 변경 -> 오류 발생이 없어졌음..

3. 알게된 점, 추가적으로 고치면 좋을 것 같은 부분

1) 단순히 css Selector을 넘겨주면 숨겨진 항목이나, 반응형 웹을 통해 잘린 부분도 click을 실행해 줄 수 있을 줄 알았는데, 하지 못함
  - 우리가 웹페이지에서 직접 클릭하는 등의 행동을 대신 해주는 느낌이다.

2) 뒤로가기를 이용해서 구현하는 방법은 굉장히 좋지 않은 방법이라는 것을 깨달았다..
  - 내가 직접 웹페이지를 이용하는 방식으로 생각해서 코드를 짜다보니 뒤로가기로 구현하고자 함.
  - 특정 페이지에서 뒤로가기가 수행이 안되는 경우가 다수 발생.
  - 예외 처리를 해주더라도 어느 떄는 되고 어느 때는 안되는 경우가 생겨 굉장히 불안정.
  - 결론은 이전 주소를 값으로 넘겨주어 행동을 다하면 직접 주소로 이동하는 방식으로 구현.

3) saveData() 메서드에서 상의, 하의, 신발, 아우터 일 때의 코드의 반복성을 제거할 필요가 있음.
  - 상위 클래스인 '의류'라는 클래스를 만들어 상속을 통해 해결할 수 있다.

4) headless 기능을 이용하여 브라우저를 직접 키지 않고 크롤링이 가능하다.
  - 코드가 정확하게 잘 동작하는지 여부를 확실하게 판단한 후에 사용

4. 기존 프로젝트에 이식시키기 전 논의가 필요한 부분

1) 각각의 코디에 상의 하의 신발의 정보가 있는 것이 아니기 때문에, 모두 존재하는 코디만을 DB에 저장할 것인지
  - 기본적으로 상의 하의가 있는 코디 셋만 저장하기

2) DB에 저장할 때 OpenCV를 돌려 회원이 가지고 있는 의류와 일치도도 저장을 할 것인지
  - 회원이 자신의 옷을 입력을 하고 하는 행동이므로 지금 고려할 필요가 없다.

3) Color 정보는 어떻게 할 것인가?
  - OpenCV의 일치도만 필요하기 때문에 따로 Color Column을 고려할 필요는 없어보임.

About

동적 웹페이지 크롤링 연습 (Spring)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages