TIL 78 - [ Spring 최종 프로젝트 ( Day 14 ) - 웹 크롤링 (2) ]

2025. 6. 17. 21:05·[내일배움캠프-Sparta]/Spring 6기
반응형

2025.06.16 - [[내일배움캠프-Sparta]/Spring 6기 ( + TIL )] - TIL 77 - [ Spring 최종 프로젝트 ( Day 13 ) - 웹 크롤링 ]

 

TIL 77 - [ Spring 최종 프로젝트 ( Day 13 ) - 웹 크롤링 ]

이제 MVP 기능을 마무리하고, 각자 리팩토링 까지완료해서 프로젝트의 성능과 고도화 기능에 대해서 고민해보았고, 이제 오늘부터 이제 기술 고도화 작업에 들어갓다. 확실히 난이도 있는 작업

dimenshun.tistory.com

오늘도 웹 크롤링에 대해서 시간을 가져보았다.

 

이전에 웹 크롤링 포스팅 이어서 작성하도록 할 것 같다.

✅ 테스트 케이스 분리

 테스트케이스를 입출력을 분리하기 위해서 json 형태를 그래서, 해당하는 함수를 이전 로직에 추가하였다.

# 샘플 input/output 분리 함수
def parse_sample_text(sample_text):
    lines = sample_text.strip().splitlines()
    input_part = []
    output_part = []
    current = None

    for line in lines:
        line = line.strip()
        if line == "입력":
            current = "input"
            continue
        elif line == "출력":
            current = "output"
            continue

        if current == "input":
            input_part.append(line)
        elif current == "output":
            output_part.append(line)
        elif current is None:
            # "입력/출력" 구분 없을 경우 자동 분리
            if not input_part:
                input_part.append(line)
            else:
                output_part.append(line)

    return "\n".join([line for line in input_part if line.strip()]), "\n".join([line for line in output_part if line.strip()])

⚡ JSON 변환 

json으로  problems.json 파일을 불러와서, 

포맷팅이 된 리스트(fomatted_problems, testcase_map) 를 선언해주고, problems에 있었던 것을 for문을 통해  해당하는 리스트에 spring proejct JSON 형식에 맞게 매핑해주었다.

여기서 category랑, difficulty는 ai 한테 문제를 직접 알려줘서 바꿔달라하거나, 직접 설정을 해주어야 할것 같다.

(사이트 내에서는 카테고리와 난이도의 정보가 없기 때문이다.)

import json

# 원본 문제 JSON 파일 열기
with open("../problems.json", "r", encoding="utf-8") as f:
    problems = json.load(f)

# 변환된 문제 리스트와 테스트케이스 맵 준비
formatted_problems = []
testcase_map = {}

for p in problems:
    formatted_problems.append({
        "category": "FOR_BEGINNER",
        "title": p["title"],
        "description": p["description"],
        "difficulty": "브론즈",
        "memoryLimit": 50000,
        "timeLimit": 1.0,
        "reference": "DOVELET"
    })

    title = p["title"]
    testcase_map[title] = []

    if p.get("sample_input", "").strip() and p.get("sample_output", "").strip():
        testcase_map[title].append({
            "input": p["sample_input"].strip(),
            "output": p["sample_output"].strip()
        })

# 결과 저장
with open("../formatted_problems.json", "w", encoding="utf-8") as f:
    json.dump(formatted_problems, f, indent=2, ensure_ascii=False)

with open("../formatted_testcases.json", "w", encoding="utf-8") as f:
    json.dump(testcase_map, f, indent=2, ensure_ascii=False)

 

이제 우리 프로젝트에 맞게 JSON형태를 만들어 주었다.

대부분의 문제들은 메모리 제한은 5만, 시간 제한은 1초를 넘어가지 않아서 1초로 명시해주었고, 출처는 DOVELET 으로 명시했다.

 

아무튼 이 로직을 실행을 하게되면 json 파일이 2개로 나뉘어져서 결과값이 저장되어 파일이 저장된다.

이제 Spring 프로젝트가 실행되어 있으면, 해당하는 python에서 upload 파이썬 파일을 실행 하게 해준다.

반드시 서버가 실행되어 있어야 정상적으로 수행할 수 있다.

💡 문제 등록

테스트를 위해서 1개의 문제만 요청을 보냄. ( 서버가 실행되어 있어야 한다. )

프로젝트 내에서 DB에 저장되어 있는 문제는 이미 등록되어 있는 문제는 예외처리가 발생하게 되어 있다.

 

해당 문제를 등록하기 위해선 JWT 토큰이 필요하기 때문에 Headers에서 인증하는 토큰 값이 필요해서 로그인을 해서 토큰 값을 받아와서 저장을 해주어서 저장을 하게 해줘야 한다.

import json
import requests

