파이썬을 이용한 크롤링

학 오·2021년 6월 29일
0

Python

목록 보기
1/1

🌈 커리어넷 직업정보 크롤링

커리어넷에서 직업정보에 대해서 크롤링할 일이 생겨서
크롤링을 하다가 어려웠던 경험을 풀고자 한다.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

from bs4 import BeautifulSoup
from urllib.request import urlopen

import requests
import json

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

위의 코드는 selenium과 bs4 등을 불러오는 코드이다.
여기서 밑에서 3번째 줄의 '--headless' 옵션은 chrome을 띄우지 않고 백그라운드로 실행하는 것이다.

☁️ 본격 크롤링

직업정보의 데이터를 크롤링 하고자 한다. 왜 굳이 "녹음기사"를 정했냐하면 페이지를 넘기는데 있어서 짜증났던 경험을 풀고자 함이니 글을 써내려 가며 설명하보도록 하겠다.

먼저 "녹음기사"의 첫 페이지 정보를 얻어보고자 한다.

🌥첫 페이지 접속하기

위에서 필요한 라이브러리들을 불러왔고, 아래는 드라이브를 불러와서 접속을 하고자 한다.

# 직업 하나의 데이터 
BASE_URL = 'https://www.career.go.kr/cnet/front/base/job/jobList.do#tab1'
driver = webdriver.Chrome('/Users/hakoh/Desktop/chromedriver', options=chrome_options)
driver.get(BASE_URL)

driver.find_element_by_xpath('//*[@id="frm"]/div[4]/a[10]').click()
driver.find_element_by_xpath('//*[@id="frm"]/div[4]/a[12]').click()

driver.find_element_by_xpath('//[@id="JOB_DETAIL_LIST"]/li[1]/p[1]/strong/a').click()

위의 코드를 보고 생각을 해보자.
driver.get(BASE_URL) 까지는 기본적으로 페이지를 불러오고 다음 문단에 두 줄의 의미를 살펴보자.

driver.find_element_by_xpath('//[@id="frm"]/div[4]/a[10]').click()
driver.find_element_by_xpath('//
[@id="frm"]/div[4]/a[12]').click()

먼저 이 두 문장은 첫 페이지 에서 아래의 "다음" 버튼을 한 번 눌리고 해당 페이지에서 "다음"버튼을 한 번 더 눌려서 "녹음기사" 직업이 있는 21Page로 오는 것을 의미한다. 보통에 크롤링을 할 경우에는 URL에 페이지를 보여주지만 여기서는 그렇지 않기 때문에 수동적으로 페이지를 넘겨야만 했다. 그것을 보여주기 위해 21Page에 있는 녹음기사를 예로 들었다. 여기서, xpath를 보면 1번째 줄과 2번째 줄의 a태그 번호가 다른데 이것은 두 번째로 넘어 갔을 경우 아래의 페이지 번호 앞에 "맨 앞"과 "이전" 버튼이 생기기 때문에 +2 가 되었다.

마지막으로 줄을 보면

driver.find_element_by_xpath('//[@id="JOB_DETAIL_LIST"]/li[1]/p[1]/strong/a').click()

21Page로 와서 "녹음기사" 버튼을 눌려 해당 직업의 정보로 들어가는 것을 의미한다.

🌤 페이지의 정보를 가져오자

직업정보에서 필요한 몇 개의 정보만 가져와보겠다.
첫 번째 셀레니움을 통해 데이터를 가져와보자.

# selenium 을 이용한 데이터 가져오기
salary_avg = driver.find_element_by_xpath('//*[@id="frm"]/div[3]/ul/li[1]/span/strong').text # 평균연봉

future = driver.find_element_by_xpath('//*[@id="frm"]/div[3]/ul/li[2]/span/strong').text # 일자리전망

ability = driver.find_element_by_xpath('//*[@id="frm"]/div[3]/ul/li[3]/span/strong').text # 발전가능성

equal = driver.find_element_by_xpath('//*[@id="frm"]/div[3]/ul/li[4]/span/strong').text # 고용평등

print('평균연봉 :', salary_avg)
print('일자리전망 :', future)
print('발전가능성 :', ability)
print('고용평등 :', equal)

평균연봉 : 3000
일자리전망 : 보통미만
발전가능성 : 보통이상
고용평동 : 

위의 코드를 통해 xpath 정보를 가져와서 정보를 얻을 수 있었다.
(이상하게 '고용평등'에 관한 데이터는 나오지 않았다.)

두 번째로 bs4를 이용하여 데이터를 가져와보자.


html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

view_list = soup.select('div > p.word_txt')
similar_job = view_list[0].text

view_list_2 = soup.select('#tab1 > ul.word_ul')
do = view_list_2[0].get_text("", strip=True)
fun = view_list_2[1].get_text("", strip=True)
# 일단 select나 find 등으로 태그를 찾고 get_text 등의 명령어를 통해 데이터를 들고옴
# 위의 경우는 두 분류로 나누어 지고 [0]번째가 하는일 [1]이 흥미이고 띄어쓰기를 빼고 들고옴

classify = soup.select('#tab1 > dl > dd')
classify_1 = classify[0].get_text("", strip=True)
classify_2 = classify[1].get_text("", strip=True)

job_future = soup.select('#chart1Sumry')

print('유사직업명:', similar_job)
print('하는 일:', do)
print('적성 및 흥미:', fun)
print('표준직업분류:', classify_1)
print('고용직업분류:', classify_2)
print('직업전망:', job_future[0].text)

selector 정보를 들고 와서 각 데이터에 맞게 들고 오면 된다.
예시에서는 몇 가지 정보들만 들고 와봤다.
.text / .get_text 등 가져오는 경우가 다양하므로 이 부분은 bs4를 검색해서 찾아보자.

☀️ 다른 직업도 들고 오고 싶어

이 홈페이지에서 중요한 것은 페이지를 넘나드는 방법이었다.
이 부분을 잘 활용하여 반복문을 사용한다면 데이터를 들고 올 수 있을 것이다.
홈페이지 접속 -> 직업선택 -> 데이터 들고오기 -> back -> ... -> 페이지 다음 -> 직업선택 -> 데이터 들고오기 -> back -> ....
이런 과정들을 코드로 잘 담아보길 바란다...
직업정보를 다 받고 뒤로 가는 것을 잊지마세요..!(driver.back())

마치며

감사합니다🌟

0개의 댓글