카카오테크 부트캠프/프로젝트

백준 문제 데이터 크롤링 트러블슈팅

bubhyun 2025. 5. 8. 17:31
728x90

트러블 슈팅

1. Solved.ac API를 통한 태그별 문제 목록 수집

문제

  • Solved.ac API 호출 시 한 번에 너무 많은 문제를 요청하거나, rate limit에 걸리는 경우가 있었음.

해결

  • API 문서를 참고하여 pagination 적용 (page, size 파라미터 사용)
  • https://solvedac.github.io/unofficial-documentation/#/ 
  • sleep(1)을 넣어 요청 간 딜레이 설정
  • X-RateLimit-Remaining 헤더를 참고하여 요청량 조절 가능하도록 로직 개선

2. 백준 각 문제 페이지 크롤링 (문제 설명, 입출력 등)

문제

  • BeautifulSoup을 이용해 HTML 파싱 중 일부 문제 페이지에서 NoneType 오류 발생
    → 특정 문제는 설명이나 예시가 비어있거나 구조가 다른 경우 존재

해결

  • soup.select_one() 사용 시 None 체크 후 .text 접근하도록 안전하게 처리
  • try-except 구문으로 개별 문제 크롤링 실패 시 로그 남기고 건너뛰기
  • 실패한 문제 번호는 별도로 리스트에 저장하여 나중에 재시도 가능하도록 구현

3. 문제 설명 중 HTML에 포함된 이미지 처리

문제

  • 문제 설명에 포함된 <img> 태그가 상대경로(/problem/파일명.png)로 되어 있어
    크롤링 결과에 이미지가 누락되거나 잘못 저장됨

해결

for img_tag in soup.select("img"): 
	if img_tag.get("src") and img_tag["src"].startswith("/"): 
    	img_tag["src"] = "https://static.baekjoon.io" + img_tag["src"]

4. 입출력 예제 파싱 오류

문제

  • 일부 문제는 입출력 예제가 <pre>로 되어 있지 않고, <div class="input-output"> 형태로 되어 있어
    기존 파싱 로직에서 누락됨

해결

  • HTML 구조를 문제마다 확인한 뒤, 다양한 케이스를 포괄할 수 있도록 유연한 파싱 로직 구성
    • <pre>, <div class="sample-input">, <div class="sample-output"> 모두 처리

5. 문제 번호, 티어, 제목 불일치 이슈

문제

  • Solved.ac에서 받은 문제 목록의 문제 번호와 실제 크롤링한 문제 페이지의 데이터가 일치하지 않거나 누락되는 문제 발생

해결

  • 문제 번호를 기반으로 JSON 키를 고정하고, 크롤링 결과가 없거나 누락되었을 경우 로그 출력
  • JSON 및 엑셀 저장 전, problem_id 기준으로 검증하는 로직 추가

6. 출력 파일 정합성 (JSON, Excel)

문제

  • 크롤링된 데이터가 JSON으로는 정상 저장되었으나, Excel 저장 시 줄바꿈이나 한글 인코딩 문제가 발생함

해결

  • pandas로 Excel 저장 시 encoding='utf-8-sig' 설정
  • to_excel() 사용 시 index=False, sheet_name 설정으로 가독성 확보

7. 태그별 데이터 저장 방식 개선

문제

  • 태그별로 JSON/Excel을 각각 따로 저장하려는 로직에서 덮어쓰기 발생

해결

  • 저장 경로를 data/tag_name/problems.json, problems.xlsx 형태로 구분
  • 디렉토리가 없을 경우 os.makedirs(path, exist_ok=True)로 사전 생성
728x90