<사람인 백엔드 파트 크롤링>

  1. 사람인 페이지 넘버 크롤링
import requests
from bs4 import BeautifulSoup

saramin_result = requests.get("https://www.saramin.co.kr/zf_user/search/recruit?searchType=search&company_cd=0%2C1%2C2%2C3%2C4%2C5%2C6%2C7%2C9%2C10&searchword=%EB%B0%B1%EC%97%94%EB%93%9C&panel_type=&search_optional_item=y&search_done=y&panel_count=y&recruitPage=1&recruitSort=relation&recruitPageCount=40&inner_com_type=&quick_apply=&except_read=")

saramin_soup = BeautifulSoup(saramin_result.text, "html.parser")

pagination = saramin_soup.find("div", {"class" : "pagination"})

pages = pagination.find_all("a")

spans = []
for page in pages:
  spans.append(page.find("span"))
spans = spans[:-1]

마찬가지로 다음 버튼 전까지인 10페이지까지 크롤링 된다. 여기까지는 인디드 홈페이지와 거의 유사한 과정을 통해 크롤링했다. 심지어 태그명까지 같다.

  1. 마지막 페이지 찾아놓기
import requests
from bs4 import BeautifulSoup

saramin_result = requests.get("https://www.saramin.co.kr/zf_user/search/recruit?searchType=search&company_cd=0%2C1%2C2%2C3%2C4%2C5%2C6%2C7%2C9%2C10&searchword=%EB%B0%B1%EC%97%94%EB%93%9C&panel_type=&search_optional_item=y&search_done=y&panel_count=y&recruitPage=1&recruitSort=relation&recruitPageCount=40&inner_com_type=&quick_apply=&except_read=")

saramin_soup = BeautifulSoup(saramin_result.text, "html.parser")

pagination = saramin_soup.find("div", {"class" : "pagination"})

links = pagination.find_all("a")

pages = []
for link in links[:-1]:
  pages.append(int(link.string))
max_page = pages[-1]
  • 1페이지 기준 마지막 페이지는 10페이지였다.
  1. 최대 페이지수 만큼 리퀘스트 하기. + 정상 작동하는지 확인
    근데 이 페이지는 주소가 바뀌지 않고 화면만 전환되는 구조다..그래서 URL을 그대로 변수에 집어 넣고 썼더니 되었다.

saramin.py

import requests
from bs4 import BeautifulSoup

URL = "https://www.saramin.co.kr/zf_user/search/recruit?searchType=search&company_cd=0%2C1%2C2%2C3%2C4%2C5%2C6%2C7%2C9%2C10&searchword=%EB%B0%B1%EC%97%94%EB%93%9C&panel_type=&search_optional_item=y&search_done=y&panel_count=y&recruitPage=1&recruitSort=relation&recruitPageCount=40&inner_com_type=&quick_apply=&except_read="

def extract_saramin_pages():
  saramin_result = requests.get(URL)
  saramin_soup = BeautifulSoup(saramin_result.text, "html.parser")
  pagination = saramin_soup.find("div", {"class" : "pagination"})
  links = pagination.find_all("a")
  pages = []
  for link in links[:-1]:
    pages.append(int(link.string))
  max_page = pages[-1]
  return max_page

def extract_saramin_jobs(last_page):
  for page in range(last_page):
    result = requests.get(URL)
    print(result.status_code)

main.py

from saramin import extract_saramin_pages, extract_saramin_jobs

last_saramin_page = extract_saramin_pages()

extract_saramin_jobs(last_saramin_page)
  1. 직무 뽑아오기
    indeed 홈페이지와 구조가 거의 같다. 덕분에 한참 헤매다가 두 사이트의 검사창을 비교해서 바로 해결했다.
    saramin.py
import requests
from bs4 import BeautifulSoup

URL = "https://www.saramin.co.kr/zf_user/search/recruit?searchType=search&company_cd=0%2C1%2C2%2C3%2C4%2C5%2C6%2C7%2C9%2C10&searchword=%EB%B0%B1%EC%97%94%EB%93%9C&panel_type=&search_optional_item=y&search_done=y&panel_count=y&recruitPage=1&recruitSort=relation&recruitPageCount=40&inner_com_type=&quick_apply=&except_read="

def extract_saramin_pages():
  result = requests.get(URL)
  soup = BeautifulSoup(result.text, "html.parser")
  pagination = soup.find("div", {"class" : "pagination"})
  links = pagination.find_all("a")
  pages = []
  for link in links[:-1]:
    pages.append(int(link.string))
  max_page = pages[-1]
  return max_page

