22from crawler .main_crawler import run_crawlers
33from server .logger import logger
44
5- crawler_bp = Blueprint ( 'crawler' , __name__ , url_prefix = '/crawler' )
5+ import threading
66
7- @crawler_bp .route ('/' , methods = ['GET' ])
8- def crawler ():
9- # GET 파라미터에서 targets 가져오기
10- targets_param = request .args .get ('targets' ) # 예: 'bbc,wevity'
7+ crawler_bp = Blueprint ('crawler' , __name__ , url_prefix = '/crawler' )
118
12- # 파라미터가 있다면 리스트로 분할
13- if targets_param :
14- targets = [t .strip () for t in targets_param .split (',' )]
15- else :
16- targets = None # 전체 실행
9+ # 상태 관리 변수
10+ status = {
11+ "state" : "idle" , # idle | running | done | error
12+ "error" : None ,
13+ "targets" : None
14+ }
15+ lock = threading .Lock ()
16+
17+ def background_crawl (targets ):
18+ global status
1719
1820 try :
21+ with lock :
22+ status ["state" ] = "running"
23+ status ["error" ] = None
24+ status ["targets" ] = targets or "all"
25+
1926 run_crawlers (targets )
20- return jsonify ({"message" : "크롤러 실행 완료" , "targets" : targets or "all" }), 200
27+
28+ with lock :
29+ status ["state" ] = "done"
2130 except Exception as e :
2231 logger .error (f"크롤러 실행 중 오류: { e } " )
23- return jsonify ({"error" : str (e )}), 500
32+ with lock :
33+ status ["state" ] = "error"
34+ status ["error" ] = str (e )
35+ finally :
36+ pass
37+
38+ @crawler_bp .route ('/run' , methods = ['GET' ])
39+ def start_crawler ():
40+ """크롤러를 시작하는 API 엔드포인트
41+
42+ Query Parameters:
43+ targets (str, optional): 쉼표로 구분된 크롤링 대상 목록
44+ 예: "bbc,wevity"
45+ 미지정시 모든 대상을 크롤링
46+
47+ Returns:
48+ JSON:
49+ - 성공시 (202):
50+ {
51+ "message": "크롤러 실행 시작됨",
52+ "targets": "<target_list>" or "all"
53+ }
54+ - 실행 중일 때 (429):
55+ {
56+ "message": "이미 크롤러가 실행 중입니다."
57+ }
58+ """
59+ targets_param = request .args .get ('targets' )
60+ targets = [t .strip () for t in targets_param .split (',' )] if targets_param else None
61+
62+ with lock :
63+ if status ["state" ] == "running" :
64+ return jsonify ({"message" : "이미 크롤러가 실행 중입니다." }), 429
65+
66+ thread = threading .Thread (target = background_crawl , args = (targets ,))
67+ thread .start ()
68+
69+ return jsonify ({"message" : "크롤러 실행 시작됨" , "targets" : targets or "all" }), 202
70+
71+
72+ @crawler_bp .route ('/status' , methods = ['GET' ])
73+ def get_crawler_status ():
74+ """현재 크롤러의 상태를 조회하는 API 엔드포인트
75+
76+ Returns:
77+ JSON (200):
78+ {
79+ "state": "idle" | "running" | "done" | "error",
80+ "error": "오류 메시지" or null,
81+ "targets": ["대상1", "대상2"] or "all" or null
82+ }
83+ """
84+ with lock :
85+ return jsonify ({
86+ "state" : status ["state" ],
87+ "error" : status ["error" ],
88+ "targets" : status ["targets" ]
89+ }), 200
0 commit comments