달러💰 이렇게 비싸져도 되냐?! AWS를 탈출하고 비용절약하자!
AWS를 사용해오다 자체 서버로 전환한 과정과 이유를 공유합니다. 비용 절감, 보안 강화, 물리 서버 운영의 장점, 그리고 다단계 인증(MFA)을 적용한 방법을 소개합니다. B2B 서비스의 특성을 고려한 성공적인 서버 운영 전략을 확인해보세요.
캠퍼스픽 (https://www.campuspick.com/) 사이트에서 공모전 및 대외활동 정보를 파이썬을 사용하여 크롤링하고 엑셀 파일로 저장하는 방법을 알아봅니다. 이번 포스트는 3개의 시리즈로 나뉘어져 있습니다.
# selenium 설치 pip install selenium # or pip3 install selenium # openpyxl 설치 pip install openpyxl # or pip3 install openpyxl
# 크롤러 라이브러리 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys # 엑셀 라이브러리 import openpyxl # 시간 라이브러리 import time
# 크롤링한 데이터를 모아두는 리스트 earned_content = [] # 캠퍼스픽 공모전 페이지와 대외활동 페이지 URL contest_url = "<https://www.campuspick.com/contest>" activity_url = "<https://www.campuspick.com/activity>" url_list = [contest_url, activity_url]
# 크롬창을 띄우는 코드 driver = webdriver.Chrome()
for url in url_list: # url 접속 driver.get(url) # 로딩이 다 되기 위해서 3초 기다려주기 time.sleep(3) # 웹페이지 자체가무한스크롤이므로 리스트에서 첫번째 것만 가져와서, # following-sibling 을 이용해서 다음 리스트 가져옴 lis = driver.find_elements(By.XPATH, '//*[@class="list"]/*[@class="item"]') li = lis[0] if lis else None while li: if li.find_elements(By.XPATH, './/*[@class="dday highlight"]'): # 마감기한을 가져와서 마감된 게시물인지 확인 due_date = li.find_element(By.XPATH, './/*[@class="dday highlight"]').text if "마감" in due_date: print("마감된 게시물은 가져오지 않습니다") else: print("마감기한이 없습니다") break # 시간순서로 가져오기 때문에 마감이면 이후에 게시물도 마감이므로 반복문 종료 # 다음 리스트 아이템으로 스크롤하는 코드 driver.execute_script("arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'});", li) # 키워드 keywords = li.find_elements(By.XPATH, './/*[@class="badges"]/span') keyword_list = [keyword.text for keyword in keywords] keyword_str = ",".join(keyword_list) # 활동명 title = li.find_element(By.XPATH, './/h2').text # 주최 company = li.find_element(By.XPATH, './/*[@class="company"]').text # 조회수 view_count = li.find_element(By.XPATH, './/*[@class="viewcount"]').text # 썸네일 이미지 URL thumbnail_url = li.find_element(By.XPATH, './/figure').get_attribute("data-image") results = [keyword_str, title, company, due_date, view_count, thumbnail_url] print(results) earned_content.append(results) # 다음 리스트 있는지 확인해서 리스트 가져오기 if li.find_elements(By.XPATH, './following-sibling::*[@class="item"]'): print("다음 리스트가 존재합니다") next_li = li.find_element(By.XPATH, './following-sibling::*[@class="item"]') if next_li.find_element(By.XPATH, './/*[@class="dday highlight"]'): due_date = next_li.find_element(By.XPATH, './/*[@class="dday highlight"]').text print(f"마감기한: {due_date}") if "마감" in due_date: print("마감된 게시물은 가져오지 않습니다") print("다음게시물을 가져옵니다") li = next_li else: print("마감기한이 없습니다") break # 시간순서로 가져오기 때문에 마감이면 이후에 게시물도 마감이므로 반복문 종료 else: print("다음 리스트가 존재하지 않습니다. 종료합니다.") break # 크롬 드라이버 종료 driver.quit()
# 엑셀 워크북 생성 wb = openpyxl.Workbook() # 엑셀 시트 생성 ws = wb.active ws.title = "캠퍼스픽 대외활동_공모전 정보" # 컬럼 제목 추가 column_titles = ["키워드", "활동명", "주최", "마감일", "조회수", "썸네일이미지 URL"] ws.append(column_titles) # 데이터를 한줄씩 시트에 쓰기 for row_data in earned_content: ws.append(row_data) # 엑셀 파일 저장 wb.save("campuspick_info_data.xlsx")