21.1.27

커피 내리는 그냥 사람·2021년 1월 27일
0

위코드 사전스터디

목록 보기
20/36

<인크루트 채용 사이트 백엔드 검색 결과 크롤링>

  1. requests, BeautifulSoup4 설치 후 기본 세팅 및 페이지 수 크롤링
import requests
from bs4 import BeautifulSoup

incruit_result = requests.get("https://search.incruit.com/list/search.asp?col=job&src=gsw*search&kw=%b9%e9%bf%a3%b5%e5&startno=0")

incruit_soup = BeautifulSoup(incruit_result.text, "html.parser")

paging = incruit_soup.find("p", {"class" : "sqr_paging sqr_pg_mid"})

pages = paging.find_all("a")

spans = []
for page in pages:
  spans.append(page.find("span"))
spans = spans[:-2]
# span으로 2~5페이지까지 나오고 마지막에 단추 두 개를 지웠음.

아무래도 모든 페이지에서 페이지 넘어가는 단추 전까지만 span값을 크롤링하게 되어 있나보다. 크롬에서 뭔가 바뀐 업데이트가 있는건가..

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

incruit_result = requests.get("https://search.incruit.com/list/search.asp?col=job&src=gsw*search&kw=%b9%e9%bf%a3%b5%e5&startno=0")

incruit_soup = BeautifulSoup(incruit_result.text, "html.parser")

paging = incruit_soup.find("p", {"class" : "sqr_paging sqr_pg_mid"})

links = paging.find_all("a")

pages = []
for link in links:
  pages.append(link.find("span"))
pages = pages[:-2]
max_page = pages[-2]
# 5페이지니까.
  1. 최대 페이지 수만큼 리퀘스트 하기
    (incruit.py)
import requests
from bs4 import BeautifulSoup

LIMIT = 20
URL = "https://search.incruit.com/list/search.asp?col=job&src=gsw*search&kw=%b9%e9%bf%a3%b5%e5&startno={LIMIT}"

def extract_incruit_pages():
  result = requests.get(URL)
  soup = BeautifulSoup(result.text, "html.parser")
  paging = soup.find("p", {"class" : "sqr_paging sqr_pg_mid"})
  links = paging.find_all("a")
  pages = []
  for link in links[:-2]:
    pages.append(int(link.string))
  max_page = pages[-2]
  return max_page

def extract_incruit_jobs(last_page):
  for page in range(last_page):
    result = requests.get(f"{URL}&startno={page*LIMIT}")
    print(result.status_code)

(main.py)

from incruit import extract_incruit_pages, extract_incruit_jobs

last_incruit_page = extract_incruit_pages()

extract_incruit_jobs(last_incruit_page)

오탈자 주의하자. 단순한 것에서 막힐 뻔했다. 다행히 200 은 잘 떴다.

  1. 직무 뽑아내기

일단 한 페이지만 직무를 뽑아냈다. 했던 것과 달리 마지막에 get_text()를 이용하니 beautifulsoup으로 태그 안에 내용을 추출하기 쉬웠다.

import requests
from bs4 import BeautifulSoup

LIMIT = 20
URL = "https://search.incruit.com/list/search.asp?col=job&src=gsw*search&kw=%b9%e9%bf%a3%b5%e5&startno={LIMIT}"

def extract_incruit_pages():
  result = requests.get(URL)
  soup = BeautifulSoup(result.text, "html.parser")
  paging = soup.find("p", {"class" : "sqr_paging sqr_pg_mid"})
  links = paging.find_all("a")
  pages = []
  for link in links[:-2]:
    pages.append(int(link.string))
  max_page = pages[-2]
  return max_page

def extract_incruit_jobs(last_page):
  jobs = []
  #for page in range(last_page):
  result = requests.get(f"{URL}&startno={0*LIMIT}")
  soup = BeautifulSoup(result.text, "html.parser")
  results = soup.find_all("p", {"class" : "detail"})
  for result in results:
    title_case = result.find("span", {"class" : "rcrtTitle"})
    title = title_case.find("a").get_text()
    print(title)
  return jobs

