본문 바로가기
Portfolio

채용정보 크롤링

by 민트초코맛꼬깔콘 2024. 2. 18.

구현화면


 

1. 배경

일반적으로 이직 준비를 하게 되면 가고자 하는 기업의 채용 사이트를 방문하기도 하지만 일반적으로 다양한 채용 플랫폼을 활용하게 됩니다. 현재 국내에는 사람인, 잡코리아, 링크드인, 리멤버, 잡플래닛, 원티드.. 그 외에도 알바몬, 워크넷, 인크루트, 알바천국, 교차로, 벼룩시장, 로켓펀치, 블라인드 하이어 등 너무 많은 채용 플랫폼이 존재합니다. 그리고 요즘 대형 서치펌에서는 자체적으로 채용 플랫폼을 만들고 운영하고 있는 곳도 있습니다. 저 또한 마찬가지이고 3~4개 정도의 채용 플랫폼과 평소 가고 싶었던 회사 자체 채용 사이트를 들어가서 확인합니다.

이전 직장에서는 채용을 해야 하는 상황이 되고 인사팀에 요청을 하게 되면 1) 회사 채용 사이트에 공고를 올리고 2) 서치펌에 의뢰를 하고 3) 원X드에 공고를 올립니다. 그 외 사X인, 잡X리아 같은 플랫폼은 활용하지 않았습니다. 저희는 이렇게 3가지의 경로를 통해 공고를 내지만 각 회사마다 활용하는 플랫폼이 다를 것입니다. 물론 회사 입장에서 모든 채용 플랫폼에 공고를 올리면 더 많이 노출되고 인재 영입 기회도 많아져 좋지만 역시 비용이 문제이니까요~

구직자 입장에서는 회사 자체가 좋아서 지원하는 경우도 있을 것이고 원하는 직무 내용과 맞아떨어져 지원하는 경우도 있을 것입니다. 전자의 경우 직접 해당 기업 채용사이트를 방문해 보면 되지만 후자의 경우 다수의 회사 정보가 모여있는 채용 플랫폼을 활용해야 할 것입니다. 그리고 가고 싶어 하는 회사가 어떤 채용 플랫폼을 활용하는지 모르는 사람들이 대부분이며 1~2개의 채용 플랫폼만 검색한다면 관심기업을 놓칠 확률이 높다고 생각했습니다. 그리고 채용 공고가 한 달가량 장기적으로 오픈되어 있고 수시로 이력서를 받아 보는 곳도 있지만 일반적으로 짧게는 일주일에서 보름정도의 서류접수 기간을 갖게 됩니다. 그 기간을 놓치고 보면 이 또한 구직자 입장에서는 아까운 게 아닐까 하는 생각이 듭니다. 그렇다고 존재하는 모든 플랫폼에서 매일 다 찾아볼 수도 없는 노릇입니다. 또 다양한 키워드로 검색하지만 중복적으로 나타나는 채용공고가 있어서 다시 확인해야 하는 시간이 아까웠습니다.

실제로 회사 규모, 사업 내용, 업종, 직무 내용 등 마음에 드는 곳이 있었는데 다른 플랫폼에서 며칠 전 마감된 공고를 뒤늦게 발견했을 때 너무 아쉬웠던 적이 있었습니다.  그래서 이러한 것들을 해소할 수 있는 기능과 검토를 위해 눈에 보기 쉽도록 웹페이지를 하나 만들어 보기로 합니다.

 

2. 목적 / 기능

앞서 설명한 내용들을 정리해서 크롤링을 통해 하고자 하는 것은 아래와 같습니다.

  • 다양한 채용플랫폼에서 올라오는 채용 공고를 놓치지 않는 것이 목적입니다.
  • 여러 플랫폼에서 중복되는 채용 공고는 제외하여 반복적 확인하는 시간 낭비를 줄이고자 합니다.
  • 내가 원하는 검색 키워드에 맞는 채용공고를 크롤링할 수 있어야 합니다. 아래 search_words에 있는 키워드들이 저의 직무와 연관 있는 키워드입니다.
  • 한번 검토했던 채용공고는 다시 보지 않도록 하여 불필요한 검토 시간을 줄일 수 있어야 합니다.
  • 제 직무와 연관이 없는 키워드가 포함된 공고명은 제외하여 노출될 수 있도록 합니다.
  • 제 직무와 연관이 없는 회사는 차단하여 검토 시간을 줄일 수 있어야 합니다.
  • 웹페이지를 만들어 회사명, 공고제목을 직관적으로 빠르게 확인할 수 있도록 합니다.
