Projects

[회고] 봉사 활동 기간에 크롤링으로 업무 자동화를 구현해본 일

root_bridger 2022. 12. 9. 18:40

https://github.com/Kyung-Deok/crawling_valenteer.git

 

GitHub - Kyung-Deok/crawling_valenteer: 봉사활동 중 크롤링을 활용한 업무자동화 기여

봉사활동 중 크롤링을 활용한 업무자동화 기여. Contribute to Kyung-Deok/crawling_valenteer development by creating an account on GitHub.

github.com

봉사활동 중 해당 작업 기간  : 12.05 ~ 12.08 

Python 버전 : 3.10.9

사용 라이브러리 : Selenium, BeautifulSoup4, Pandas, Openpyxl, Webdriver_manger, Pyinstaller

 

봉사활동을 하게 된 것은 졸업 점수를 채우기 위해서 였다. 사실 봉사활동을 시작하기 전엔 귀찮은 느낌도 있었지만,지금은성취감을 느낄 수 있어 하길 잘했다라는 생각을 하고 있다.

 

하게 된 이유

 

봉사활동을 가니 처음으로 나한테 주어진 업무는 엑셀 문서화 였다. 사람인에 보건 관련 특정 직무를 검색해서 회사의 채용공고를 확인 해보고 채용공고의 담당자(혹은 담당 부서)와 연락처를 확인 하는 일이였다. 담당자 분께서 말씀하시길, 이 직무에 대한 채용공고를 올린다는 뜻은 산업 보건 관련 부서나 담당자를 운영하고 있다는 뜻이니 캠페인 동참 기업 선발에 사용할 업무용 기업 명단을 작성하려고 하신다는 것이였다. 그리고 나 이전에는 보건계열 학과 대학생들이 와서 자원봉사를 하고 갔다는 것이다.

 

처음 엑셀을 인계 받았을 때는 20여개 정도의 기업 정보가 기입되어 있었고, 이는 짐을 옮기거나 하는 다른 업무 지원 등을 한 이후 여유가 있을 때 엑셀작업을 부탁하고 있다는 말을 들었다. 그 말을 듣자마자, 아니 업무설명을 들으면서 생각을 했다.

 

'크롤링 코드 하나면 효율이 배가 될 거 같다.'

이건 완성 한 후의 코드의 일부.해당 코드에서 알 수 있듯 담당자 연락처를 수집해야 했다.

바로 담당자 분께 말씀을 드리고 2일 정도 시간이 필요하다고 말씀드렸다. 봉사활동 시간에 우선적으로 다른 업무가 있다면 먼저 하고, 남는 시간과 개인 시간에 만들어 보이겠다고 말씀드리면서 업무 효율성을 강조드렸다. 그리고 계획을 설명드리니 놀라시며 그런게 가능하다면 좋을 것 같다며 긍정적으로 허락해주셨다. 이때까지만 해도 내 몸이 편하고자 시작한 일이였다. 똑같은 작업을 하면서 시간을 죽이는게 싫어서.

 

담당자 분께서도 허락하셨고, 엑셀 폼도 확인했다. 이제 남은 일은

1. 사람인에서 채용공고를 크롤링해도 될까?를 알아보는 일

2. 프로그래밍을 모르는 사람들이 어떻게 파이썬 크롤링 코드를 활용하게 할 수 있을까?

 

이에 대한 답은 다음과 같다.

1. 사람인의 robots.txt를 찾아봤다. 각 사이트의 robots.txt를 보면 어떤 부분을 크롤링하면 되는지, 혹은 안되는지 명시해놨다. 이를 통해 해당 사이트의 정보를 크롤링 하는 행위가 불법적인 행위인지 사전에 알수 있다. 

saramin.co.kr/robots.txt

해당 캡쳐를보면 채용공고를 봇을 활용해 크롤링하는 것은 허용해 놓은 것을 확인 할 수 있었다. 이제 마음 놓고 코드를 짜면 된다.

 

 

2. 앞서 말했듯 사용할 사람이 프로그래밍에 대해 잘 모를 것이라 판단했다.(기관 담당직원분이나 앞으로 올 자원봉사자 분들을 생각해 봤을 때) 그렇기 때문에 파이썬 스크립트로 전달을 하는 것은 좀 불안했다. 이유는 파이썬 설치하고 내 개발환경과 같은 환경으로 세팅하는 것은 번거롭게 느껴졌다. 그리고 스크립트를 열어 혹시나 자판을 잘못 입력하게 되면 오타로 실행할 수 없을 것 같았다. 안전하게 편하게 클릭하면 사용할 수 있도록 해야 했다.

그래서 나는 이걸 실행파일(exe)로 패키징해서 전달하기로 했다. 과거 학원에서 pygame을 만든 경험을 살려 pyinstaller를 설치 후 작업하기로 했다.

 

 

예상치 못한 오류들

 

작업 중간에 생각보다 많은 시간을 잡아먹었던 부분을 써보고자 한다. 이번엔 생각보다 애를 먹었으나, 다음부턴 이글을 다시보며 실수를 줄일 수 있을 것이다.

 

1. NoSuchElementException? 이거 왜 자꾸 뜨는거야..

