본문 바로가기
데이터분석/크롤링

[Selenium] 사람인(Saramin) 채용공고 크롤링

by merona99 2022. 6. 29.
반응형

사람인에서 채용공고 크롤링하기

 

 

캡스톤을 진행하면서 했던 마지막 크롤링 정리

사람인이 가장 데이터가 많았다.

 

 

 

[사람인 홈페이지]

 

사람인: https://www.saramin.co.kr/zf_user/jobs/list/domestic

 

지역별 채용정보 - 사람인

채용공고 | 지역, 근무지역, 경력, 학력, 연봉 등으로 찾는 취업정보 - 사람인

www.saramin.co.kr

 


 

크롤링 방법

 

hashtag = ['Back_end', 'Software', 'System', 'Database', 'Network/Security', 'Front_end', 'Application', 'Service', 'Game', 'AI']
 
해당 부분은 임의로 10개로 IT직군을 나눈 라벨링 데이터이다.
또한 해당 라벨링에 어울리는 직군끼리 묶어주는 작업을 진행하였다.

 

 

해쉬태그 분류 방법

크롤링 컬럼.hwp
0.02MB

 

 

사실 이렇게 하면 문제가 있었다.

사람인은 프로그래머스와 달리 하나의 채용공고안에 web, ai, network등 세부분야로 나눠져서 저렇게 라벨링을 해버리면 모델을 학습할때 정확도가 전혀 나오지 않는다

 

우리의 경우에는 프로그래머스+사람인+인크루트+원티드를 했을 때 30퍼?정도의 정확도가 나왔다. ㅋㅋㅋ

쓰레기...

 

그래서 여담이지만 이후에 링크드인에서 하나의 직군에 대해서만 채용공고를 낸 데이터를 가지고 크롤링을 진행하여 실제 모델에 사용했다.

 

크롤링 경험으로 넘어가도록 하자^_^

 

 

[크롤링 화면]

 

해당 부분은 Front-End에 해당하는 공고들을 클릭했을 때 나오는 화면이다.

해당 url: https://www.saramin.co.kr/zf_user/jobs/list/job-category?cat_kewd=91%2C92&panel_type=&search_optional_item=n&search_done=y&panel_count=y

 

 

 

위에서 검색했을 때 나오는 공고들의 url을 따서 배열에 저장하였다.

이후에 해당 url을 돌면서 데이터를 크롤링하는 과정으로 진행하였다.

 


 

크롤링 순서

 

1. 모듈 불러오기

셀레니움을 사용했다.

 

 

2. 라벨링값으로 검색했을 시 나오는 채용공고들의 url값 저장하기

driver.implicitly_wait(time_to_wait=60) 써주기 -> html을 읽어오는데 시간이 걸려 로딩이 안됬을때 크롤링을 진행했을 시 오류가 발생함

 

find_elements()'list_item'이름의 클래스를 모두 가져와서 해당 개수만큼 반복함

반복되는 페이지에서 a태그가 가지고 있는 href(링크)값을 가지고와서 별도의 배열(data)에 저장

 

driver.close() -> 드라이버를 사용했으면 닫아주기

 

// 나의 경우에 각 해쉬태그별 채용공고의 마지막 페이지를 num_list라는 배열에 저장해두고 해당 부분까지(마지막) 반복문을 진행하도록 구성하였다.

 

 

3. 채용공고 데이터 크롤링 및 csv파일 저장

driver.switch_to.frame('')을 사용하여 iframe의 html로 전환하기

saramin_data.csv파일로 본문데이터와 해쉬태그 값을 하나씩(a옵션) 저장

 

 


[소스코드]

 

from urllib.request import Request, urlopen, HTTPError
import re
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.common.by import By
import csv

