네이버 카페 문제지 자동 수집 (Naver Cafe Worksheet Collection)

개요

목표: 외주 강사 활용 취소 → 운영 공부방의 문제지를 자동 수집하여 aplus-tracker의 문제 DB로 활용

현황: Phase 1 완료 (OAuth 콜백 + 파일 다운로드 자동화)


Phase 1: 자동 수집 파이프라인 ✅ 완료 (2026-05-02)

완료 사항

항목상태상세
OAuth 콜백 대기page.wait_for_url("**/naver_loginact.asp**") 구현
JavaScript 함수 호출goDown() 함수로 파일 다운로드
최대 3개 제약 적용didimdol 서버 정책 준수
자동 수집 스크립트collect_cafe_simple.py 완성

수집 결과

✅ 수집 완료

  게시글: 26개 처리
  파일: 43개 다운로드
  에러: 0개
  소요 시간: 386.5초 (~6.4분)

저장 위치: storage/worksheets/ (43개 ZIP 파일)

기술 스택

항목내용
브라우저 자동화Playwright (async)
로그인 관리쿠키 저장/로드 + 세션 유지
파일 다운로드page.expect_download() + ZIP 저장
스크래핑 패턴CSS selector + JavaScript 함수 호출

파일 구조

app/aplus-tracker/api/
├── app/scripts/cafe_collector/
│   ├── session.py              (OAuth 콜백 대기)
│   ├── scraper.py              (최대 3개 제약)
│   ├── downloader.py           (JavaScript 함수 호출)
│   ├── parser.py               (⏳ TODO)
│   └── importer.py             (⏳ TODO)
├── app/scripts/
│   ├── collect_cafe_simple.py  (자동 수집 실행)
│   └── collect_cafe.py         (완전한 파이프라인, 미완성)
└── storage/worksheets/         (다운로드 파일 저장)

Phase 2: 데이터 파싱 및 DB 저장 (진행 예정)

2-1. parser.py (ZIP 추출 + PDF 파싱)

목표: 43개 ZIP 파일 → 텍스트/이미지 추출

구현 방법:

  • ZIP 파일 자동 추출
  • pdfplumber: PDF 텍스트 추출
  • pytesseract: 이미지 OCR (필요시)

예상 산출물:

  • 추출된 문제 데이터 (JSON)
  • 문제별 메타데이터 (제목, 단원, 난이도)

2-2. importer.py (PostgreSQL 저장)

목표: 추출된 데이터 → aplus-tracker DB

구현 방법:

  • cafe_post 테이블: 게시글 메타데이터
  • question 테이블: 추출된 문제 (source=‘cafe’)
  • worksheet 테이블: 파일 원본 저장

마이그레이션:

-- cafe_post 테이블 추가
ALTER TYPE question_source ADD VALUE 'cafe';
 
CREATE TABLE cafe_post (
    id BIGSERIAL PRIMARY KEY,
    cafe_id TEXT NOT NULL,
    post_id TEXT NOT NULL,
    post_title TEXT NOT NULL,
    post_url TEXT NOT NULL,
    author_name TEXT,
    posted_at TIMESTAMPTZ,
    collected_at TIMESTAMPTZ DEFAULT NOW(),
    attachments JSONB DEFAULT '[]',
    status TEXT DEFAULT 'pending',
    UNIQUE (cafe_id, post_id)
);
 
ALTER TABLE question
  ADD COLUMN source_cafe_post_id BIGINT REFERENCES cafe_post(id);

2-3. collect_cafe.py 완성

목표: 자동 수집 → 파싱 → DB 저장 일관된 파이프라인

실행 커맨드:

# 전체 수집 실행
python -m app.scripts.collect_cafe --limit 50
 
# 신규 게시글만
python -m app.scripts.collect_cafe --mode incremental
 
# 특정 게시판만
python -m app.scripts.collect_cafe --board-id "문제지공유"

기술 문제 해결 기록

OAuth 콜백 미완료 (✅ 해결)

문제: didimdol 페이지 접근 시 항상 로그인 페이지로 리다이렉트

근본 원인: OAuth 콜백 URL (naver_loginact.asp) 완료 대기 없음

해결책:

await page.wait_for_url("**/naver_loginact.asp**", timeout=30000)

파일 다운로드 링크 없음 (✅ 해결)

문제: downpop.asp 팝업에 직접 파일 링크가 없음

원인: didimdol의 다운로드는 JavaScript goDown() 함수 호출

해결책:

# 파일 링크 탐색 → 없으면 JavaScript 함수 호출
if not download_link:
    async with page.expect_download(timeout=15000) as download_info:
        await page.evaluate("goDown()")

다음 단계

Phase항목DeadlineStatus
2parser.py 구현2026-05-16⏳ pending
2importer.py 구현2026-05-23⏳ pending
2collect_cafe.py 완성2026-05-30⏳ pending
3운영 대시보드 연동2026-06-30⏳ pending

참고

  • 카페 ID: gongbangddd (공부방 아이디)
  • 외부 링크 수: 26개 게시글
  • 다운로드 제약: 최대 3개 단원씩 선택 (didimdol 정책)
  • 저장소: storage/worksheets/
  • 로그 파일: cafe_collect.log