당연히 돌아야 되는 코드들이 자꾸 요소를 찾을 수 없다며 에러가 났다. 이는 명시해 놓은 요소를 찾을 수 없어서 발생하는 에러인데, 테스트를 위해 채용공고 페이지 하나를 켜놓고 확인해가면서 작업했기 때문에 더 당황스러웠다. 오타는 아닌지, 하위 요소가 맞는지 계속 확인해가면서 작업했는데 이유는 다른데 있었다. A 공고에는 해당 Elements 들이 있었지만 B 공고에는 없던 것. 즉, 채용 공고마다 폼이 일정하지 않았다. 

당연할 수 있는 말이지만, 담당자들 정보나 연락처 등 기업 정보를 하나하나 전부 기입해 놓는 것은 의무가 아니다. 그렇기에 기입하지 않으면 화면에도 뜨지 않는다. 이를 이해하고 나니 좀 더 당황스러웠다. 연락처가 있지만 이메일이 없는 경우, 둘다 없는 경우, 연락처가 없고 이메일만 있는 경우 등등...다양한 타입의 채용공고를 확인하니 획일화 된 폼을 처리하는 코드를 짤 수 없었다.

고민 끝에 try / except 문을 사용해서 수정하기로 했다. 언제 한번 "except로 자주 빠지게 되면 코드의 실행 성능이 떨어진다"라는 말을 봤지만, 해당 에러가 날 때 실행을 하도록 해야 했다. if else로는 한계가 있다고 판단되었다.

특히 기업 주소 같은 경우는 1번째 박스 안에 명시 되어 있지 않으면 2번째 박스에서 찾아보고 없으면 없음으로 명시 하는 식으로 코드를 짰다. 이로서 정상적으로 돌아갔고 한시름 놓을 수 있었다.

 

2. 이메일을 찾기 위해..

기업 담당자의 이메일은 보통 채용공고의 상세 내용 부분에 적어놓는 경우가 많은 것을 확인했다. 그리고 채용공고는 형태가 전부 제각각이였다. 또한 iframe으로 가둬놨다. 그래서 단순히 하위 태그를 찾아서 들어가면 없다고 떴다. 고민 끝에 채용 상세 내용을 전부 텍스트로 변환해 정규표현식을 사용해 이메일 문자열을 찾아야 겠다고 생각했다.

이 부분에서 담당자의 정보를 알수 있는데, 연락처를 써놓기도, 이메일만 써놓기도, 혹은 둘다 없기도 한다. 여기 없다면 채용공고 상세 내용 부분에서 확인해야 한다.

iframe 태그의 위치를 id로 찾아 낸 다음, selenium의 driver.switch_to.frame()을 활용해 iframe으로 selenium의 포인터를 옮긴다. 이후 이를 bs4의 html.parser를 활용해서 필요한 요소들이 있는 부분의 텍스트를 변수에 담아 놓는다. 이후엔 regex를 사용하면 된다.

findall은 리스트를 반환하기 때문에 만약 값이 없다면 빈리스트를 반환할 것이다. 중간 중간 오류를 처리하지 않고 없다면 없는대로 엑셀에 기입하면 되었기 때문에 편할 것이라 생각해 해당 메서드를 사용했다. 이렇게 해서 전부 완성했다.

 

 

느낀점

 

단순하게 시작한 봉사활동을 통해 성취감을 느꼈다. 내가 배웠던 것을 실생활에 활용해 볼 수 있었고, 이로 인해 누군가를 도울 수 있었다. 직원분들은 나에게 관심을 보여주셨고 내가 어려운 것을 해주고 있는 것이 아닌지 걱정해 주셨다. 마음으로 신경을 써주셔서 정말 감사했다. 좋은 사람들에게 도움이 될 수 있어서 성취감이 더 크게 느껴졌다.

 

물론 처음 만들어 드렸을 땐 봉사기관 직원 분들도 생소해 했고, 조심스러워 했다. 기존에 해오던 방법이 아니라 프로그램으로 자동화 시키는 것이 어색하다고 하셨다. 한가지 느꼈던 것은 기존의 방법을 변화시키는 것은 누구에겐 부담스럽게 생각될 수도 있다는 것이다. 그 방법이 이미 체득 되었기 때문에 아무리 효율성이 올라갔다고 해도, 사용을 하는 사람들은 그렇게 느끼지 않을 수 있다. 오히려 변화에 적응을 해야 하는 수고가 수반된다. 이러한 생각은 앞으로 있을 협업에 있어 우리 팀의 의사결정과정을 유하게 만들어 줄 수 있지 않을까.

 

++ 글을 쓰던 도중 담당자 분께 연락이 왔다. 오류가 나면 연락을 주시겠다고 해서 오류가 난 것인가 걱정했는데, 돌아가는데 이상 없다고 1시간만에 120개나 수집할 수 있었다며 감사하다며 연락을 주셨다. 내색은 안했지만 속으로는 날아갈 듯 기뻤다. 실생활을 이롭게 하기 위해 만들어 감사 인사를 받은 경험은 앞으로 내가 더 공부할 때 더 큰 동기부여가 될 것 같다.