서론
프리랜서로 활동하는 분들이 가장 어려워하는 부분 중 하나는 새로운 일거리를 찾는 것입니다. 적절한 채용 공고를 빠르게 파악하고 분석할 수 있다면 커리어 개발에도 도움이 될 것입니다. 이번에는 잡코리아 사이트를 크롤링하여 프리랜서 채용 공고를 수집하고, 카카오톡에서 손쉽게 공유할 수 있도록 데이터를 정제하는 과정을 다루어 보겠습니다.
1) 크롤링 작업
잡코리아는 다양한 채용 공고를 제공하며, 프리랜서 채용 공고도 확인할 수 있는 플랫폼입니다. 저는 Python과 BeautifulSoup 라이브러리를 활용하여 원하는 데이터를 수집하였으며, 이를 통해 페이지별로 데이터를 정리하고, 크롤링이 종료될 조건을 설정하였습니다.
크롤링 코드는 기본적으로 페이지별 데이터를 탐색하며, 데이터가 없을 경우 자동으로 중단됩니다. 주요 크롤링 과정은 다음과 같습니다
- 크롤링 대상 설정: 잡코리아의 URL을 분석하여 페이지 번호를 동적으로 변경할 수 있도록 설계했습니다.
- 데이터 추출: 회사명, 공고명, 경력, 학력, 채용 형태, 직장 위치, 마감 기한, 공고 링크를 포함한 정보를 수집합니다.
- 예외 처리: 공고 정보가 없는 경우 오류를 무시하고 크롤링을 계속 진행하도록 설정했습니다.
- 저장: 크롤링한 데이터를 Pandas DataFrame으로 저장하고 엑셀 파일로 출력했습니다.
아래는 구현한 크롤링 코드의 주요 부분입니다
# 스크래핑할 웹 사이트의 url을 선언, f-string을 이용해 page number를 바꾸어가며 탐색할 수 있도록 함.
page_no = 1
url = f"https://www.jobkorea.co.kr/Search/?stext=%ED%94%84%EB%A6%AC%EB%9E%9C%EC%84%9C&tabType=recruit&Page_No={page_no}"
# DataFrame 선언
df = pd.DataFrame(columns=['회사명', '공고명', '경력', '학력', '채용 형태', '직장 위치', '마감 기한', '공고 링크'])
import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
import time
# 기본 URL 설정
base_url = "https://www.jobkorea.co.kr/Search/?stext=%ED%94%84%EB%A6%AC%EB%9E%9C%EC%84%9C&duty=1000229%2C1000230%2C1000231%2C1000232%2C1000234%2C1000233%2C1000235%2C1000237%2C1000236%2C1000238%2C1000239%2C1000241%2C1000240%2C1000242%2C1000244%2C1000243%2C1000245%2C1000246%2C1000247&tabType=recruit&Page_No="
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'}
# 데이터를 저장할 리스트
data = []
# 페이지를 +1씩 증가시키며 데이터가 없으면 멈추기
while True:
url = base_url + str(page_no)
print(f"크롤링 중: {url}")
response = requests.get(url, headers=headers)
soup = bs(response.text, 'html.parser')
# 공고가 없는 경우 반복 종료
if soup.find('article', class_='list-empty'):
print("더 이상 공고가 없습니다. 크롤링을 종료합니다.")
break
# 현재 페이지의 채용 공고를 가져오기
job_posts = soup.find_all('article', class_='list-item')
# 각 공고 정보를 하나씩 처리
for post in job_posts:
try:
# 회사명
company_name = post.find('a', class_='corp-name-link').text.strip() if post.find('a', class_='corp-name-link') else None
# 공고명
job_title = post.find('a', class_='information-title-link').text.strip() if post.find('a', class_='information-title-link') else None
# 경력, 학력, 프리랜서 여부, 위치, 마감 기한 정보
info_items = post.find_all('li', class_='chip-information-item')
career = info_items[0].text.strip() if len(info_items) > 0 else None # 경력
education = info_items[1].text.strip() if len(info_items) > 1 else None # 학력
job_type = info_items[2].text.strip() if len(info_items) > 2 else None # 채용 형태 (프리랜서 여부)
location = info_items[3].text.strip() if len(info_items) > 3 else None # 직장 위치
deadline = info_items[4].text.strip() if len(info_items) > 4 else None # 마감 기한
# 공고 링크
job_link = post.find('a', class_='information-title-link')
job_link = "https://www.jobkorea.co.kr" + job_link['href'] if job_link else None
# 모든 필드가 비어있지 않은 경우에만 리스트에 추가
if all([company_name, job_title, career, education, job_type, location, deadline, job_link]):
data.append({
'회사명': company_name,
'공고명': job_title,
'경력': career,
'학력': education,
'채용 형태': job_type,
'직장 위치': location,
'마감 기한': deadline,
'공고 링크': job_link
})
except Exception as e:
print(f"오류 발생: {e}")
# 다음 페이지로 이동
page_no += 1
# 페이지간 딜레이 추가
time.sleep(1)
# DataFrame으로 변환
df = pd.DataFrame(data)
# xlsx 파일로 저장
file_name = "jobkorea_채용공고.xlsx"
df.to_excel(file_name, index=False)
print(f"엑셀 파일로 저장 완료: {file_name}")
2. 카카오톡 공유를 위한 정제 작업
크롤링한 데이터를 카카오톡 메시지 형식으로 정제하는 작업이 필요합니다.
- 필터링: 경력 요건이 5년 이하 또는 경력무관인 공고만 선택하며, "수리" 또는 "AS"와 같은 키워드를 포함하는 공고를 제외합니다. 제가 만들 정보방은 3년 이상의 경력자이기 때문입니다.
- 메시지 형식화: 간결하고 보기 좋은 카카오톡 메시지 형식으로 변환합니다.
- 출력: 각 메시지를 하나씩 출력하거나 API 연동을 통해 자동으로 전송할 수 있습니다.
아래는 데이터 정제 및 메시지 생성 코드입니다
import pandas as pd
# 엑셀 파일에서 데이터 불러오기
file_name = "jobkorea_채용공고.xlsx"
df = pd.read_excel(file_name)
# 경력이 5년 이하 또는 경력무관이며, 공고명과 회사명에 "수리", "AS", "as"가 포함되지 않은 데이터 필터링
filtered_df = df[
# df['경력'].str.contains(r'^(?:[0-5]년|경력무관)', na=False) &
~df['공고명'].str.contains(r'수리|AS|as', na=False, case=False) &
~df['회사명'].str.contains('수리', na=False)
]
# 각 공고를 간결한 카카오톡 메시지 형식으로 출력하는 함수
def format_for_kakao(df):
messages = []
for index, row in df.iterrows():
message = (
f"📢 {row['회사명']} 채용 공고\n"
f"공고명: {row['공고명']}\n"
f"경력: {row['경력']}\n"
f"🔗 링크: {row['공고 링크']}\n"
f"——————————————"
)
messages.append(message)
return messages
# 필터링된 데이터로부터 간결한 카카오톡 메시지 형식 준비
kakao_messages = format_for_kakao(filtered_df)
# 각 메시지를 하나씩 출력하거나 카카오톡 API에 전송할 수 있습니다.
for message in kakao_messages:
print(message)
# 카카오톡 API 연동 코드 추가 가능
위 코드를 스케줄링한다면 매일 자동으로 새로운 프리랜서 공고를 수집하고,
필터링하여 카카오톡 메시지 형식으로 손쉽게 공유할 수 있습니다.
추후 IT 프리랜서를 위한 커뮤니티를 운영하거나 팀을 관리하는 매니저를 대상으로 정보를 공유해보려합니다~.~
추가적으로는 카카오톡 API와 연동하여 메시지를 자동으로 발송하거나, 슬랙 or 디스코드 채널을 개설할 수 있습니다.
'Computer Engineering > Python' 카테고리의 다른 글
python 패키지 관리 툴 Poetry 설정해보기 (0) | 2022.11.22 |
---|---|
selenium과 beautifulsoup 크롤링 비교..와 대안찾기(puppeteer, playwriter) (0) | 2022.09.18 |