본문 바로가기

Development

대학교 채용공지 크롤링 서비스 개발

평소에 취업에 걱정이 많아 잡코리아, 사람인과 같은 취업 지원 서비스들도 찾아보지만, 대학교 학과 홈페이지에 정보들도 많이 찾아본다. 

숭실대 컴퓨터학부 취업정보

처음에는 재학중인 학교의 학과 게시판만 확인했었는데, 나중에 일하고 싶은 분야와 관련된 채용 정보는 많이 안올라오고 정보의 한계가 있어서 자연스레 다른 학교 게시판도 확인하게 되었다. 이를 한 번에 확인하고 싶어서 간단하게 몇 개의 대학교 취업 정보 게시판의 정보를 크롤링해서 정리하는 페이지를 만들기로 했다.

개발은 기본적으로 Python을 이용하여, 크롤링은 BeautifulSouop 모듈을 이용했고 웹은 Flask로 서버를 돌렸다. 데이터를 파싱할 대학교 홈페이지는 다음과 같이 했다.

  • 숭실대학교 컴퓨터학부 (cse.ssu.ac.kr)
  • 서울대학교 컴퓨터공학부 (cse.snu.ac.kr)
  • 중앙대학교 소프트웨어학부 (cse.cau.ac.kr)
  • 포항공과대학교 컴퓨터공학과 (cse.postech.ac.kr)
  • 아주대학교 사이버보안학과 (security.ajou.ac.kr)
  • 고려대학교 사이버국방학과 (scs.korea.ac.kr)

크롤링 자체는 어처피 모듈을 이용하기 때문에 간단했지만, 여러 대학교 페이지의 정보를 가져오기 때문에 한 번에 모든 데이터를 가져오지 못하고 학교 별로 처리하는 함수를 구현했다. 

from bs4 import BeautifulSoup
import requests

url_info = {"ssu":"http://cse.ssu.ac.kr/05_sub/05_sub.htm", \
			"snu":"https://cse.snu.ac.kr/department-notices?c%5B%5D=107&keys=", \
			"cau":"https://cse.cau.ac.kr/sub05/sub0502.php", \
			"postech":"https://cse.postech.ac.kr/community/careers/", \
			"ajou":"http://security.ajou.ac.kr/security/board/board06.jsp", \
			"korea":"https://scs.korea.ac.kr/ime/commu/new_page.do?mode=list&&articleLimit=30&article.offset=0"}

