프로젝트 계기
데이터를 직접 취득하여 무언가 인사이트를 얻을 수 있을 좋은 프로젝트 소스를 고민하다가 이전에 데이터 분석쪽 취업을 위해 열심히 사용했던 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']]
이제, 새로 만든 데이터 프레임으로 본격적인 자연어 전처리에 돌입하고자 한다.
이후의 진행은 다음 포스트로...
'Project 관련 기록' 카테고리의 다른 글
[Project] 원티드 채용 공고 분석 및 인사이트 도출 (2) (1) | 2024.01.05 |
---|---|
[DevCourse] Monthly EDA Project(3) 최종 결과 및 회고 (0) | 2021.05.22 |
[DevCourse] Monthly EDA Project (2) 배포는 어떻게 할 건가? (0) | 2021.05.22 |
[DevCourse] Monthly EDA Project (1) EDA Baseline을 작성하면서 배운 시각화 방법 (0) | 2021.05.12 |