본문 바로가기
Project 관련 기록

[Project] 원티드 채용 공고 분석 및 인사이트 도출 (1)

by 다람이도토리 2024. 1. 2.

프로젝트 계기

데이터를 직접 취득하여 무언가 인사이트를 얻을 수 있을 좋은 프로젝트 소스를 고민하다가 이전에 데이터 분석쪽 취업을 위해 열심히 사용했던 Wanted 사이트가 기억나게 되었다. Wanted 채용 공고를 다양하게 분석하여 무언가 얻어보기로 한다.

프로젝트 목표

- Wanted에는 어떤 분야의 채용공고가 가장 많이 올라올까?
- 각 직군별로 요구 사항, 우대 사항, 업무는 어떻게 다를까?
- 그 외 데이터를 탐색하며 유의미한 인사이트 및 가설검정 해보기

단계 1 / 데이터 취득

동적 크롤링을 무작정 돌리기에는 직군이 매우 많아 좋지 않아, 정적 크롤링을 활용하였다.
원티드의 공고에는 번호가 있어, 해당 번호를 바탕으로 크롤링을 실시하였다.
데이터를 더 많이 하고 싶으나, 컴퓨터의 한계도 존재하여 일정 번호 이하 2500개의 공고로 범위를 제한하였다.

import pandas as pd
import requests
from bs4 import BeautifulSoup as bs
import json
job_df = pd.DataFrame(columns = ['company_name', 'descriptions','date',
                                 'industry', 'category', 'title'])
cur_row = 0
i = 198001
while cur_row < 2500:
    i -= 1
    link = 'https://www.wanted.co.kr/wd/' + str(i)
    resp = requests.get(link)
    html = resp.text
    soup = bs(html, 'lxml')

    # title, position, main_tasks, requirements, sub_categories, company_name
    # script에 원하는 정보가 담겨있다.

    try:
        contents = soup.find('script',attrs={'type':'application/ld+json'}).text
        contents = json.loads(contents)
        company_name = contents['hiringOrganization']['name']
        descriptions = contents['hiringOrganization']['description']
        date = contents['datePosted']
        industry = contents['industry']
        category = contents['occupationalCategory']
        title = contents['title']
        cur_list = [company_name, descriptions, date,
                                 industry, category, title]
        job_df.loc[cur_row]=cur_list
        cur_row += 1
        print('%s %s input' %(company_name, category))
    except:
        pass

job_df.to_csv('C:/Users/USER/Desktop/personal_project/wanted_crawling.csv',
              encoding = 'utf-8-sig', index = False)

간단하게 해결 가능한 이유는, 각 공고 링크별로 구조가 동일하여 쉽게 가져올 수 있다.
다만 텍스트로만 되어 있어 어느 정도의 전처리도 들어가야 할 예정이다.
또한 크롤링하여 데이터를 살펴 본 결과 공고 페이지에서는 보이지 않는 공고의 카테고리 구분 등이 데이터로 들어가 있다.
이는 아마, 대구분/소구분을 선택하면 해당 공고 링크를 바탕으로 정보를 띄워주는 구조일 것이기에 데이터가 들어가있을 수 밖에 없음을 추론할 수 있다. 

단계 2 / 기초 전처리
현재 상태로는 채용 정보에서 원하는 내용을 가져올 수 없다.
다만, 크롬에서 개발자 도구로 살펴보면 주요 업무, 자격 요건, 우대 사항, 혜택 및 복지를 항목별로 입력하게 되어 이를 띄워주는 구조임을 알 수 있다. 역으로 생각해보면 description에서는 무조건 저 4개가 순서대로 들어가 있을 것이므로 주요 업무, 자격 요건, 우대 사항의 분리도 쉽게 된다. 이 이외의 간단한 전처리 사항도 탐색을 통해 가능하다.

import pandas as pd
job_df = pd.read_csv('C:/Users/USER/Desktop/personal_project/wanted_crawling.csv',
              encoding = 'utf-8-sig')
# 전처리 계획
# 1) date : 연-월만 있어도 분석에 충분
# 2) category : 대분류>중분류>... 방식, 전체적으로 중분류만 있어도 충분
# 3) descriptions : 주요 업무, 자격 요건, 우대 사항만 추출 방법...
# 방법 : 주요 업무 ~ 혜택 및 복지 전까지만 추출하면 됨
# 그 이후 구분 방법을 찾아 효율적 구분 필요

job_df['dt_ym'] = job_df.date.apply(lambda x : x[0:8])
job_df['ct_brief'] = job_df.category.apply(lambda x : list(x.split(','))[0:2])
job_df['job_due'] = job_df.descriptions.apply(lambda x: x[x.find('주요업무'): 
                                                         x.find('자격요건')])
job_df['job_req'] = job_df.descriptions.apply(lambda x: x[x.find('자격요건'): 
                                                         x.find('우대사항')])
job_df['job_add'] = job_df.descriptions.apply(lambda x: x[x.find('우대사항'): 
                                                         x.find('혜택 및 복지')])
job_df_prep = job_df[['company_name','industry', 'dt_ym', 'ct_brief', 
                      'job_req', 'job_add', 'job_due', 'title']]

이제, 새로 만든 데이터 프레임으로 본격적인 자연어 전처리에 돌입하고자 한다.
이후의 진행은 다음 포스트로...