test_data = {'snu_str': ['★ 컴퓨터공학부로 접수되는 채용정보 게시에 대한 안내', 'CJ올리브네트웍스 채용 공고 ', '2021년 제1차 서울문화재단 직원 공개채용', '2021 상반기 ASML Korea 채용', '뉴파워프라즈마 공개채용', '[한온시스템] 2021년 채용연계형 인턴 모집 (~3/22)', '엘리스 코딩 튜터 모집 공고', '[신세계아이앤씨] 2021 상반기 신입사원 모집_공고', '[판이스포] 실리콘벨리 스 타트업 공동창업팀 모집', '[유진투자증권] 대학생 조기채용 전형 안내', '액션파워 연구개발팀 채용 (병역특례 가능)', '2021년 제1차 서울문화재단 직원 공개채용(~03/22)', '[WaveBridge] Quant Developer 채용', '㈜로보티즈 SLAM & Navigation Engineer 외 채용 공고', '㈜데이터뱅크 개발자 채용', '[WorldQuant] 2021년 Quantitative Researcher 상시채용', '2021년도 케이알투자 증권 대졸 신입공채', '[바텍] 의료플랫폼 개발크루 모집(~03/14)', '[라이드플럭스] 자율주행 SW 개발 스타트업 엔지니어 모집', '2021년 상반기 LIG넥스원 신입/경력 공개채용'], 'cau_str': ['\n\t\t\t유디에스㈜ 채용 안내\xa0NEW ', '\n\t\t\t[신청마감 3/18]삼성전자 메모리사업부 폰서트(채용상담 프..\xa0NEW ', '\n\t\t\t[한국정보보호산업협회] 2021년도 서울시 채용연계형 교 육..\xa0NEW ', '\n\t\t\tCJ올리브네트웍스 채용 안내\xa0NEW ', '\n\t\t\t[선데이토즈] 정규직 전환형 서버 인턴십 안내\xa0NEW ', '\n\t\t\t[삼성SDI] 2021년 상반기 신입사원/대학생 인턴 채용 안내\xa0NEW ', '\n\t\t\t[삼성전기] 2021년 상반기 신입사원/인턴 채용 안내\xa0NEW ', '\n\t\t\t(한국정보산업연합회) 21년 하반기 ICT학점연계프로젝트인..\t\t\t\t\t\t\t\t', '\n\t\t\t(주)오너클랜 구인 안내\t\t\t\t\t\t\t\t', '\n\t\t\t[삼성에스원] 2021 상반기 3급 신입사원 채용 안내\t\t\t\t\t\t\t\t'], 'postech_str': ['[한국정보보호산업협회] 2021년도 서울시 채용연계형 ..', '[한국산업은행] 2021년 하반기 신입행원(5급) 채용', '[KIRD] 2021년도 국가R&D 리얼챌린지 프로그램 참여 연..', '[삼성전기] 2021년 상반기 신입사원/인턴 채용 진행 홍..', '[KAI] 신입/경력 채용 온라인 채용상담 안내', '[삼성전자 CE/IM부문] 2021년 상반기 공채/인턴십 직무상..', '[한국SW산업협회]2021 SW스타트업 창업챌린지 공모전', '[삼성SDS] ’21년 상반기 온라인 리크루팅 안내', '병역특례 산업기능요원(현역) 모집', '[현대삼호중공업] 2021년도 상반기 대졸신입 공개채용'], 'ajou_str': ['\n\t\t\t\t\t[DISE] 채용 공고 \n      ', '\n\t\t\t\t\t[포 항공과대학교] 정규직 채용 안내\n      ', '\n\t\t\t\t\t[삼성] 2021학년도 상반기 삼성 기회균등 특별채용 안내\n      ', '\n\t\t\t\t\t[국가정보원] 2021년도 채용연계형 인턴 채용\n      ', '\n\t\t\t\t\t[Cisco] 인턴 채용 안내\n      ', '\n\t\t\t\t\t[윈스] 2021 공채 모집(~1/21)\n      ', '\n\t\t\t\t\t[현대자동차] 경영지원본부 채용전환형 인턴 채용\n      ', '\n\t\t\t\t\t쎄믹스 SW개발자 신입사원 채용 안내\n      ', '\n\t\t\t\t\t솔트룩스 SW개발자 신입사원 채용 안내\n      ', '\n\t\t\t\t\t디아이티 SW개발자 신입사원 채용 안내\n      '], 'korea_str': ['[홍보] 한국정보보호산업협회 대학생 기자단 모집', '[홍보] 한국정보보호산업협회 디지털뉴딜 정보보안 실무자 양성 과정 모집', "[채용공고] '법무법인(유한) 태평양' 디지털포렌식 경력직 채용 (~2.17)", '[채용공고] 현대자동차 개인정보보호 관리체계 수립 및 운영 채용전환형 인턴 모집', '[홍보] 2021 소프트웨어 산업 전망 컨퍼런스', '[채용공고] 현대자동차 개인정보보호 관리체계 운영자 모집 홍보', '[홍보] 한국정보보호산업협회 2020년 하반기 정보보호취업박람회 홍보', '[채용공고] SK 인포섹 디지털핵심 실무인재 채용연계 교육생 모집 홍보 (클라우드 정보 보호 분야)', '[채용공고] Alvarez & Marsal 한국지사 인턴 모집 홍보', '[금융보안원] 2021년도 신입직원 채용', "[채용공고]  기아자동차 'ICT 부문' 신입 채용", "[채용공고] 기아자동차 '프라이버시 엔지니어' 신입 채용", '[채용공고] 가천대학교 IT융합대학 AI·소프트웨어학부 교원 초빙(09.25, 13:00까지)', '[채용공고] LG CNS 2020년 하반기 신입사원 채용 홍보', '[채용공고] 2020년 정보통신기획평가원(IITP) 하반기 공개채용 (~10.6(화))', '[홍보] 한국정보보호산업협회 정보보호산업 맞춤형 인재 양성 과정 홍보', '[채용공고] 성신여자대학교 융합보안공학과 교수채용', '[채용공고] 세메스 보안전문가 체용 공고', '[채용공고] 한국사회보장정보원 직원 채용공고', '[채용공고] 김.장 법률사무소 직원채용 안내', '[채용공고] 도로교통공단 2020년도 NCS기 반 신규직원 공개채용 공고', '[홍보] 한국정보보호산업협회 정보보호산업 맞춤형 인재 양성 과정 안내', '[채용공고] 포스코인 터내셔널 2020년 채용전환형 실무수습사원 모집', '[채용공고] 한국화학연구원 2020년 하반기 인턴 및 2차 박사후연구원 선발 공고', '[채용공고] 한국교육학술정보원 2020년 상반기 정규직 직원 채용 안내', '[채용공고] 2020년 KB증권 채용연계형 인턴 공채 안내', '[채용공고] (주)시큐레터 신입/경력 직원 채용 공고', '[채용공고] 안진회계법인 위험관리본부 정보보호 전문가 모집  안내', '[홍보] SK인포섹 "2020년 4차 산업혁명 선도인력 양성사업" 교육생 모집', '[채용공고] 2020년도 (사)한국음악저작권협 회 신입직원 및 연구용역 계약직 공개 채용'], 'snu_url': ['https://cse.snu.ac.kr/node/11787', 'https://cse.snu.ac.kr/node/48856', 'https://cse.snu.ac.kr/node/48854', 'https://cse.snu.ac.kr/node/48844', 'https://cse.snu.ac.kr/node/48666', 'https://cse.snu.ac.kr/node/48664', 'https://cse.snu.ac.kr/node/48663', 'https://cse.snu.ac.kr/node/48659', 'https://cse.snu.ac.kr/node/48635', 'https://cse.snu.ac.kr/node/48634', 'https://cse.snu.ac.kr/node/48633', 'https://cse.snu.ac.kr/node/48632', 'https://cse.snu.ac.kr/node/48458', 'https://cse.snu.ac.kr/node/48457', 'https://cse.snu.ac.kr/node/48454', 'https://cse.snu.ac.kr/node/48452', 'https://cse.snu.ac.kr/node/48448', 'https://cse.snu.ac.kr/node/48447', 'https://cse.snu.ac.kr/node/48446', 'https://cse.snu.ac.kr/node/48445'], 'cau_url': ['https://cse.cau.ac.kr/sub05/sub0502.php?nmode=view&code=oktomato_bbs07&uid=2286&search=&keyword=&temp1=&offset=1', 'https://cse.cau.ac.kr/sub05/sub0502.php?nmode=view&code=oktomato_bbs07&uid=2285&search=&keyword=&temp1=&offset=1', 'https://cse.cau.ac.kr/sub05/sub0502.php?nmode=view&code=oktomato_bbs07&uid=2284&search=&keyword=&temp1=&offset=1', 'https://cse.cau.ac.kr/sub05/sub0502.php?nmode=view&code=oktomato_bbs07&uid=2283&search=&keyword=&temp1=&offset=1', 'https://cse.cau.ac.kr/sub05/sub0502.php?nmode=view&code=oktomato_bbs07&uid=2282&search=&keyword=&temp1=&offset=1', 'https://cse.cau.ac.kr/sub05/sub0502.php?nmode=view&code=oktomato_bbs07&uid=2281&search=&keyword=&temp1=&offset=1', 'https://cse.cau.ac.kr/sub05/sub0502.php?nmode=view&code=oktomato_bbs07&uid=2280&search=&keyword=&temp1=&offset=1', 'https://cse.cau.ac.kr/sub05/sub0502.php?nmode=view&code=oktomato_bbs07&uid=2279&search=&keyword=&temp1=&offset=1', 'https://cse.cau.ac.kr/sub05/sub0502.php?nmode=view&code=oktomato_bbs07&uid=2278&search=&keyword=&temp1=&offset=1', 'https://cse.cau.ac.kr/sub05/sub0502.php?nmode=view&code=oktomato_bbs07&uid=2277&search=&keyword=&temp1=&offset=1'], 'postech_url': ['https://cse.postech.ac.kr/%ed%95%9c%ea%b5%ad%ec%a0%95%eb%b3%b4%eb%b3%b4%ed%98%b8%ec%82%b0%ec%97%85%ed%98%91%ed%9a%8c-2021%eb%85%84%eb%8f%84-%ec%84%9c%ec%9a%b8%ec%8b%9c-%ec%b1%84%ec%9a%a9%ec%97%b0%ea%b3%84%ed%98%95-%ea%b5%90/?pageds=1&p_id=115&e=&k=&c=&cat=', 'https://cse.postech.ac.kr/%ed%95%9c%ea%b5%ad%ec%82%b0%ec%97%85%ec%9d%80%ed%96%89-2021%eb%85%84-%ed%95%98%eb%b0%98%ea%b8%b0-%ec%8b%a0%ec%9e%85%ed%96%89%ec%9b%905%ea%b8%89-%ec%b1%84%ec%9a%a9/?pageds=1&p_id=115&e=&k=&c=&cat=', 'https://cse.postech.ac.kr/kird-2021%eb%85%84%eb%8f%84-%ea%b5%ad%ea%b0%80rd-%eb%a6%ac%ec%96%bc%ec%b1%8c%eb%a6%b0%ec%a7%80-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%a8-%ec%b0%b8%ec%97%ac-%ec%97%b0%ea%b5%ac%ed%8c%80-%eb%aa%a8%ec%a7%91/?pageds=1&p_id=115&e=&k=&c=&cat=', 'https://cse.postech.ac.kr/%ec%82%bc%ec%84%b1%ec%a0%84%ea%b8%b0-2021%eb%85%84-%ec%83%81%eb%b0%98%ea%b8%b0-%ec%8b%a0%ec%9e%85%ec%82%ac%ec%9b%90-%ec%9d%b8%ed%84%b4-%ec%b1%84%ec%9a%a9-%ec%a7%84%ed%96%89-%ed%99%8d%eb%b3%b4/?pageds=1&p_id=115&e=&k=&c=&cat=', 'https://cse.postech.ac.kr/kai-%ec%8b%a0%ec%9e%85-%ea%b2%bd%eb%a0%a5-%ec%b1%84%ec%9a%a9-%ec%98%a8%eb%9d%bc%ec%9d%b8-%ec%b1%84%ec%9a%a9%ec%83%81%eb%8b%b4-%ec%95%88%eb%82%b4/?pageds=1&p_id=115&e=&k=&c=&cat=', 'https://cse.postech.ac.kr/%ec%82%bc%ec%84%b1%ec%a0%84%ec%9e%90-ce-im%eb%b6%80%eb%ac%b8-2021%eb%85%84-%ec%83%81%eb%b0%98%ea%b8%b0-%ec%8b%a0%ec%9e%85%ec%82%ac%ec%9b%90-%ea%b3%b5%ec%b1%84-%eb%b0%8f-%ec%9d%b8%ed%84%b4-%eb%aa%a8/?pageds=1&p_id=115&e=&k=&c=&cat=', 'https://cse.postech.ac.kr/%ed%95%9c%ea%b5%adsw%ec%82%b0%ec%97%85%ed%98%91%ed%9a%8c2021-sw%ec%8a%a4%ed%83%80%ed%8a%b8%ec%97%85-%ec%b0%bd%ec%97%85%ec%b1%8c%eb%a6%b0%ec%a7%80-%ea%b3%b5%eb%aa%a8%ec%a0%84/?pageds=1&p_id=115&e=&k=&c=&cat=', 'https://cse.postech.ac.kr/%ec%82%bc%ec%84%b1sds-21%eb%85%84-%ec%83%81%eb%b0%98%ea%b8%b0-%ec%98%a8%eb%9d%bc%ec%9d%b8-%eb%a6%ac%ed%81%ac%eb%a3%a8%ed%8c%85-%ec%95%88%eb%82%b4/?pageds=1&p_id=115&e=&k=&c=&cat=', 'https://cse.postech.ac.kr/%eb%b3%91%ec%97%ad%ed%8a%b9%eb%a1%80-%ec%82%b0%ec%97%85%ea%b8%b0%eb%8a%a5%ec%9a%94%ec%9b%90%ed%98%84%ec%97%ad-%eb%aa%a8%ec%a7%91/?pageds=1&p_id=115&e=&k=&c=&cat=', 'https://cse.postech.ac.kr/%ed%98%84%eb%8c%80%ec%82%bc%ed%98%b8%ec%a4%91%ea%b3%b5%ec%97%85-2021%eb%85%84%eb%8f%84-%ec%83%81%eb%b0%98%ea%b8%b0-%eb%8c%80%ec%a1%b8%ec%8b%a0%ec%9e%85-%ea%b3%b5%ea%b0%9c%ec%b1%84%ec%9a%a9/?pageds=1&p_id=115&e=&k=&c=&cat='], 'ajou_url': ['http://security.ajou.ac.kr/security/board/board06.jsp?mode=view&article_no=220863&board_wrapper=%2Fsecurity%2Fboard%2Fboard06.jsp&pager.offset=0&board_no=1640', 'http://security.ajou.ac.kr/security/board/board06.jsp?mode=view&article_no=220862&board_wrapper=%2Fsecurity%2Fboard%2Fboard06.jsp&pager.offset=0&board_no=1640', 'http://security.ajou.ac.kr/security/board/board06.jsp?mode=view&article_no=220680&board_wrapper=%2Fsecurity%2Fboard%2Fboard06.jsp&pager.offset=0&board_no=1640', 'http://security.ajou.ac.kr/security/board/board06.jsp?mode=view&article_no=220502&board_wrapper=%2Fsecurity%2Fboard%2Fboard06.jsp&pager.offset=0&board_no=1640', 'http://security.ajou.ac.kr/security/board/board06.jsp?mode=view&article_no=220389&board_wrapper=%2Fsecurity%2Fboard%2Fboard06.jsp&pager.offset=0&board_no=1640', 'http://security.ajou.ac.kr/security/board/board06.jsp?mode=view&article_no=219501&board_wrapper=%2Fsecurity%2Fboard%2Fboard06.jsp&pager.offset=0&board_no=1640', 'http://security.ajou.ac.kr/security/board/board06.jsp?mode=view&article_no=219428&board_wrapper=%2Fsecurity%2Fboard%2Fboard06.jsp&pager.offset=0&board_no=1640', 'http://security.ajou.ac.kr/security/board/board06.jsp?mode=view&article_no=219253&board_wrapper=%2Fsecurity%2Fboard%2Fboard06.jsp&pager.offset=0&board_no=1640', 'http://security.ajou.ac.kr/security/board/board06.jsp?mode=view&article_no=219252&board_wrapper=%2Fsecurity%2Fboard%2Fboard06.jsp&pager.offset=0&board_no=1640', 'http://security.ajou.ac.kr/security/board/board06.jsp?mode=view&article_no=219250&board_wrapper=%2Fsecurity%2Fboard%2Fboard06.jsp&pager.offset=0&board_no=1640'], 'korea_url': ['https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=257762&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=257761&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=257247&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=255488&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=252401&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=251482&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=251170&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=251089&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=250807&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=246904&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=245932&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=245465&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=223558&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=218653&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=218462&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=212866&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=209292&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=174957&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=162146&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=161104&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=159930&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=159027&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=158488&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=158356&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=156909&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=156735&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=156529&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=156476&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=155982&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo=', 'https://scs.korea.ac.kr/ime/commu/new_page.do??mode=view&articleNo=154954&article.offset=0&articleLimit=30&totalNoticeYn=N&totalBoardNo='], 'snu_len': 20, 'cau_len': 10, 'postech_len': 10, 'ajou_len': 10, 'korea_len': 30}