def extract_saramin_jobs(last_page):
  #for page in range(last_page):
   result = requests.get(URL)
   soup = BeautifulSoup(result.text, "html.parser")
   results = soup.find_all("div", {"class" :"area_job"})
   for result in results:
     title = result.find("h2", {"class" : "job_tit"}).find("a")["title"]
     print(title)
  1. 회사이름 찾아내기
  • 여기서부터 indeed와 다르다. 인디드는 클래스값 안에 모두 직무와 회사명이 있었는데 사람인은 따로 있다. 그렇기에 같은 방법으로 div를 추출 후 for 반복문을 돌렸다.

saramin.py(~last_page 부분)

def extract_saramin_jobs(last_page):
  jobs = []
  #for page in range(last_page):
  result = requests.get(URL)
  soup = BeautifulSoup(result.text, "html.parser")
  results = soup.find_all("div", {"class" :"area_job"})
  for result in results:
    title = result.find("h2", {"class" : "job_tit"}).find("a")["title"]
  results2 = soup.find_all("div", {"class" : "area_corp"})
  for result2 in results2:
    company = result2.find("strong", {"class" : "corp_name"}).find("a")["title"]
    print(company) 
  return jobs
  1. 회사 장소 뽑아내기
    get_text()를 통해 무난히 추출. 이제 함수로 정리 하는 것이 관건.
    saramin.py
def extract_saramin_jobs(last_page):
  jobs = []
  #for page in range(last_page):
  result = requests.get(URL)
  soup = BeautifulSoup(result.text, "html.parser")
  results = soup.find_all("div", {"class" :"area_job"})
  for result in results:
    title = result.find("h2", {"class" : "job_tit"}).find("a")["title"]
    location = result.find("div", {"class" : "job_condition"}).find("span").get_text()

  results2 = soup.find_all("div", {"class" : "area_corp"})
  for result2 in results2:
    company = result2.find("strong", {"class" : "corp_name"}).find("a")["title"]
  return jobs
  1. 마무리(함수로 정리 후 딕셔너리로 출력)
    saramin.py
import requests
from bs4 import BeautifulSoup

URL = "https://www.saramin.co.kr/zf_user/search/recruit?searchType=search&company_cd=0%2C1%2C2%2C3%2C4%2C5%2C6%2C7%2C9%2C10&searchword=%EB%B0%B1%EC%97%94%EB%93%9C&panel_type=&search_optional_item=y&search_done=y&panel_count=y&recruitPage=1&recruitSort=relation&recruitPageCount=40&inner_com_type=&quick_apply=&except_read="

def extract_saramin_pages():
  result = requests.get(URL)
  soup = BeautifulSoup(result.text, "html.parser")
  pagination = soup.find("div", {"class" : "pagination"})
  links = pagination.find_all("a")
  pages = []
  for link in links[:-1]:
    pages.append(int(link.string))
  max_page = pages[-1]
  return max_page

def extract_jobs(html):
  company = html.find("strong", {"class" : "corp_name"}).find("a")["title"]
  title = html.find("h2", {"class" : "job_tit"}).find("a")["title"]
  location = html.find("div", {"class" : "job_condition"}).find("span").get_text()
  return {"company" : company, "title" : title, "location" : location}


def extract_saramin_jobs(last_page):
  jobs = []

  for page in range(last_page):
    result = requests.get(URL)
    soup = BeautifulSoup(result.text, "html.parser")
    results = soup.find_all("div", {"class" :"item_recruit"})
    for result in results:
      job = extract_jobs(result)
      jobs.append(job)
    
  return jobs

main.py

from saramin import extract_saramin_pages, extract_saramin_jobs

last_saramin_page = extract_saramin_pages()

saramin_jobs = extract_saramin_jobs(last_saramin_page)

print(saramin_jobs)

마지막에 큰 기대 없이 공통 클래스값을 변경했다. 그래서 앞서 for문을 두 씩 돌리는 결과를 없애고 (item_recruit)로 클래스값을 바꿨더니 원하는 결과가 나왔다. 다음에는 최대한 통일해서 class 값 맞출 수 있는지 더 찾아보자. 플라스크 응용은 아직은 미숙해서 어려울 것 같다.

웹 크롤링 레플잇

profile
커피 내리고 향 맡는거 좋아해요. 이것 저것 공부합니다.

0개의 댓글