데이터 수집

김현학·6일 전
0

한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 후기입니다.

핵심 목표는 가치가 높은 스타트업을 머신러닝을 활용하여 판단하고, 우수한 기업의 채용 정보를 한 곳에 모아 참고할 수 있는 형태로 만드는 것이다.

크게 두 가지 형태의 데이터가 필요하다.

  1. 스타트업 리스트 및 상세 정보
  2. 기업 채용 정보

계획

필요한 정보는 다음과 같다.

  1. 기업명
  2. 분야/키워드
  3. 투자 유치 및 재무 정보
  4. 채용 정보
  5. 수집 일시

예상하기에 딱히 엄청나게 많은 용량을 필요로 할 것 같지는 않지만, 향후 다른 프로젝트와도 호환될 수 있는 형태로 실습하고자해서 일단 용량이 큰 외장 HDD에 마운트하여 시작하려고 한다. 데이터베이스 설정 과정 및 결과는 본 포스트 내용과 관계가 없으므로, git commit 링크로 간단히 넘어가겠다.

서버 과부하를 고려하여 간격을 넉넉히 두고 정보를 수집하려 한다. 실시간성이 중요한 데이터가 아니므로 배치(batch) 패턴을 활용하려 한다. 책에서 '제한된 메모리로 무거운 연산'을 실행하기 위한 목적으로 이를 언급했는데, 앞서 언급했듯 데이터 양이 그렇게 많지는 않은 상황이다. 하지만 어디까지나 '대규모 머신러닝 시스템'을 구축하는 연습을 하는 과정이기 때문에, 데이터 양이 엄청나게 많은 상황을 가정해보려 한다.

현재 3대의 노트북이 존재한다.

  1. M3 MacOS + Portable HDD
  2. M2 MacOS
  3. Windows + RTX 4060 Laptop

1번 노트북은 CPU 집약적인 작업 효율이 가장 높아 주로 개발에 사용하고 있다. 확장을 고려한다면, 2번 노트북에서도 병렬 배칭으로 정보를 수집할 수 있는 구조가 되어야 한다. 이후 모델 학습을 위해 필요하다면 3번 노트북 그래픽카드의 CUDA 코어를 활용할 수 있다.

1. Selenium & BeautifulSoup

타겟 사이트에서 상세 정보의 위치를 알았다면, 이후 신경써야 하는 부분은 크게 세 가지이다.

  1. 정보 페이지에서 원하는 데이터를 추출하는 로직 (commit)
  2. 다양한 정보 페이지를 순회하고 저장하는 로직 (commit)
  3. 주기적으로 정보를 수집하는 cron 작업 정의 (commit)

데이터의 특성 자체는 이미 설명했고, 스크래핑으로 잘 알려진 두 패키지를 활용하여 사이트에 맞는 자동화 로직을 구현하면 된다. 이 부분은 수집하려는 사이트의 특성에 따라 다르게 구현되어야 하고, 본 포스트의 목적과 차이가 있기 때문에 구현 커밋 링크만 올려두었다 (1,2번 커밋). 본 포스트에서는 서로 다른 다수의 장치와 협동하여 3번 작업을 수행하는 과정에 좀 더 집중하려 한다.

2. 배치 처리

목표는 단순하다. 데이터 수집의 책임을 갖는 1번 노트북에서 중복 없이 주기적으로 정보를 수집하도록 만들면 된다. 이를 달성하기 위한 방법은 다양하지만, 이번에는 그냥 간단하게 Python 프로그래밍을 통해 구현해보려 한다.

A. 작업 정의

현재 프로젝트는 Crawler와 Scraper를 분리했다. Scraper가 실제 활용될 데이터가 있는 페이지에서 데이터를 수집하는 역할이고, Crawler는 그런 데이터가 존재하는 페이지의 URL을 가져오는 역할이다. 이번 실습에서는 Crawler는 단순히 page를 1번부터 증가시키면서 참조하면 된다.

import os
SCRAPE_CUR_PAGE: int = int(os.getenv('SCRAPE_CUR_PAGE', 1))

B. 상태 유지

유의할 점은 이러한 데이터 수집이 도중에 중단되더라도 이후에 중단된 지점에서부터 다시 시작되어야만 한다는 것이다. 여러 방법이 있겠지만 그냥 최초 실행 시, 파일을 읽는 방식으로 구현하면 큰 어려움 없이 상태를 저장하고 불러올 수 있다. 여기서는 dotenv의 set_key 함수를 사용한다.

from dotenv import set_key
set_key('.env', 'SCRAPE_CUR_PAGE', str((cur_page % 10) + 1))

C. 주기적 실행

1번 노트북은 macOS이므로 crontab 명령을 활용하려 한다.
A의 내용을 main.py에 작성하고, 이를 주기적으로 실행하도록 만드는 스크립트를 작성했다.

#!/bin/bash

# 1. 현재 파일 경로 및 파일명 저장
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
TARGET="cron.sh"

# 2. cron 작업 등록 (조건부)
if crontab -l | grep -q "$DIR/$TARGET"; then
    echo "Cron job already exists"
else
    (crontab -l ; echo "*/10 * * * * $DIR/$TARGET") | crontab -
    echo "Cron job added"
fi

# 3. 실행
source "$DIR/.venv/bin/activate"
python3 "$DIR/main.py"

3. 현재 상황

일단 이로서 주기적으로 데이터를 수집하는 간단한 실습을 완료했다.
다음 단계는 수집한 데이터 기반의 머신러닝 모델을 만들고 서빙하는 작업이다.

0개의 댓글