def req2srv(name):
	res = requests.get(url_info[name])
	return res

def getSsuInfo():
	data = []
	soup = BeautifulSoup(req2srv('ssu').text, 'html.parser')
	print(soup)
	print(soup.select('#board > div > div.bbs_list > form:nth-child(1) > table > tbody > tr:nth-child(14) > td:nth-child(2) > a'))
	#갑자기 서버 안됨

def getSnuInfo():
	soup = BeautifulSoup(req2srv('snu').text, 'html.parser')
	datas = soup.findAll('td', class_='views-field views-field-title')
	data_str = []
	data_url = []
	for data in datas:
		data_str.append(data.find("a").text)
		data_url.append("https://cse.snu.ac.kr"+data.find("a").attrs['href'])
	return data_str, data_url

def getCauInfo():
	soup = BeautifulSoup(req2srv('cau').content.decode('utf-8', 'replace'), 'html.parser')
	datas = soup.findAll('td', class_='aleft')
	data_str = []
	data_url = []
	for data in datas:
		data_str.append(data.find("a").text)
		data_url.append(url_info['cau']+data.find("a").attrs['href'])
	return data_str, data_url

def getPostechInfo():
	soup = BeautifulSoup(req2srv('postech').text, 'html.parser')
	datas = soup.findAll('td', class_='step2')
	data_str = []
	data_url = []
	for data in datas:
		data_str.append(data.find("a").text)
		data_url.append(data.find("a").attrs['href'])
	return data_str, data_url