# Back_end 161 : https://www.saramin.co.kr/zf_user/jobs/list/job-category?page=1&cat_kewd=87%2C88%2C84%2C194%2C93%2C94%2C115%2C113%2C2232&search_optional_item=n&search_done=y&panel_count=y&isAjaxRequest=0&page_count=50&sort=RL&type=job-category&is_param=1&isSearchResultEmpty=1&isSectionHome=0&searchParamCount=1#searchTitle
# Software 22 : https://www.saramin.co.kr/zf_user/jobs/list/job-category?page=2&cat_kewd=192%2C184&search_optional_item=n&search_done=y&panel_count=y&isAjaxRequest=0&page_count=50&sort=RL&type=job-category&is_param=1&isSearchResultEmpty=1&isSectionHome=0&searchParamCount=1#searchTitle
# System 9 : https://www.saramin.co.kr/zf_user/jobs/list/job-category?page=2&cat_kewd=319%2C185%2C186%2C189%2C320&search_optional_item=n&search_done=y&panel_count=y&isAjaxRequest=0&page_count=50&sort=RL&type=job-category&is_param=1&isSearchResultEmpty=1&isSectionHome=0&searchParamCount=1#searchTitle
# Database 27 : https://www.saramin.co.kr/zf_user/jobs/list/job-category?page=2&cat_kewd=83%2C192%2C191%2C110&search_optional_item=n&search_done=y&panel_count=y&isAjaxRequest=0&page_count=50&sort=RL&type=job-category&is_param=1&isSearchResultEmpty=1&isSectionHome=0&searchParamCount=1#searchTitle
# Network/Security 75 : https://www.saramin.co.kr/zf_user/jobs/list/job-category?page=2&cat_kewd=85%2C90%2C104%2C111%2C114%2C190%2C193%2C112&search_optional_item=n&search_done=y&panel_count=y&isAjaxRequest=0&page_count=50&sort=RL&type=job-category&is_param=1&isSearchResultEmpty=1&isSectionHome=0&searchParamCount=1#searchTitle
# Front_end 87 : https://www.saramin.co.kr/zf_user/jobs/list/job-category?page=2&cat_kewd=92%2C91&search_optional_item=n&search_done=y&panel_count=y&isAjaxRequest=0&page_count=50&sort=RL&type=job-category&is_param=1&isSearchResultEmpty=1&isSectionHome=0&searchParamCount=1#searchTitle
# Application 40 : https://www.saramin.co.kr/zf_user/jobs/list/job-category?page=2&cat_kewd=112%2C195&search_optional_item=n&search_done=y&panel_count=y&isAjaxRequest=0&page_count=50&sort=RL&type=job-category&is_param=1&isSearchResultEmpty=1&isSectionHome=0&searchParamCount=1#searchTitle
# Service 108 : https://www.saramin.co.kr/zf_user/jobs/list/job-category?page=2&cat_kewd=89%2C81&search_optional_item=n&search_done=y&panel_count=y&isAjaxRequest=0&page_count=50&sort=RL&type=job-category&is_param=1&isSearchResultEmpty=1&isSectionHome=0&searchParamCount=1#searchTitle
# Game 9 : https://www.saramin.co.kr/zf_user/jobs/list/job-category?page=2&cat_kewd=80&search_optional_item=n&search_done=y&panel_count=y&isAjaxRequest=0&page_count=50&sort=RL&type=job-category&is_param=1&isSearchResultEmpty=1&isSectionHome=0&searchParamCount=1#searchTitle
# AI 58 : https://www.saramin.co.kr/zf_user/jobs/list/job-category?page=2&cat_kewd=82%2C105%2C106%2C107%2C108%2C109%2C116&search_optional_item=n&search_done=y&panel_count=y&isAjaxRequest=0&page_count=50&sort=RL&type=job-category&is_param=1&isSearchResultEmpty=1&isSectionHome=0&searchParamCount=1#searchTitle

base_url = 'https://www.saramin.co.kr/zf_user/jobs/list/job-category?page='
url_list = ['&cat_kewd=87%2C88%2C84%2C194%2C93%2C94%2C115%2C113%2C2232','&cat_kewd=192%2C184','&cat_kewd=319%2C185%2C186%2C189%2C320','&cat_kewd=83%2C192%2C191%2C110','&cat_kewd=85%2C90%2C104%2C111%2C114%2C190%2C193%2C112','&cat_kewd=92%2C91','&cat_kewd=112%2C195','&cat_kewd=89%2C81','&cat_kewd=80','&cat_kewd=82%2C105%2C106%2C107%2C108%2C109%2C116']
tail_url = '&search_optional_item=n&search_done=y&panel_count=y&isAjaxRequest=0&page_count=50&sort=RL&type=job-category&is_param=1&isSearchResultEmpty=1&isSectionHome=0&searchParamCount=1#searchTitle'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
num_list = [161,22,9,27,75,87,40,108,9,58]
data = [[]for _ in range(10)]           # url 저장 리스트

# 각 해쉬태그의 url들을 찾는 크롤링코드
driver = webdriver.Chrome("chromedriver")
for idx, num in enumerate(num_list):  
    for n in range(1, num+1):
        URL = base_url + str(n) + url_list[idx] + tail_url
        driver.get(url=URL)
        driver.implicitly_wait(time_to_wait=60)

        div = driver.find_elements(By.CLASS_NAME, "list_item")
        for item in div:
            tmp = item.find_element(By.TAG_NAME, "a").get_attribute('href')
            data[idx].append(tmp)
        time.sleep(2)
        
driver.close()
print('step1 done!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
print(len(data))


# 채용공고 데이터 크롤링
hashtag = ['Back_end', 'Software', 'System', 'Database', 'Network/Security', 'Front_end', 'Application', 'Service', 'Game', 'AI']
counting = 0

driver = webdriver.Chrome("chromedriver")
for idx in range(len(data)):
    for url in data[idx]:
        print(url)
        driver.get(url=url)
        driver.implicitly_wait(time_to_wait=60)
        try:
            driver.switch_to.frame("iframe_content_0")
            contents = driver.find_element(By.CLASS_NAME, "user_content").text
            print(contents)
            
            saramin_data = {
            'content' : contents,
            'tag' : hashtag[idx]
            }  

            with open('./saramin_data.csv', 'a', encoding='utf-8', newline='') as csvfile:
                fieldnames = ['content', 'tag']
                csvwriter = csv.DictWriter(csvfile, fieldnames=fieldnames)
                csvwriter.writerow(saramin_data)

            counting += 1   
            print(counting,'번째 : ', hashtag[idx])     
            time.sleep(2)

        except:
            print('error!')
            continue

driver.close()
print('step2 done!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
print('총데이터:', counting, '개')

 


 

[결과]

 

saramin_data.csv - vscode

 

saramin_daata.csv - 구글코랩

총 '16391'개의 데이터가 크롤링 되었음을 확인하였다.

 

 

크롤링 데이터 첨부...는 용량상 문제로 실패~

 

 


캡스톤에서 사용한 크롤링 정리 끝!

피드백이나 질문 모두 환영합니당

 

반응형

댓글