search_words = [
    "컴퓨터비전", "computer vision",
    "영상처리", "image processing",
    "딥러닝", "deep learning",
    "머신러닝", "machine learning",
    "이미지인식", "image recognition",
    "이미지분석", "image analysis",
    "비전ai", "vision ai",
    "opencv",
    "로봇비전", "영상ai",
    "visual ai", "영상분석",
    "멀티모달",
    "비정형 데이터"
    "인공지능", "artificial intelligence"
]

 

3. 구현 내용

Jupyter Notebook에서 크롤링 작업을 돌리고 전처리/필터 적용하고 기존 저장된 정보와 중복여부 확인 후 json으로 저장합니다. 저장된 파일을 웹페이지에서 읽어와 검토를 진행합니다. 다음에 다시 진행을 한다면 웹페이지에서 전부 다 진행할 수 있도록 다시 개발해 보는 것도 좋을 것 같습니다.

 

3 - 1. 개발도구

  • Visual Studio Code
  • Python
  • Jupyter Notebook
  • vud.js
  • fastapi

 

3 - 2. 채용 플랫폼 검색 결과 획득

stext="질의내용"

대부분의 채용 플랫폼들은 위 사진과 같이 검색 파라미터를 통해 원하는 정보들을 얻을 수 있습니다. 다양한 파라미터 조합으로 불필요한 정보는 빼고 나한테 필요한 정보만 얻을 수 있도록 조합을 합니다. 예시로 아래의 내용을 보면 searchword, loc_mcd, company_cd의 파라미터만 활용해도 나와 맞지 않는 채용공고 검색 수를 줄일 수 있습니다.

searchType=search
searchword=컴퓨터비전         # 검색어
loc_mcd=101000,102000         # 지역, 101000(서울),102000(경기)
company_cd=0,1,2,3,4,5,6,7    # 채용제공구분 / 9(파견/대행), 10(헤드헌팅)
search_optional_item=y
search_done=y
panel_count=y
recruitPage=1                 # 현재 페이지뷰
recruitSort=relation          # 정렬방법
recruitPageCount=100          # 표시 개수
inner_com_type=
show_applied=                 # 지원한 공고 표시
quick_apply=                  # 빠른 입사지원
except_read=                  # 조회한 페이지 제외
ai_head_hunting=
mainSearch=n

검색 결과에서 필요한 정보는 회사명, 회사 정보 링크, 공고명, 공고 링크 정도이며 여기에 크롤링 일자 정도의 값만 추가하여 json으로 저장합니다. 웹정보를 얻는 방법은 다른 블로그 내용들이 많기 때문에 따로 적지는 않겠습니다. 이렇게 수집한 정보들이라 해도 불필요한 공고들이 포함되어 있기 때문에 아래의 필터들을 이용하여 삭제해 줍니다. 

 

3 - 3. 전처리

회사명과, 공고명에 어떤 전처리를 해야 할까 고민을 많이 했습니다. 회사명은 고유한 것이니 굳이 전처리를 안 해도 되지 않을까? 형태소 분석을 해야 할까? 토큰화해야 할까? 영어로 된 회사의 경우 "ALPHABET", "알파벳"처럼 한/영 표기는 어떻게 처리할까? 숫자는? 등등 고민을 했는데 최대한 간단한 방법으로 가보자 했습니다.

회사명의 경우 특수문자, 띄어쓰기, 주식회사, 재단법인, 사단법인 등의 정보만 제거를 했고 공고명의 경우 특수문자, 띄어쓰기만 제거를 하고 진행을 했습니다.

remove_words = [" ", "\n",
                "주식회사",
                "(주)",
                "(재)",
                "",
                "",
                "재)",
                "주)"
                ]

 

3 - 4. 필터 - 회사명 (1,019개)

회사명에 적용해 주는 필터입니다. 서치펌에서 올리는 경우도 있고 저와는 전혀 관계가 없는 회사들을 차단합니다.

..., 150명이상의스타트업, ADAS개발전문기업, [국내유망데이터솔류션개발업체], 경상종합물류, 고진모터스, 골프프렌드, 국내대기업, 국내대기업전자자동차전장사업부, 국내비영리단체·협회·교육재단, 글로벌인, 내쇼날모터스, 대기업, 대기업계열사·자회사, 대기업미디어지주사, 대기업유통사, 비책, 오조이, GS텔레서비스, 아이데코건축, 오션키즈, 석세스아카, 커리어텍, 다른두끼떡볶이, 벤투싹쿠아, 에스앤아이코퍼레이션, 창신아이엔씨, 더좋은, 좋은비타민, 반도체장비제조사, 백작, 벤처기업, 본에스티스, 부스터스, 분양쩜컴, 브랜드501, 비트컴퓨터, 선인, 씨넥스존, 씨에이치솔루션, 아이스크림에듀, 업템포글로벌, 업템포마케터즈, 에듀스파박문각, ... 등등

 

