Crawling 문제 해결 - LikeLionTeam/BootHouse GitHub Wiki
-
크롤링을 할 때, url을 카테고리별로 나눠 진행하였기 때문에 모든 데이터가 아닌 해당 카테고리에 해당되는 데이터만이 크롤링 되어야 하지만 모든 데이터를 불러오는 문제 발생
(예, 전체 부트캠프 개수 : 250 , 웹 카테고리 개수: 50 → 50개의 데이터가 불러와지는 것이 정상 but 250개가 불러와짐)
-
아무 코드도 건들이지 않은 상황에서 갑자기 아예 모든 데이터를 불러오지 못하는 문제 발생
기존 코드에서는 최초 페이지가 로드되는 부분에만
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 코드가 제대로 작동하지 않는 문제 발생
java
//부트캠프들의 리스트를 찾아옴
List<WebElement> elements = webDriver.findElements(By.cssSelector("body > main > section > div:nth-child(5) > div > section > ul > li" ));
코드와 같이 해당 데이터를 가져오기 위해 cssSelector를 사용하는데, 크롬창의 크기가 변경되면 내부 html 태그들의 변화로 인하여 경로가 변경됨
이로인하여 지정해준 cssSelector를 찾아오지 못해 데이터를 가져오지 못하는 문제 발생
제대로 작동하지 않던 wait 대신,
Thread.*sleep*(2000)
을 사용하여 무조건 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");
- 페이지 로딩 시 충분한 로딩시간 필요!
- 창 크기에 따라 동적으로 바뀌는 웹페이지인지 체크 후, 동적으로 바뀌는 페이지일 경우 창 크기 고정하는 코드를 넣어주어야함!