메인은 건들지 않았다.

  1. 회사 이름 뽑아내기.

여기서도 None 값이 나오긴 했다. 근데 이건 anchor 태그에 감싸지지 않은 텍스트라 아무래도 크롤링해도 결과가 none으로 나온다. 나머지는 if 문으로 str 처리 해줬다.

import requests
from bs4 import BeautifulSoup

LIMIT = 20
URL = "https://search.incruit.com/list/search.asp?col=job&src=gsw*search&kw=%b9%e9%bf%a3%b5%e5&startno={LIMIT}"

def extract_incruit_pages():
  result = requests.get(URL)
  soup = BeautifulSoup(result.text, "html.parser")
  paging = soup.find("p", {"class" : "sqr_paging sqr_pg_mid"})
  links = paging.find_all("a")
  pages = []
  for link in links[:-2]:
    pages.append(int(link.string))
  max_page = pages[-2]
  return max_page

def extract_incruit_jobs(last_page):
  jobs = []
  #for page in range(last_page):
  result = requests.get(f"{URL}&startno={0*LIMIT}")
  soup = BeautifulSoup(result.text, "html.parser")
  results = soup.find_all("p", {"class" : "detail"})
  for result in results:
    title = result.find("span", {"class" : "rcrtTitle"}).find("a").get_text()

  results2 = soup.find_all("h3")
  for result in results2:
    company = result.find("a")
    if company == result.find("h3"):
      company = str(result.find("h3"))
    else:
      company = str(result.find("a").string)
    print(company)
  return jobs
  • 장소만 출력하고 싶었는데 다른 자료랑 묶여 있다. 이 홈페이지 정말 쉽지 않다. 일단 직무랑 회사 이름만 출력하는 크롤링으로 마무리 지어야겠다.

(incruit.py)

import requests
from bs4 import BeautifulSoup

LIMIT = 20
URL = "https://search.incruit.com/list/search.asp?col=job&src=gsw*search&kw=%b9%e9%bf%a3%b5%e5&startno={LIMIT}"

def extract_incruit_pages():
  result = requests.get(URL)
  soup = BeautifulSoup(result.text, "html.parser")
  paging = soup.find("p", {"class" : "sqr_paging sqr_pg_mid"})
  links = paging.find_all("a")
  pages = []
  for link in links[:-2]:
    pages.append(int(link.string))
  max_page = pages[-2]
  return max_page

def extract_incruit_jobs(last_page):
  jobs = []
  for page in range(last_page):
    result = requests.get(f"{URL}&startno={page*LIMIT}")
    soup = BeautifulSoup(result.text, "html.parser")
    results = soup.find_all("p", {"class" : "detail"})
    for result in results:
      title = result.find("span", {"class" : "rcrtTitle"}).find("a").get_text()

    results2 = soup.find_all("h3")
    for result in results2:
      company = result.find("a")
      if company == result.find("h3"):
        company = str(result.find("h3"))
      else:
        company = str(result.find("a").string)
      print({company + ':' + title})
  return jobs

(main.py)

from incruit import extract_incruit_pages, extract_incruit_jobs

last_incruit_page = extract_incruit_pages()

extract_incruit_jobs(last_incruit_page)

아쉬운 점, 총평 : 홈페이지가 다른 홈페이지와 다른 구조(li로 묶여있는 등) 클래스화 되어 있지 않아서 배운 내용보다 조금 덜 시현했다.(직무, 회사 이름). 중간 중간에 회사 이름이 앵커가 들어가 있지 않은 것도 해결해볼 수 있어서 좋은 경험이었다.(if문 활용). 또한 string 말고도 get_text() 를 활용하여서도 문자열을 캐치할 수 있다는 것을 배웠다.

레플잇 링크

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

0개의 댓글