Crawling 문제 해결 - LikeLionTeam/BootHouse GitHub Wiki

✔상황

  • 크롤링을 할 때, url을 카테고리별로 나눠 진행하였기 때문에 모든 데이터가 아닌 해당 카테고리에 해당되는 데이터만이 크롤링 되어야 하지만 모든 데이터를 불러오는 문제 발생

    (예, 전체 부트캠프 개수 : 250 , 웹 카테고리 개수: 50 → 50개의 데이터가 불러와지는 것이 정상 but 250개가 불러와짐)

  • 아무 코드도 건들이지 않은 상황에서 갑자기 아예 모든 데이터를 불러오지 못하는 문제 발생

✔문제 발생

1. 충분한 로딩 시간 부족

기존 코드에서는 최초 페이지가 로드되는 부분에만

WebDriverWait

을 사용하여 지정한 요소가 로드되기까지 기다리도록 작성

java
//최대 10초까지 대기
WebDriverWait wait = new WebDriverWait(webDriver, Duration.ofSeconds(10));

// i번째 부트캠프의 상세페이지에 접속
  WebElement detailButton = element.findElement(By.cssSelector("a"));
  String hrefValue = detailButton.getAttribute("href");
  webDriver.get(hrefValue);

// 상세 페이지가 완전히 로드될 때 까지 대기
  wait.until(ExpectedConditions.presenceOfElementLocated(By.tagName("html")));

로드될 때까지의 코드의 개수가 적었고, wait 코드가 제대로 작동하지 않는 문제 발생

2. 셀레니움 내부의 크롬창 크기 변경

java
//부트캠프들의 리스트를 찾아옴
List<WebElement> elements = webDriver.findElements(By.cssSelector("body > main > section > div:nth-child(5) > div > section > ul > li" ));

코드와 같이 해당 데이터를 가져오기 위해 cssSelector를 사용하는데, 크롬창의 크기가 변경되면 내부 html 태그들의 변화로 인하여 경로가 변경됨

이로인하여 지정해준 cssSelector를 찾아오지 못해 데이터를 가져오지 못하는 문제 발생

✔해결 과정

1-1. wait 대신 Thread.sleep 을 사용

제대로 작동하지 않던 wait 대신,

Thread.*sleep*(2000)

을 사용하여 무조건 2초를 대기하도록 수정

1-2. 대기 코드 추가

많은 로드가 필요한 코드 사이사이 대기 코드를 추가하여 충분한 대기시간 확보

2. 창 크기 고정 코드 추가

기존 셀레니움이 동작할 때, 창의 크기가 바뀌어 내부 레이아웃이 변경되는 것을 막기위해 셀레니움 내부 크롬창의 크기를 고정함

주요 해결 코드:

1. Thread.sleep 사용 + 대기 코드 추가

java
Thread.sleep(2000);
// 카테고리별 url에 접속
webDriver.get(urlArray[j]);
Thread.sleep(2000);

//부트캠프들의 리스트를 찾아옴
List<WebElement> elements = webDriver.findElements(By.cssSelector("body > main > section > div:nth-child(5) > div > section > ul > li" ));

 for (int i = 0; i<elements.size(); i++) {
    try {
      //i번째 부트캠프 찾아옴
      elements = webDriver.findElements(By.cssSelector("body > main > section > div:nth-child(5) > div > section > ul > li"));
      WebElement element = elements.get(i);

      // i번째 부트캠프의 상세페이지에 접속
      WebElement detailButton = element.findElement(By.cssSelector("a"));
      String hrefValue = detailButton.getAttribute("href");
      webDriver.get(hrefValue);

      Thread.sleep(2000);

  // 크롤링 진행 후

  //원래 페이지로 돌아가기
   webDriver.navigate().back();
	 Thread.sleep(2000);

2. 초기 설정 시 크롬 창 고정

java

options.addArguments("--window-size=1000,800");

✔정리

  • 페이지 로딩 시 충분한 로딩시간 필요!
  • 창 크기에 따라 동적으로 바뀌는 웹페이지인지 체크 후, 동적으로 바뀌는 페이지일 경우 창 크기 고정하는 코드를 넣어주어야함!
⚠️ **GitHub.com Fallback** ⚠️