# === 설정 ===
API_URL = "http://localhost:8080/api/admin/problems"  # 실제 스프링 서버 주소
HEADERS = {
    "Content-Type": "application/json",
    # 인증이 필요하다면 아래 줄을 주석 해제하고 토큰 입력
    "Authorization": "Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiZW1haWwiOiJtaW5qZWVAbmF2ZXIuY29tIiwidXNlcm5hbWUiOiJ0ZXN0bmFtZSIsIm5pY2tuYW1lIjoiTWljayIsInVzZXJSb2xlIjoiQURNSU4iLCJ0aWVyIjoiTkVXQklFIiwiZXhwIjoxNzUwNzUzNjM2LCJpYXQiOjE3NTAxNDg4MzZ9.WBi6nXu21bmqlDs6agYzRsZDR2pxd51epUnWX0k8yvU"
}

# === 1개 문제만 로드 ===
with open("../formatted_problems.json", "r", encoding="utf-8") as f:
    problems = json.load(f)

# 첫 번째 문제만 사용
problem = problems[2]

# === POST 요청 payload 구성 ===
payload = {
    "category": "FOR_BEGINNER",                      # 고정값 또는 조건에 따라 조절
    "title": problem["title"],
    "description": problem["description"],
    "difficulty": "BRONZE",                          # 고정값 또는 조건 분기 가능
    "memoryLimit": 30000,                            # 문제에 따라 조절 가능
    "timeLimit": float(problem["timeLimit"]),        # 문자열이면 float 변환
    "reference": problem["reference"]                          # 고정값 또는 "CRAWLED"
}

# === 전송 ===
response = requests.post(API_URL, headers=HEADERS, json=payload)

# === 결과 출력 ===
if response.status_code == 201:
    print(f"✅ 문제 등록 성공: {problem['title']}")
    print("응답 데이터:", response.json())
else:
    print(f"❌ 문제 등록 실패: {problem['title']}")
    print("상태 코드:", response.status_code)
    print("에러 응답:", response.text)

 

반응형

'[내일배움캠프-Sparta] > Spring 6기' 카테고리의 다른 글

TIL 80 - [ Spring 최종 프로젝트 ( Day 16 ) - 문제 찾기,, ]  (0) 2025.06.19
TIL 79 - [ Spring 최종 프로젝트 ( Day 15 ) - 문제 파트 의사결정 ]  (0) 2025.06.18
TIL 77 - [ Spring 최종 프로젝트 ( Day 13 ) - 웹 크롤링 ]  (0) 2025.06.16
TIL 76 - [ Spring 최종 프로젝트 ( Day 12 ) - 코드 리팩토링(2) 동적쿼리 QueryDSL, 트러블 슈팅 ]  (0) 2025.06.13
TIL 75 - [ Spring 최종 프로젝트 ( Day 11 ) - 코드 리팩토링(1) 동적쿼리 QueryDSL ]  (0) 2025.06.12
'[내일배움캠프-Sparta]/Spring 6기' 카테고리의 다른 글
  • TIL 80 - [ Spring 최종 프로젝트 ( Day 16 ) - 문제 찾기,, ]
  • TIL 79 - [ Spring 최종 프로젝트 ( Day 15 ) - 문제 파트 의사결정 ]
  • TIL 77 - [ Spring 최종 프로젝트 ( Day 13 ) - 웹 크롤링 ]
  • TIL 76 - [ Spring 최종 프로젝트 ( Day 12 ) - 코드 리팩토링(2) 동적쿼리 QueryDSL, 트러블 슈팅 ]
dimenshun
dimenshun
한 소년의 개발 일기
    반응형
  • dimenshun
    Dev Life Notes
    dimenshun
  • 전체
    오늘
    어제
    • 분류 전체보기 (268)
      • CS (23)
        • 자료구조 (0)
        • 알고리즘 (0)
        • 컴퓨터 구조 (8)
        • 네트워크 (6)
        • 운영체제 (3)
        • DB ( + SQLD ) (5)
        • SW공학 (1)
      • 프로그래밍 (3)
        • Java (0)
        • Spring (0)
        • HTML,CSS (3)
        • JavaScript (0)
      • 개발 툴 (7)
        • Git(버전관리) (1)
        • Docker (3)
        • AWS (2)
        • JSP (1)
      • 코딩테스트(Algorithm) (125)
        • 백준 (6)
        • 프로그래머스 (119)
      • [내일배움캠프-Sparta] (110)
        • Spring 6기 (106)
        • KPT 회고 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    컴퓨터구조
    db
    네트워크
    spring
    Java
    cs
    SQLD
    KPT
    개발자
    코딩테스트
    백엔드
    웹
    network
    CPU
    docker
    It
    SQL
    Testcode
    세션
    OS
    web
    내일배움캠프
    AWS
    Python
    배포
    운영체제
    트랜잭션
    Til
    알고리즘
    메모리
  • hELLO· Designed By정상우.v4.10.3
dimenshun
TIL 78 - [ Spring 최종 프로젝트 ( Day 14 ) - 웹 크롤링 (2) ]
상단으로

티스토리툴바