네이버 카페 문제지 자동 수집 (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 | 항목 | Deadline | Status |
|---|---|---|---|
| 2 | parser.py 구현 | 2026-05-16 | ⏳ pending |
| 2 | importer.py 구현 | 2026-05-23 | ⏳ pending |
| 2 | collect_cafe.py 완성 | 2026-05-30 | ⏳ pending |
| 3 | 운영 대시보드 연동 | 2026-06-30 | ⏳ pending |
참고
- 카페 ID:
gongbangddd(공부방 아이디) - 외부 링크 수: 26개 게시글
- 다운로드 제약: 최대 3개 단원씩 선택 (didimdol 정책)
- 저장소:
storage/worksheets/ - 로그 파일:
cafe_collect.log