3 - 5. 필터 - 회사명 키워드 (64개)

저와 관계없는 회사들을 일일이 다 넣을 수 없기에 아래 키워드들이 회사명에 포함이 되면 걸리게 됩니다.

학원, 스터디, 교육원, 교육센터, 평생교육원, 필라테스, 아카데미, 병원, 부동산, 중개, 건축사, 의원, 결혼, 출판, 손해사정, 축구, 스쿨, 학교, 산부인과, 주얼리, 부티크, 복지관, 스투디오, 에스씨에이게임, 렌트카, 스타트업, 의료센터, 웨딩, 에이치알, 테라로사, 성형외과, 변호사, 화장품, 대한상공회의소, 안과, 복지재단, 투어, 체형교정, 사단법인, 투자자문, 노무법인, 수영장, 자산운용, 폴리텍, 울산, 특허법인, 위너TFK, 에듀플렉스, 법률사무소, 천안, 충북, 법무법인, 도시락, 리조트, 요양원, 산후조리원, 사회복지, 청소년, 인재개발원, 컨벤션, 인베스트먼트, 교육개발원, 장애인, 사무소, ... 등등

 

3 - 6. 필터 - 공고명 키워드 (86개)

공고명에 아래와 같은 키워드가 포함된다면 걸러지도록 합니다. 여기서 "백엔드", "java", "android" 같은 개발 관련 키워드도 넣고 싶었는데 가끔씩 올라오는 공고명을 보면 "프론트/백엔드/컴퓨터비전/시스템운영 채용" 같이 여러 개의 포지션을 하나의 공고에 올라오는 경우가 있어서 넣지는 않았습니다. 지금 다시 만든다고 하면 해당 필터에 걸린 공고 대상으로 검색키워드 포함 유무를 확인하면 쉽게 더 많이 걸러낼 수 있을 것 같네요.

영업관리, 매장관리, 고객, 사무보조, 마케팅, 마케터, 경영지원, NodeJs, Nestjs, 부동산, 영업사원, 자재관리, 회계, 재무, 총무, 영상의학실, 유지보수, 고객응대, 텔레마케터, 아웃바운드, 국비지원, 화장품, 디자이너, 인플루언서, MD, AMD, 온라인, 네일리스트, 웹디자인, 기술영업, 회로설계, 강사, 경리, 사무행정, 보험설계사, 유튜브, 유투브, 국비무료, 국비지원, 수행기사, 행정보조, 구축사업, 골프장, 영업지원, Node.js, node.js, 방송장비, 물류팀, 물류관리, 창고관리, 정보보안, 품질경영, 코스메틱, 자동차튜닝, 시각디자인, 악세사리, 업무제휴, 무료, 영상제작, 생산관리, 인사팀장, 자동차영업, 생산팀, 창업센터, ... 등등

 

3 - 7. 필터 - 공고명 지역 (20개)

검색 매개변수를 통해 회사 지역을 서울, 경기권인 곳만 검색하긴 했지만 다양한 이유로 그 외 지역들의 회사가 꽤 검색됩니다. 이런 경우를 위해 아래의 지역명을 통해 필터링을 한번 해주게 됩니다.

대전, 대구, 부산, 인천, 세종, 일본, 김해, 전북, 광주, 제주, 전북, 창원, 천안, 청주, 충주, 진주, 화성, 동탄, 충북, ... 등등

 

4. 크롤링 내용 분석

약 6개월이 안되는 기간 동안의 분석현황 입니다. 다양한 로그를 남겨놓지 못한게 아쉽네요.
채용 공고가 1개만 올라온 곳이 48.93%(4,362개)를 차지하고 1~7개의 공고가 올라오는 곳이 전체의 91%이상을 차지하네요

  • 크롤링 된 회사 개수: 8,917개
  • 크롤링 된 채용공고 개수: 28,698
1 2 3 4 5 6 7 8 9 10 11 12 13 14
4362 1686 831 532 378 226 169 112 79 92 55 60 36 34
15 16 17 18 19 20 21 22 23 24 25 26 27 28
21 38 29 16 16 14 8 14 11 8 10 6 2 9
29 30 31 32 33 34 35 36 37 38 39 40 41 42
6 3 4 1 3 2 2 2 3 1 2 1 3 1
44 45 46 47 49 50 52 55 57 60 62 69 73 74
1 3 2 4 1 1 2 1 1 1 1 1 1 1
78 92 168 222 364                  
1 1 1 1 1                  

