픽시브 짤 크롤링

셀레니움을 이용하여 픽시브 짤 크롤링 기능을 구현해보았다.

사실 크롤링이라 해야할지 스크래핑이라 해야할지 모르겠지만 아무튼...

이미지를 저장하는건 아니고 픽시브에서 일러스트 탭에서 블루아카이브 태그로 검색한 결과의 썸네일 리스트만 긁어온다.

픽시브는 동적 페이지라서 스크롤을 어느 정도까지 내려야 모든 이미지를 로딩한다.

하지만 이건 아직 미완성 버전이라 크롬 드라이버를 수동으로 스크롤해서 내려줘야 60장을 온전히 긁어온다.

크롤링 과정은 간단하게 설명하면 다음과 같다.

 

  1. 셀레니움을 이용하여 크롬 드라이버를 동작시킨다. (SeleniumConfig에서 관련 설정 초기화)
  2. 크롬 드라이버에 픽시브 몰루짤 검색 url 을 입력한다.
  3. 픽시브 몰루짤 일러스트 탭이 뜨고 썸네일 이미지 url 만 긁어온다 (60장.)

SeleniumConfig

윈도우 기준 config 이다. 맥은 조금 다르게 설정 해줘야 한다.

@Configuration
public class SeleniumConfig {

    public static ChromeDriver chromeDriver() {
        System.setProperty("webdriver.chrome.driver", "driver/chromedriver.exe");
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        driver.manage().timeouts().implicitlyWait(Duration.ofMinutes(3));
        driver.manage().window().maximize();
        return driver;
    }
}

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);

        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

테스트 코드는 간단하게 60장 다 긁어 오는지만 확인하는 테스트만 작성해봤다.

더 수정할 부분도 있을듯?

@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);
    }

}

 


다음 목표

다음 목표는 수동 스크롤할 필요 없이 자동으로 스크롤 하여 이미지를 긁어오는 기능을 구현하는것이다.

+ Recent posts