🕸️ Python으로 잡코리아 채용 공고 크롤링하기 🕸️
BeautifulSoup 라이브러리를 활용한 웹 크롤링은 HTML에서 데이터를 추출하는 가장 일반적인 방법 중 하나입니다. 이 글에서는 잡코리아(Job Korea) 채용 정보를 크롤링하면서 HTML 구조, 주요 태그, CSS 선택자, BeautifulSoup 메서드 차이점 등 기초부터 심화된 내용까지 다뤄보겠습니다.
📌 웹 크롤링 개념과 HTML 구조
1. 웹 크롤링이란?
웹 크롤링은 프로그램이 웹페이지의 데이터를 자동으로 읽고 필요한 정보를 추출하는 작업입니다. 이 작업은 HTML을 분석해 데이터를 가져오는 방식으로 이루어집니다.
2. HTML 구조 이해하기
HTML은 웹페이지를 구성하는 언어로, 태그(<tag>
)를 사용해 데이터를 구조화합니다. 태그는 계층적이며, 웹페이지 요소를 나누는 역할을 합니다.
예시 HTML 구조:
<article class="list-item">
<div class="list-section-corp">
<a class="corp-name-link" href="/Recruit/GI_Read/12345" title="회사명">회사명</a>
</div>
<div class="list-section-information">
<div class="information-title">
<button class="button-scrap" data-brazeinfo="공고제목|12345|67890">스크랩</button>
</div>
<ul class="chip-information-group">
<li class="chip-information-item">경력 3년 이상</li>
<li class="chip-information-item">정규직</li>
<li class="chip-information-item">서울 강남구</li>
<li class="chip-information-item">D-17</li>
</ul>
</div>
</article>
3. HTML 태그와 CSS 선택자
(1) HTML 태그
HTML 태그는 웹페이지의 구조를 나타냅니다.
<article>
: 독립적인 콘텐츠를 나타냄.<div>
: 레이아웃을 나누는 용도.<a>
: 링크를 나타냄.<ul>
: 순서 없는 목록.<li>
: 목록 항목.
(2) CSS 선택자
CSS 선택자는 HTML 태그를 선택할 때 사용됩니다.
- 태그 선택자:
div
,a
,ul
등 태그 이름으로 선택. - 클래스 선택자:
.class_name
(예:.corp-name-link
). - 자식 선택자:
>
(예:div > a
→div
바로 아래의a
태그). - 속성 선택자:
[속성명="값"]
(예:a[title="회사명"]
).
🔍 BeautifulSoup 메서드 비교: find
, find_all
vs select
, select_one
BeautifulSoup은 HTML 태그를 선택하고 데이터를 추출할 때 두 가지 주요 방법을 제공합니다: find
계열 메서드와 select
계열 메서드입니다.
메서드 | 설명 | CSS 선택자 사용 |
---|---|---|
find |
조건에 맞는 첫 번째 요소를 반환합니다. | 사용 불가능 |
find_all |
조건에 맞는 모든 요소를 리스트로 반환합니다. | 사용 불가능 |
select |
CSS 선택자를 사용해 조건에 맞는 모든 요소를 리스트로 반환합니다. | 사용 가능 |
select_one |
CSS 선택자를 사용해 조건에 맞는 첫 번째 요소를 반환합니다. | 사용 가능 |
사용 예제
(1) find
와 find_all
HTML에서 특정 태그를 찾을 때 유용합니다.
# 첫 번째 <a> 태그 찾기
link = soup.find('a')
# 모든 <a> 태그 찾기
all_links = soup.find_all('a')
(2) select
와 select_one
CSS 선택자를 사용하여 좀 더 정밀한 선택이 가능합니다.
# CSS 선택자로 모든 <p> 태그 찾기
paragraphs = soup.select('div.parent > p')
# 첫 번째 <p> 태그 찾기
first_paragraph = soup.select_one('div.parent > p')
(3) 메서드 사용 용도 비교
find
와find_all
: 특정 태그 이름(a
,div
등) 또는 속성을 기준으로 찾을 때 사용합니다.select
와select_one
: CSS 선택자를 사용할 수 있어 복잡한 조건에서도 유용합니다.
🛠️ 크롤링에 사용된 라이브러리
1. requests
requests
는 HTTP 요청을 보내 웹페이지의 HTML 코드를 가져오는 데 사용됩니다.
- HTML 가져오기:
response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}) html = response.text
2. BeautifulSoup
BeautifulSoup
은 HTML을 파싱(분석)하여 데이터를 추출하는 데 사용됩니다.
- HTML 파싱:
BeautifulSoup
은 HTML 문서를 트리 구조로 변환하여 데이터를 쉽게 탐색하고 조작할 수 있도록 돕습니다.
# BeautifulSoup으로 HTML 파싱하기
from bs4 import BeautifulSoup
html = "<html><body><p>Hello, World!</p></body></html>"
soup = BeautifulSoup(html, 'html.parser')
print(soup.p.text) # 출력: Hello, World!
주요 기능
- HTML 파싱: HTML 문서를 트리 구조로 변환.
- 태그 선택: 특정 태그를 선택하고 속성, 텍스트 등을 추출.
- 태그 탐색: 부모-자식 관계를 이용해 태그 간 이동.
3. pandas
pandas
는 데이터를 구조화하여 CSV 또는 Excel 파일로 저장하거나 데이터를 분석할 때 사용되는 라이브러리입니다.
- 데이터프레임 생성: 크롤링한 데이터를 테이블 형태로 정리.
- CSV/Excel 저장: 데이터프레임을 CSV 또는 Excel 형식으로 내보내기.
import pandas as pd
# 예제 데이터
data = [
{"회사명": "A회사", "제목": "데이터 분석가 모집", "경력": "경력 3년 이상", "타입": "정규직"},
{"회사명": "B회사", "제목": "AI 엔지니어 모집", "경력": "신입", "타입": "정규직"},
]
# 데이터프레임 생성
df = pd.DataFrame(data)
# Excel 파일로 저장
df.to_excel('job_data.xlsx', index=False)
print("Excel 파일 저장 완료!")
주요 기능
- 데이터 정리: 데이터를 행과 열로 구성된 형태로 정리하여 테이블 형식으로 저장.
- 파일 저장: 데이터를 CSV, Excel 등 다양한 형식으로 저장 가능.
- 데이터 분석: 데이터프레임을 이용하여 필터링, 집계, 변환 등 다양한 데이터 분석 작업을 지원.
📊 실전 코드: 잡코리아 채용 정보 크롤링
아래는 앞서 배운 HTML 분석과 라이브러리 활용을 통해 잡코리아의 채용 정보를 크롤링하는 실전 코드입니다.
크롤링 코드
from bs4 import BeautifulSoup
import requests
import pandas as pd
data = []
# 검색 키워드와 페이지 수 입력
Keyword = input("키워드를 입력하세요: ")
Page = input("페이지 수를 입력하세요: ")
for page in range(1, int(Page) + 1):
# URL 생성
url = f'https://www.jobkorea.co.kr/Search/?stext={Keyword}&tabType=recruit&Page_No={page}'
response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
soup = BeautifulSoup(response.text, 'html.parser')
# 채용 정보 추출
recruits = soup.find_all('article', class_='list-item')
for recruit in recruits:
try:
# 회사명 추출
corp_name = recruit.select_one('a.corp-name-link').text.strip()
# 공고 제목 추출
title = recruit.select_one('button.button-scrap')
job_title = title.get('data-brazeinfo').split('|')[0] if title else "제목 없음"
# 추가 정보 추출
info_items = recruit.select('ul.chip-information-group > li.chip-information-item')
job_info = {'경력': None, '채용타입': None, '위치': None, '마감일': None}
for item in info_items:
text = item.text.strip()
if any(keyword in text for keyword in ["경력", "신입", "경력무관"]):
job_info['경력'] = text
elif "정규직" in text:
job_info['채용타입'] = text
elif any(city in text for city in ["서울", "경기", "부산"]):
job_info['위치'] = text
elif "D-" in text:
job_info['마감일'] = text
# 데이터 저장
data.append([corp_name, job_title, job_info['경력'], job_info['채용타입']])
except Exception as e:
print("Error:", e)
# 데이터프레임 생성 및 Excel 저장
df = pd.DataFrame(data, columns=['회사명', '제목', '경력', '채용타입'])
df.to_excel('jobkorea_jobs.xlsx', index=False)
print("크롤링 완료! 데이터가 jobkorea_jobs.xlsx에 저장되었습니다.")
🔍 삼항 연산자 심화
삼항 연산자란?
Python의 삼항 연산자는 간단한 조건문을 한 줄로 표현하는 방법입니다.
result = 값1 if 조건 else 값2
age = 20
status = "성인" if age >= 18 else "미성년자"
print(status) # 출력: 성인
크롤링에서 활용
삼항 연산자는 기본값을 설정하는 데 유용합니다.
job_title = title.get('data-brazeinfo').split('|')[0] if title else "제목 없음"
if title:
job_title = title.get('data-brazeinfo').split('|')[0]
else:
job_title = "제목 없음"
결론
이 글에서는 HTML 구조, 태그와 CSS 선택자, BeautifulSoup 메서드, 삼항 연산자 등을 활용해 Job Korea의 채용 정보를 크롤링하는 방법을 배웠습니다. 기초적인 내용을 이해하고 응용하면 더욱 복잡한 웹페이지에서도 데이터를 효율적으로 추출할 수 있습니다.
'데이터 공부 > 크롤링 공부' 카테고리의 다른 글
[웹크롤링] 파이썬 사람인 추출하기 공부/select, select_one (1) | 2024.04.12 |
---|