<잡코리아 백엔드 파트 크롤링>

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

jobkorea_result = requests.get("http://www.jobkorea.co.kr/Search/?stext=%EB%B0%B1%EC%97%94%EB%93%9C")

jobkorea_soup = BeautifulSoup(jobkorea_result.text, "html.parser")

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

pages = pagination.find_all('li')

spans = []
for page in pages:
  spans.append(page.find("a"))
print(spans)

깔끔하진 않지만 2~10페이지까지 크롤링 하였다. 여기 홈페이지도 10페이지밖에 안 될 것 같다.

  1. 마지막 페이지 찾기
    마지막 페이지 찾기 중 2~10페이지를 모두 문자 및 숫자로 불러올 수 있는 법을 찾아서 수정했다.
import requests
from bs4 import BeautifulSoup

jobkorea_result = requests.get("http://www.jobkorea.co.kr/Search/?stext=%EB%B0%B1%EC%97%94%EB%93%9C")

jobkorea_soup = BeautifulSoup(jobkorea_result.text, "html.parser")

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

links = pagination.find_all('a')

pages = []
for link in links[:-1]:
  pages.append(link.string)
max_page = pages[-1]
print(max_page)
#마지막은 10
  1. 최대 페이지수 만큼 리퀘스트 하기
(jobkorea.py)
import requests
from bs4 import BeautifulSoup

LIMIT = 10
URL = "http://www.jobkorea.co.kr/Search/?stext=%EB%B0%B1%EC%97%94%EB%93%9C&tabType=recruit&Page_No={LIMIT}"

def extract_jobkorea_pages():
  result = requests.get(URL)
  soup = BeautifulSoup(result.text, "html.parser")
  pagination = soup.find("div", {"class" : "tplPagination"})
  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_jobkorea_jobs(last_page):
  for page in range(last_page):
    result = requests.get(f"{URL}&start={page}")
    print(result.status_code)

앞서 배웠던 것처럼 status코드로 200이 뜬 것을 확인. 그 전에 난 네비게이터블 에러는 위에서 link.string에 int를 안 써서 난 에러로 확인.("NavigableString", 태그 안에 글자를 판별해야 하는데 그게 숫자처리가 안 되어서 난 에러였던 것.)

(main.py)
from jobkorea import extract_jobkorea_pages, extract_jobkorea_jobs

last_jobkorea_page = extract_jobkorea_pages()

extract_jobkorea_jobs(last_jobkorea_page)
  1. 직무 목록 뽑아오기
(jobkorea.py)
import requests
from bs4 import BeautifulSoup

LIMIT = 10
URL = "http://www.jobkorea.co.kr/Search/?stext=%EB%B0%B1%EC%97%94%EB%93%9C&tabType=recruit&Page_No={LIMIT}"

def extract_jobkorea_pages():
  result = requests.get(URL)
  soup = BeautifulSoup(result.text, "html.parser")
  pagination = soup.find("div", {"class" : "tplPagination"})
  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_jobkorea_jobs(last_page):
  jobs = []
  #for page in range(last_page):
  result = requests.get(f"{URL}&start=1")
  soup = BeautifulSoup(result.text, "html.parser")
  results = soup.find_all("li", {"class" : "list-post"})
  for result in results:
    title = result.find("div", {"class" : "post-list-info"})
    title_anchor = title.find('a')
    if title_anchor is not None:
      title = str(title_anchor.string)
    else:
      pass
  return jobs

분명 비슷하게 했는데 아무래도 홈페이지 구조가 달라서 그런가.. none 값이 사라지질 않는다. 이건 하면서 해결해봐야겠다. 안 되면 패스..

  1. 회사 이름 뽑아오기.
(Jobkorea.py)
import requests
from bs4 import BeautifulSoup

LIMIT = 10
URL = "http://www.jobkorea.co.kr/Search/?stext=%EB%B0%B1%EC%97%94%EB%93%9C&tabType=recruit&Page_No={LIMIT}"

def extract_jobkorea_pages():
  result = requests.get(URL)
  soup = BeautifulSoup(result.text, "html.parser")
  pagination = soup.find("div", {"class" : "tplPagination"})
  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_jobkorea_jobs(last_page):
  jobs = []
  #for page in range(last_page):
  result = requests.get(f"{URL}&start=1")
  soup = BeautifulSoup(result.text, "html.parser")
  results = soup.find_all("li", {"class" : "list-post"})
  for result in results:
    company = result.find("a", {"class" : "name"}).string
    title = result.find("a", {"class" : "title"})
    if title is not None:
      title = str(title.string)
    else:
      pass
    print(company, title)
  return jobs

분명 이렇게 하면 회사 이름은 아무 이상 없이 뽑힌다. 회사 이름, 채용 직무가 anchor로 따로 묶여 있는데 정작 직무는 일부는 크롤링이 안 된다.

  1. 딕셔너리 형태로 출력해보기
(jobkorea.py)
import requests
from bs4 import BeautifulSoup

LIMIT = 10
URL = "http://www.jobkorea.co.kr/Search/?stext=%EB%B0%B1%EC%97%94%EB%93%9C&tabType=recruit&Page_No={LIMIT}"

def extract_jobkorea_pages():
  result = requests.get(URL)
  soup = BeautifulSoup(result.text, "html.parser")
  pagination = soup.find("div", {"class" : "tplPagination"})
  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("a", {"class" : "name"}).string
    title = html.find("a", {"class" : "title"})
    if title is not None:
      title = str(title.string)
    else:
      pass
    return {'title' : title, 'company' : company}


def extract_jobkorea_jobs(last_page):
  jobs = []
  #for page in range(last_page):
  result = requests.get(f"{URL}&start=1")
  soup = BeautifulSoup(result.text, "html.parser")
  results = soup.find_all("li", {"class" : "list-post"})
  for result in results:
    job = extract_jobs(result)
    jobs.append(job)
    
  return jobs
(main.py)
from jobkorea import extract_jobkorea_pages, extract_jobkorea_jobs

last_jobkorea_page = extract_jobkorea_pages()

jobkorea_jobs = extract_jobkorea_jobs(last_jobkorea_page)

print(jobkorea_jobs)

여기까진 이상 없이 구동중. "전부 회사 : 채용 이름(None 빼고)"으로 나오는 중

  1. 장소 넣기
(jobkorea.py)
def extract_jobs(html):
    company = html.find("a", {"class" : "name"}).string
    title = html.find("a", {"class" : "title"})
    if title is not None:
      title = str(title.string)
    else:
      pass
    location = html.find("span", {"class" : "loc long"})
    if location is not None:
      location = str(location.string)
    else:
      pass
    return {'title' : title, 'company' : company, "location" : location}

이것도 중간에 None값이 있는데 못 없앴다. 그냥 pass 처리하고 되는 것만 표기했다.

일단 결과는 {title : 일자리, company : 회사이름, location : 장소} 까지는 완성.(마지막에 #for~ 지우고 {page}처리 해서 전체 페이지 나오게 하기)
레플잇 주소

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

0개의 댓글