※ 표 설명: 크롤링 기간 내 채용공고가 1개만 올라온 회사가 4,362곳이고 공고가 2개만 올라온 회사는 1,686곳임

특이한 것은 기간 내에 공고가 364개, 222개, 168개 올라온 곳들도 존재했습니다. 채용공과 많았던 회사 상위 20개 순으로 보면 아래와 같습니다. 삼성전자와 엘지전자의 경우 대규모 채용이 진행되는 경우가 있습니다. 보통 하나의 공고게시글에 다양한 포지션 설명이 있는데 하나의 포지션이 하나의 게시물로 올라오게 되어 많아지게 되었습니다.

삼성전자 364 알체라 57
엘지전자 222 파킹클라우드 55
콘센트릭스서비스코리아 168 에이치디한국조선해양 52
넥슨 92 딥엑스 52
슈어소프트테크 78 스피링크 50
원익피앤이 74 한국조선해양 49
쿠팡 73 에이모 47
엔씨소프트 69 LG에너지솔루션 47
뉴로핏 62 엘지유플러스 47
현대자동차 60 삼성에스디아이 47

 

다음에 시간이 된다면 채용 공고명에 대해 형태소 분석을 하여 어떤 키워드들이 자주 올라왔는지 등을 파악해보면 좋을 것 같습니다. "에이치디한국조선해양", "한국조선해양" 같이 동일 기업이지만 표현에 따라 달라지는 부분들에 대한 수정을 분석을 통해 고도화 할 수 있을 것 같네요.

 

5. 화면구성

구현한 웹페이지 화면

  • 전체 - 크롤링된 모든 채용공고의 개수
  • 대기중 - 크롤링 수행 후 아직 확인하지 않은 새로운 공고
  • 저장 - 이력서 지원을 할 만한 곳을 저장해 둠
  • 임시저장 - 빠른 검토 진행을 위해 애매모호하거나 나중에 다시 한번 확인이 필요할 경우 임시저장함
  • 확인완료 - 확인완료 된 채용공고

 

6. 사용 후기

이전에는 자주 활용했던 플랫폼은 사X인, 잡X리아, 링X드인, 리X버 정도였습니다. 시간 날 때마다 들어가서 키워드를 검색해 보며 봤던 공고 또 클릭하곤 했었습니다.

해당 기능을 개발하면서 자주 확인할 때는 이틀에 한 번씩은 채용공고 스크래핑을 했던 것 같습니다. 한번 돌리면 적게는 80개 많게는 300개까지 평균적으로 올라왔던 것 같습니다. 처음에는 범위가 넓게 많은 회사들이 나왔는데 점점 키워드 필터를 추가 진행할수록 나에게 맞는 공고들 위주로 나오게 되었습니다. 간혹 테스트한다고 밤에 돌리면 그때 공고가 새로 올라오는 회사들도 있었습니다. 그런 회사는 왠지 꼭 피해야 할 것 같은 생각이 들었습니다 😂 확실히 Jupyter Notebook보다 웹페이지에서 볼 수 있게 구현을 하니 가독성이 좋고 빠른 검토가 가능했습니다. 또한 봤던 공고를 다시 볼 필요가 없어졌습니다.

결론적으로 내 직무에 맞는 키워드들로 여러 채용플랫폼에서 결과를 뽑고 내가 지원할지, 버릴지 검토하는 작업까지 진행하는데 20분 정도 걸렸습니다. 구직준비 해보신 분들이라면 얼마나 많은 시간이 단축되었는지 알 것입니다. 

 

7. 마무리

크롤링이 악용될 수 있는 점을 우려하여 상세 개발 방법에 대해서는 작성하지 않았습니다. (이미 다른 블로그에 내용들이 많기도 하고...) 해당 포스팅을 통해 구직자 입장에서 더 나은 채용시장 환경이 구성되었으면 하는 바람에서 해당 포스팅을 작성하였습니다. 이제 이직이 확정되어 더 이상 활용하지 않게 되었습니다. 꼭 필요한 내용들만 크롤링을 했는데 다음에 다시 활용하게 된다면 그때는 더 많은 로그를 남겨 등록시간, 플랫폼 비교 등 다양한 분석과 채용시장 현황을 확인해 보면 재미있을 것 같습니다.
무리한 크롤링은 플랫폼 업체에 부담이 될 수 있으며 IP차단 등의 제재를 받을 수 있습니다.

 

8. 소스코드

github - https://github.com/crayon-go/Job_Position_Crawler

 

GitHub - crayon-go/Job_Position_Crawler: 채용정보 크롤러

채용정보 크롤러. Contribute to crayon-go/Job_Position_Crawler development by creating an account on GitHub.

github.com