-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcrawler_config.py
More file actions
199 lines (147 loc) · 6.48 KB
/
crawler_config.py
File metadata and controls
199 lines (147 loc) · 6.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
"""
HANA (Hansung AI for Notice & Assistance)
한성대학교 공지사항 크롤링 시스템 설정 파일
이 파일은 크롤링 시스템의 모든 설정값을 관리합니다.
설정 변경 시 이 파일만 수정하면 전체 시스템에 반영됩니다.
"""
import os
from dotenv import load_dotenv
# ============================================================================
# 환경 변수 로드
load_dotenv()
# ============================================================================
# 크롤링 대상 설정
# 한성대학교 공지사항 RSS 피드 URL (.env 파일에서 로드)
# - RSS 피드는 XML 형식으로 공지사항 목록을 제공
# - .env 파일에 RSS_URL 변수를 설정하세요.
RSS_URL = os.getenv("RSS_URL")
# 기본 도메인 (절대 URL 생성용, .env 파일에서 로드)
# - RSS 피드에서 상대 경로로 제공되는 링크를 절대 경로로 변환할 때 사용
# - .env 파일에 BASE_DOMAIN 변수를 설정하세요.
BASE_DOMAIN = os.getenv("BASE_DOMAIN")
# HTML 크롤링 대상 CSS 클래스명
HTML_CONTENT_CLASS = "view-con" # 본문 내용이 있는 div 클래스
HTML_FILE_CLASS = "view-file" # 첨부파일이 있는 div 클래스
# 공지사항 ID 추출 정규식 패턴
# - URL에서 공지사항 고유 ID를 추출하는 패턴
NOTICE_ID_PATTERN = r'143/(\d+)'
# ============================================================================
# 크롤링 동작 설정
# HTTP 요청 타임아웃 (초)
# - 네트워크 문제나 서버 응답 지연 시 무한 대기를 방지
REQUEST_TIMEOUT = 30
# ============================================================================
# 카테고리 설정
# 크롤링 대상 카테고리 화이트리스트
# - 이 목록에 포함된 카테고리만 크롤링
ALLOWED_CATEGORIES = [
"한성공지",
"학사",
"비교과",
"진로 및 취·창업",
"장학",
"국제",
]
# 세부 카테고리 → 대표 카테고리 매핑 테이블
# - 학교 공지사항의 세부 카테고리를 대표 카테고리로 통합
CATEGORY_MAP = {
# 진로 관련
"진로": "진로 및 취·창업",
# 취업 관련 세부 카테고리
"강소기업채용": "진로 및 취·창업",
"채용정보": "진로 및 취·창업",
"인턴쉽": "진로 및 취·창업",
"교육프로그램": "진로 및 취·창업",
"고시반": "진로 및 취·창업",
"기타": "진로 및 취·창업",
# 창업 관련 세부 카테고리
"창업정보": "진로 및 취·창업",
"창업공모전": "진로 및 취·창업",
"창업행사": "진로 및 취·창업",
# 장학 관련 세부 카테고리
"국가장학금": "장학",
"교외장학금": "장학",
"교내장학금": "장학",
"면학근로": "장학",
"학자금대출": "장학",
"국가근로": "장학",
"공모전 등": "장학",
"비교과장학": "장학",
}
# ============================================================================
# 데이터베이스 설정
# 크롤링한 공지사항 저장하는 텍스트 파일명
# - 텍스트 파일 기반 간단한 DB로 동작
DB_TEXT_FILENAME = "notice_db.txt"
# 마지막 크롤링 ID 저장 파일명
# - 일일 크롤링 시 중복 방지를 위한 ID 추적
CRAWLED_ID_FILENAME = "crawled_id.txt"
# ============================================================================
# PDF 및 OCR 처리 설정
# OCR 처리를 위한 임시 PDF 저장 디렉토리
# - 이미지가 포함된 공지사항을 PDF로 변환 후 OCR 처리
OUTPUT_DIR = "./pdf"
# 임시 PDF 파일명
# - OCR 처리 후 자동으로 삭제
PDF_FILENAME = "temp.pdf"
# 임시 PDF 파일 전체 경로
PDF_PATH = os.path.join(OUTPUT_DIR, PDF_FILENAME)
# OCR 처리 전 대기 시간 (초)
# - 연속적인 OCR 요청으로 인한 서버 부하 방지
OCR_DELAY = 3
# OCR 적용을 위한 최소 텍스트 길이 (문자 수)
# - 본문이 이 길이보다 짧으면 이미지 OCR을 시도
MIN_TEXT_LENGTH = 250
# ============================================================================
# OpenAI API 설정
# OpenAI API 키 (.env 파일에서 로드)
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
# 사용할 OpenAI 모델
MODEL = "gpt-4o-mini"
# AI 응답 생성 시 사용할 온도 (0.0 ~ 1.0, 낮을수록 일관성 높음)
TEMPERATURE = 0.1
# AI 응답 최대 토큰 수
MAX_TOKENS = 200
# OpenAI API 호출 간 지연 시간 (초)
# - 레이트 리밋(Rate Limit) 초과를 방지
AI_CALL_DELAY = 3
# ============================================================================
# FastAPI 서버 설정 (결과 파일 전송용)
# FastAPI 서버 기본 URL
# - 크롤링 결과를 전송할 서버 주소
# - 로컬 테스트: "http://127.0.0.1", "localhost"
# - 서버 배포: AWS EC2 등의 실제 서버 주소
FASTAPI_BASE_URL = "localhost"
# FastAPI 서버 포트
FASTAPI_PORT = "8000"
# 파일 업로드 엔드포인트 경로
FASTAPI_PATH = "/send/file"
# ============================================================================
# AI 프롬프트
# 공지사항 본문에서 신청 기간을 추출하는 프롬프트
# - 시작일/종료일을 JSON 형식으로 반환
PROMPT = """
너는 주어진 본문에서 신청 기간의 시작일과 종료일을 추출하여 JSON 형식으로 반환하는 AI야.
# 규칙
- 본문 내용을 분석해서 신청 기간을 찾아.
- 결과는 반드시 지정된 JSON 형식으로만 응답해야 해. 다른 설명은 절대 추가하지 마.
- 응답 시 ```json, ``` 등 마크다운 문법은 절대 사용하지 마.
# 응답 형식 (JSON)
- 날짜는 항상 "YYYY-MM-DD" 형식으로 작성해줘.
- 기간을 찾을 수 없으면 "has_period"는 false, 날짜는 모두 null로 처리해.
- 기간을 찾았다면 "has_period"는 true로 하고, "end_date"는 반드시 값이 있어야 해. "start_date"는 없으면 null로 처리해.
{{
"has_period": boolean,
"start_date": "YYYY-MM-DD" or null,
"end_date": "YYYY-MM-DD" or null
}}
# 예시
1. 본문: "모집 기간은 9월 16일부터 10월 5일까지입니다."
JSON: {{"has_period": true, "start_date": "2025-09-16", "end_date": "2025-10-05"}}
2. 본문: "접수 마감은 2025년 9월 30일 18:00까지입니다."
JSON: {{"has_period": true, "start_date": null, "end_date": "2025-09-30"}}
3. 본문: "본 채용은 상시 모집으로 진행됩니다."
JSON: {{"has_period": false, "start_date": null, "end_date": null}}
# 본문
{content}
"""