공모전 & 대외활동 자동 크롤링 프로젝트 : 1편 - 파이썬으로 캠퍼스픽 크롤러 만들기

캠퍼스픽 (https://www.campuspick.com/) 사이트에서 공모전 및 대외활동 정보를 파이썬을 사용하여 크롤링하고 엑셀 파일로 저장하는 방법을 알아봅니다. 이번 포스트는 3개의 시리즈로 나뉘어져 있습니다.

0. 개요

해시스크래퍼 개발노트를 읽으시는 분들 중 공모전이나/대외활동 등을 알아보는 취준생, 대학생 여러분들이 많을 것으로 예상되어, 보다 실용적인 크롤링 기술을 전해드리기 위해서 파이썬으로 공모전/대외활동 사이트인 캠퍼스픽 (https://www.campuspick.com/) 크롤러를 만들어 보도록 하겠습니다. 프로젝트는 3개의 시리즈로 나뉘어 작성될 예정입니다.
  1. 캠퍼스픽 크롤러 만들기
  1. Crontab을 이용해서 크롤러 실행주기설정해서 실행하기
  1. 파이썬과 Gmail을 이용한 크롤링한 데이터 메일로 보내기
이번 게시물은 첫번째에 해당하는 캠퍼스픽 크롤러 만들기 입니다.
  • 포스팅은 기본적인 파이썬 설치등에 대해서 안내하지 않습니다.
 
 

1. Openpyxl 설치하기

1.1. 라이브러리 설치

먼저 파이썬 크롤링에 사용되는 라이브러리인 Selenium과 엑셀을 다루기위한 Openpyxl 을 설치해줘야 합니다. 터미널 창에 아래 코드로 라이브러리를 설치하시길 바랍니다.
(*pip가 적용이 되지않은 경우 아래의 pip3를 이용하는 코드를 사용하시면 됩니다)
# selenium 설치 pip install selenium # or pip3 install selenium # openpyxl 설치 pip install openpyxl # or pip3 install openpyxl

1.2. 라이브러리 import

이후 Selenium과 time 라이브러리를 import 하는 과정이 필요합니다.
# 크롤러 라이브러리 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys # 엑셀 라이브러리 import openpyxl # 시간 라이브러리 import time
 
 

2. 크롤러 개발하기

2.1. 리스트 구축

크롤링한 데이터들을 모아줄 리스트와 크롤링하고 싶은 페이지의 URL들을 넣어서 URL리스트를 만들어 줍니다.
# 크롤링한 데이터를 모아두는 리스트 earned_content = [] # 캠퍼스픽 공모전 페이지와 대외활동 페이지 URL contest_url = "<https://www.campuspick.com/contest>" activity_url = "<https://www.campuspick.com/activity>" url_list = [contest_url, activity_url]

2.2. 빈 브라우저 창 자동으로 띄우기 설정

아래의 코드를 이용하면 빈 브라우저 창을 띄울 수 있습니다.
# 크롬창을 띄우는 코드 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()
위 코드를 실행하게 되면 크롤링해온 데이터를 earned_content에 저장하게 됩니다.

2.3. 저장 데이터 엑셀 변환

저장된 데이터를 엑셀파일로 만들기 위해서 아래의 코드를 작성합니다.
# 엑셀 워크북 생성 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")
위의 코드는 라이브러리를 통해서 가져온 데이터를 엑셀로 만드는 작업입니다.
 
 

3. 결론

오늘은 캠퍼스픽사이트에서 모집하고있는 공모전/대외활동을 가져와 엑셀로 저장하는 것 까지 진행해보았습니다. 채널을 캠퍼스픽으로 선정했을 뿐, 뉴스 플랫폼이나 정부지원사업 페이지 등 다양한 채널 또한 동일한 원리로 설정하시면 실무진 및 창업자분들께 많은 도움이 될 것 같습니다. 다음 포스팅에서는 오늘 제작한 크롤러를 바탕으로 Crontab을 이용해서 매일 자동으로 수집되게 만드는 과정을 알아보겠습니다.