스크롤 자동화
이전 글에서 목표로 삼았던 스크롤 자동화를 구현했다.
이제 수동으로 스크롤을 내리지 않아도 크롤링 메서드를 호출하면 알아서 긁어온다.
이전 글이랑 크게 다를건 없고 자동 스크롤만 추가됐다. 테스트도 동일한 코드.
과정은 간단하게 설명하면 다음과 같다.
- 셀레니움을 이용하여 크롬 드라이버를 동작시킨다. (SeleniumConfig에서 관련 설정 초기화)
- 크롬 드라이버에 픽시브 몰루짤 검색 url 을 입력한다.
- 셀레니움 기능으로 페이지 높이를 계산하는 자바 스크립트를 실행한다.
- 계산한 페이지 높이로 조금씩 스크롤을 내린다. (한번에 너무 많이 내리면 오류 생길듯)
- 픽시브 몰루짤 일러스트 탭이 뜨고 썸네일 이미지 url 만 긁어온다 (60장.)
CrawlingService
@RequiredArgsConstructor
@Service
public class CrawlingService {
// 짤 크롤링
private static final String URL_ILLUSTRATION = "https://www.pixiv.net/tags/%E3%83%96%E3%83%AB%E3%83%BC%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96/illustrations";
private static final String IMAGE_BOX_ILLUSTRATION = "#root > div.charcoal-token > div > div:nth-child(4) > div > div > div.sc-15n9ncy-0.jORshO > section > div.sc-l7cibp-0.juyBTC > div:nth-child(1) > ul > li";
public List<String> getImages() {
ChromeDriver driver = SeleniumConfig.chromeDriver();
driver.get(URL_ILLUSTRATION);
// 자동 스크롤 부분
Long height = (Long) driver.executeScript("return document.body.scrollHeight");
Long scroll = 500l;
while (scroll <= height) {
driver.executeScript("window.scrollTo(0," + scroll + ")");
scroll += 500l;
}
List<WebElement> imageBox = driver.findElements(By.cssSelector(IMAGE_BOX_ILLUSTRATION));
List<String> images = imageBox.stream()
.map(o -> o.findElement(By.cssSelector("img.sc-rp5asc-10.erYaF")).getAttribute("src"))
.collect(Collectors.toList());
driver.quit();
return images;
}
}
CrawlingServiceTest
@SpringBootTest
class CrawlingServiceTest {
@Autowired
private CrawlingService crawlingService;
@DisplayName("픽시브 이미지를 크롤링하면 60장의 이미지 url을 긁어온다.")
@Test
void CrawlingServiceTest() throws InterruptedException {
// given
List<String> result = crawlingService.getImages();
// expected
assertThat(result.size()).isEqualTo(60);
}
}
다음 목표
다음 목표는 60장의 짤을 렌더링하는것이다.
프론트엔드도 필요한만큼 공부해야 할거고, 각종 문제도 해결해야 할테니 갈 길이 멀겠지만 화이팅!
'픽시브 크롤링 해보기 > 기능구현' 카테고리의 다른 글
[BE] 픽시브 짤 다운로더 구현 (0) | 2023.11.29 |
---|---|
[BE] 픽시브 짤 크롤러 난관에 봉착 (0) | 2023.11.27 |
[BE] 픽시브 몰루 짤 크롤링 API (0) | 2023.11.24 |