- 뤼튼 캐릭터 크롤링2024년 10월 13일
- 31514
- 작성자
- 2024.10.13.:06
오늘은 뤼튼 홈페이지에서 캐릭터 데이터를 크롤링하면서 부딪혔던 문제들에 대해 글을 쓰려고 합니다.
기능 요구사항
위 이미지처럼 뤼튼에는 여러 캐릭터가 있습니다.
여기서 이름, 썸네일 이미지, 설명, 만든 사람을 추출합니다.
그리고 캐릭터를 클릭하면 볼 수 있는 첫 메시지 또한 가져오고 이를 MySQL에 저장하는 간단한 기능입니다.
사용한 기술
- 언어 : Python
- 크롤링 도구 : Playwright
- 오케스트레이션 툴 : Docker
- 패키징 : pyproject
참고 사항
- 뤼튼은 캐릭터를 가상 스크롤링 기술을 사용하여, 동적으로 렌더링합니다.
- 크롤링보다 더 좋은 방법은 뤼튼이 웹 사이트에 데이터를 전달하는 API의 패턴을 찾아보는 것이 더 좋습니다.
- 뤼튼은 next_cursor를 사용하여 캐릭터 정보를 담고 있는 API를 사용합니다.
첫 번째 문제
서두에도 말했듯이 캐릭터 정보를 가져오려면 지속적으로 스크롤 다운을 해야 합니다.
하지만 스크롤 다운 속도와 컨텐츠를 찾는 속도가 서로 다르다면 데이터가 유실되는 문제가 발생했습니다.
처음에는 scrollBy를 사용하여 px 단위로 스크롤 다운했지만, 적절한 숫자를 찾을 수 없었습니다.
위 사진을 보면 각 요소에 data-index 속성의 값이 연속적으로 들어가 있는 것을 확인할 수 있습니다.
이런 특징을 이용해 scroll_into_view_if_needed()를 사용하여 찾으려는 컨텐츠와 스크롤 다운 속도를 맞췄습니다.
두 번째 문제
가상 스크롤링을 사용하여 동적으로 컨텐츠를 렌더링하게 되면, 많은 컨텐츠를 로딩할수록 속도가 느려집니다.
제 경험상 보통 1000개 이상의 캐릭터가 로딩된 순간부터 눈에 띄게 지연을 확인할 수 있었습니다.
웹 드라이버를 사용하는 경우 이런 상황은 더 악화됩니다.
따라서 요소가 로딩되지도 않았는데 크롤링하려는 문제, 또는 아래와 같이 Crash가 발생하기도 합니다.
이럴 때는 사실 브라우저를 껐다가 다시 시작하는 방법밖에 없습니다.
그럼, 처음부터 다시 컨텐츠를 탐색해야 하나? 라는 생각이 들었지만, 이는 위에서 이미 봤던 data-index를 활용하여 해결했습니다.
각 카테고리 별로 JSON 파일을 만들어서, 하나의 컨텐츠를 크롤링할 때마다 그에 해당하는 data-index 값을 갱신했습니다.
따라서 브라우저를 재시작해도 이미 찾은 data-index 값을 스킵하면서 스크롤 다운만 하도록 구현했고, 신뢰성 있는 코드를 작성할 수 있었습니다.
하지만 여기서 궁극적으로 해결하지 못한 문제가 있는데..
사실 탐색한 데이터가 1,000개를 넘으면 거의 10개가량의 새로운 데이터를 아주 느리게 찾고, 브라우저 재시작 로직을 수행합니다.
이는 엄청난 지연 시간을 유발했고, 6시간가량 프로그램을 실행해도 1700 여개의 데이터만 가져왔습니다.
혹시나 이 글을 보시는 분들 중에 이를 해결하는 방법을 아시는 분이 있다면 댓글 부탁드립니다 ㅠ
세 번째 문제
앞서도 이야기했듯이 하나의 카테고리에서 1000 여개의 데이터를 탐색하면 지연 시간이 발생합니다.
따라서 저에게는 각 카테고리마다 독립적인 브라우저가 필요했습니다.
그래야 조금이라도 더 많은 데이터를 가져올 수 있기 때문입니다.
이를 위해 각 카테고리마다 독립적인 컨테이너를 부여했습니다.
물론 데이터 추출 코드는 하나만 사용했으며, 디자인 패턴 중 팩토리 패턴을 사용했다고 보시면 됩니다.
뤼튼의 카테고리에 해당하는 요소를 보시면, 위와 같이 하나의 div 태그에 여러 하위 div 태그가 있음을 알 수 있습니다.
따라서 상위 div 태그를 가져오면, 하위 태그에 대한 인덱스 번호를 부여할 수 있고 이를 활용하여 팩토리 패턴을 구현했습니다.
여기서 중요한 점은 chromium.launch_persistent_context()를 사용하여 브라우저를 실행해야 합니다.
이는 각 컨테이너가 서로 다른 사용자 데이터 디렉터리를 유지할 수 있으므로, 독립적인 브라우저 세션을 관리할 수 있게 도와줍니다.
'개발' 카테고리의 다른 글
홈 서버 구축기인데 LG U+를 곁들인.. (1) 2024.11.01 lazy load되는 컨텐츠 안정성있게 크롤링하기 (0) 2024.10.25 [MySQL] DELETE & UPDATE (0) 2024.10.04 멀티 프로세싱 & 멀티 스레딩 & 비동기 처리 (0) 2024.10.02 하둡 기초 개념 (0) 2024.09.30 다음글이전글이전 글이 없습니다.댓글