def getAjouInfo():
	soup = BeautifulSoup(req2srv('ajou').text, 'html.parser')
	datas = soup.findAll('td', class_='td title_comm')
	data_str = []
	data_url = []
	for data in datas:
		data_str.append(data.find("a").text)
		data_url.append(url_info['ajou']+data.find("a").attrs['href'])
	return data_str, data_url

def getKoreaInfo():
	soup = BeautifulSoup(req2srv('korea').text, 'html.parser')
	datas = soup.findAll('a', class_='article-title')
	data_str = []
	data_url = []
	for data in datas:
		data_str.append(data.text)
		data_url.append("https://scs.korea.ac.kr/ime/commu/new_page.do?"+data.attrs['href'])
	return data_str, data_url

 

코드에서 test_data는 웹페이지에서 크롤링한 데이터를 출력할 때 사용한 테스트 데이터다. data_str 변수에는 게시판의 제목을 가져오고, data_url 변수에는 해당 게시판 링크를 가져와서 저장했다. 링크의 경우, 각 대학교 도메인이 포함된 경우도 있고 아닌 경우도 있어서 이를 감안하여 개발했다.

def mergeData():
	snu = getSnuInfo()
	cau = getCauInfo()
	postec = getPostechInfo()
	ajou = getAjouInfo()
	korea = getKoreaInfo()

	res = {}
	res['snu_str'] = snu[0]
	res['cau_str'] = cau[0]
	res['postech_str'] = postec[0]
	res['ajou_str'] = ajou[0]
	res['korea_str'] = korea[0]

	res['snu_url'] = snu[1]
	res['cau_url'] = cau[1]
	res['postech_url'] = postec[1]
	res['ajou_url'] = ajou[1]
	res['korea_url'] = korea[1]

	res['snu_len'] = len(snu[0])
	res['cau_len'] = len(cau[0])
	res['postech_len'] = len(postec[0])
	res['ajou_len'] = len(ajou[0])
	res['korea_len'] = len(korea[0])

	return res

mergeData 함수는 getSsuInfo, getSnuInfo 함수 등을 통해서 크롤링한 데이터를 res라고 하는 변수에 저장해서 리턴해주는 함수다. 이 데이터를 가지고 Flask를 통해 웹에서 볼 수 있게 개발했다. 간단한 css를 이용했다.

앞으로 더 추가하고 싶은 기능은, 페이지에 접속할 때마다 크롤링을 통해 가져오는 것이 아닌, 데이터를 사전에 DB에 저장해놓고 그 데이터만 가져왔다가, 사용자가 크롤링을 원하면 그 때 다시 데이터를 가져와서 DB를 최신화하는 작업을 할 예정이다.

'Development' 카테고리의 다른 글

[프로그래머스] 기능개발  (0) 2021.05.16
[Java] 계산기 프로그램  (0) 2021.05.04
"버스 vs 지하철" 개발일지 - 1  (0) 2021.01.19
BOJ 11650 (좌표 정렬하기)  (0) 2021.01.16
BOJ 1018 (체스판 다시 칠하기)  (0) 2021.01.14