전에 만들었던 데이터 수집 봇을 테스트 하고있었는데
생각보다 많은 오류와 불편한 점이 발견 되어 이를 개선시키기 위해 다시 좀 들여다보았다.
기존 파이프라인을 먼저 보자
이런 과정인데
여러 번 테스트를 거치면서 여러 문제점이 있었다.
1. 플랫폼마다 수집
2. CSV로 백업 파일 생성
3. RDB(MariaDB)로 insert하고 다음 플랫폼 수집을 진행하였다.
위와 같은 프로세스가 진행되어 다음 플랫폼으로 넘어갔다고 가정해보자
Playstation에서 데이터를 수집하는데 오류가 발생되어 만약 프로그램이 종료된다면..?
이전에 수집했던 데이터는 더미데이터로 남게되어버린다.
덕분에 데이터를 관리하는데 어려운 측면이 있었다.
실패하면 그 더미데이터를 수동으로 지워야했기 때문이다.
생각보다 별 거 아니겠거니 했는데 데이터가 쌓이다보니 관리가 너무 힘들었다.
기존 백업 데이터를 저장할 때
생성 날짜와 시간을 함께 사용해서 저장했는데
이게... 음... 나쁜건 아닌거같은데 좀 가독성이나 보기 불편한 기분이었다.
그래서 타임스탬프를 써서 저장하는게 낫다고 판단하였다.
생성 날짜와 시간을 전역 변수로 생성을 했었는데
이번엔 Database 클래스에 인스턴스 생성 시 같이 생성할 예정이다.
위의 문제점을 인지 후 개선한 버전이다.
Init, Collection, Upload 영역으로 명확하게 프로세스를 분류하였다.
기존에는 한 플랫폼 수집하자마자 DB로 Insert 과정을 거쳤지만
이번엔 Steam, Playstation, Xbox, Switch 이 4개의 데이터를 전부 수집하지 못하면 Upload 프로세스로 넘어가지 못하게 하였다.
덕분에 일관성 있는 데이터와 더미데이터를 줄일 수 있을 것으로 기대한다.
사실 Collection 영역을 만든 건 추후 병렬 프로그래밍을 통한 수집 속도 개선을 하기 위한 설계다.
기존 V1에서 만약 병렬 프로그래밍을 한다고 해보자
Steam, Playstation, Xbox, Switch 데이터를 동시에 수집하고
MariaDB에 insert를 하는 과정이 발생한다고 하면
만약 Switch 데이터가 먼저 수집이 되어 insert를 하고있는 중간에 Xbox가 데이터를 수집해서 insert를 동시에 한다고 가정해보자 그렇게 되면
성능 저하도 우려되고 동시성 문제나 데드락이 걸릴 수도 있다.
이를 방지하기 위해서 Collection을 영역을 나눠
Collection은 병렬로 데이터 수집을 진행한 다음 순차적으로 DB에 insert를 하는 것이
구조적으로 보나 확장성면에서 더 유리할 것으로 판단하였다.
이번에 Xbox 번들 탐지 알고리즘도 개선하였다.
사실 상 새로 만들었다고 하는게 맞다.
개선하기 위해서
일단 상품이 어떤식으로 나오는지 패턴을 분석했다.
Xbox는 이렇게 Edition 같은 패키지 상품도 출시 예정 리스트에 올리는데
상세 페이지는 "포함됨" 혹은 "이 번들" 영역이 존재한다.
하지만 인식해야할 건 "이 번들" 영역이다.
공통점 -> 모든 오리지널 게임들은 다 첫번째에 배치되어있다.(라고 생각했으나 아니였다.)
“이 번들” -> 인식 대상
“포함됨" -> 인식 대상 X (대부분 DLC)
"이 번들"에 있는 오리지널 게임으로 Redirect 하는 것이 목표이다.
이 번들 영역은 일단 분석해 본 결과 4가지 패턴이 존재하였다.
이렇게 4가지 패턴으로 존재하는데
오리지널 게임은 보통 게임보기, 가격 형태로 표시가 된다는 것이었다.
그리고 만약 가격+게임보기처럼 동시에 존재하는 형태인 경우
가격이 붙은 상품이 오리지널 게임이었다.
이런 패턴을 분석하여 솔루션을 정리하였다.
게임보기 혹은 가격이 있으면 그건 원본 게임일 확률이 높다.
N번째 게임을 순차적으로 수집해 패턴과 일치하는지 확인 후 그 곳으로 페이지를 넘긴다.
만약 첫번째에서 패턴이 일치하지 않으면 두번째 세번째 넘어가면서 순차적으로 패턴 분석
알고리즘
코드
패턴 탐지 if문
이전 코드와 비교해보자
이전에 비하면 엄청 단순화 되었고 정확도가 올라갔다!
이전 알고리즘은 제대로 탐지를 못해 이상한 DLC페이지로 넘어갔었다.
이 부분 때문에 이상한 데이터를 수집하거나 프로그램이 터졌었다.
다음 V3는 아무래도 병렬 프로그래밍을 통한 수집 속도를 개선할 예정이다.
아마 이 파트는 겜린더가 정식 출시했을 때 할 수 있지 않을까 싶다.
지금은 앱 개발이 더 급하기 때문이다.
개발 중인 부분을 잠깐 보여주자면
빠르게 탐색하고 나만의 겜린더에 빠르게 추가하는 인터랙션을 넣어보고 있다.
얼른 정식 출시해서 사용자 피드백을 많이 들어보고 싶다. 😁