주제
GPTs로 뭘 만들까 계속 고민하다가
학교학식에 대한 정보를 알려주는 GPTs를 만들어볼까 한다.
흔한 주제인 학교 학식을 외국인 학생들을 위해 영어로 번역 후 제공하는건데
노션 API와 GPTs를 연결해
학교학식에 대한 정보를 노션을 통한 DB로 사용하는 것이다.
흔한 주제인만큼 GPT를 사용해서 낼 수 있는 차별점이 뭘까 계속해서 생각하는중이다.
크롤링
우선 크롤링하는 코드를 만들었다.
학교 홈페이지에서 이번주의 학식 메뉴를 제공해주는데 이것을 가져와 엑셀파일로 저장되게 해놨다.
그리고나서 이걸 노션 데이터베이스에 저장했다.
구글링한 결과 파이썬 코드에서 크롤링 후 바로 노션에 저장할 수 있는 것 같던데
몇차례 시도 후 실패했다. 추후 다시 시도해볼 생각이다.
import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException, TimeoutException
data = [] # 데이터를 저장할 빈 리스트 생성
chrome_options = Options()
chrome_options.add_argument("--headless") # 창 없는 모드
driver = webdriver.Chrome(service=Service(
ChromeDriverManager().install()), options=chrome_options)
try:
driver.get("https://www.dankook.ac.kr/web/kor/-555")
rows = WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located(
(By.CSS_SELECTOR, "table.type_food tbody tr"))
)
for row in rows:
meals_info_html = row.find_element(
By.CSS_SELECTOR, "td:nth-child(2)").get_attribute('innerHTML')
soup = BeautifulSoup(meals_info_html, 'html.parser')
# 날짜 및 요일 정보 추출
date_info = row.find_element(By.CSS_SELECTOR, "span.name_date").text
day_info = row.find_element(By.CSS_SELECTOR, "span.name_week").text
# 식사 정보 초기화
meal_data = {
"날짜": date_info,
"요일": day_info,
"조식": "",
"중식": "",
"석식": "",
"기타": "", # 고정된 메시지 할당
"BHC치킨": "" # 동적으로 할당될 예정
}
current_meal = ""
for element in soup.contents:
if element.name == "b": # 식사 유형의 시작을 나타냄
current_meal = element.text.strip().split(" ")[
0] # 조식, 중식, 석식, 기타
if "[미운영]" in element.text:
meal_data[current_meal] = "미운영"
elif element.name == "br":
continue
elif "BHC치킨" in element.text: # "BHC치킨" 정보 처리
meal_data["BHC치킨"] = "운영시간: 미운영" # 예시로 "운영시간: 미운영" 할당
continue
else:
# 식사 정보에 따라 적절한 형식으로 데이터 추가
if current_meal and element.strip() != "":
if meal_data[current_meal] != "미운영": # 식사가 "미운영" 상태가 아닐 때만 추가
meal_data[current_meal] += (", " + element.strip()
) if meal_data[current_meal] else element.strip()
# 식사 정보 마지막의 쉼표 제거
for meal in ["조식", "중식", "석식"]:
if meal_data[meal] and meal_data[meal].endswith(", "):
meal_data[meal] = meal_data[meal][:-2]
data.append(meal_data)
except TimeoutException:
print("페이지 로드 시간 초과.")
except NoSuchElementException:
print("요소x")
finally:
driver.quit()
# 판다스 데이터프레임으로 변환
df = pd.DataFrame(data)
# 엑셀 파일로 저장
excel_filename = "test.xlsx"
df.to_excel(excel_filename, index=False)
print(f"{excel_filename} 파일저장성공")
Notion과 GPTs연결
이제 노션과 GPTs를 연결해봤다.유튜브를 보고 따라했다.
https://sasshero.atlassian.net/wiki/external/NzNhOTlkYWU4YzI4NDI2M2E4MTE1YTM0ZjQzMTQ1YTI
코드까지 다 제공해주셔서 쉽게할 수 있었다.
응답예시
근데 진짜 아무리 생각해봐도 이 GPTs를 만들면 굳이 이걸 사용 할 이유가 없다.
그냥 웹 페이지를 사용하고 번역기능을 제공하는게 훨씬 이득일텐데
내 GPTs가 가진 장점이 뭐가 있을까..?
자동화
이게 쓸모 있을지 없을지는 모르겠고
우선 서비스 자체를 만들어 보고싶다.
그러기 위해서 자동화에 대해서 생각해보았다.
우선 파이썬 크롤링을 했을때 노션에 데이터베이스 형태로 바로 저장되게 할 생각이다.
또한 Lambda를 사용해 매주 일요일 밤에 크롤링 코드를 실행 할 계획이다.
근데 기억으로는 셀레니움을 사용한 코드가 람다에서 잘 안돌아가던 것 같은데 확인해봐야겠다리
'IT > Project' 카테고리의 다른 글
KR_Labs 개발기 1편 (0) | 2025.01.01 |
---|---|
[GPTs] GPTs 묘지 (0) | 2024.02.13 |
[가구찾아] 쿠팡 크롤링 로그인하기 (0) | 2024.02.06 |
[가구찾아] GPTs 가구찾아주는 서비스 만들기 - 1 (0) | 2024.02.06 |
[Project] AI MEDICO 최종 (글 수정중) (0) | 2024.02.02 |