<잡코리아 백엔드 파트 크롤링>
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페이지밖에 안 될 것 같다.
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
(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)
(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 값이 사라지질 않는다. 이건 하면서 해결해봐야겠다. 안 되면 패스..
(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로 따로 묶여 있는데 정작 직무는 일부는 크롤링이 안 된다.
(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 빼고)"으로 나오는 중
(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}처리 해서 전체 페이지 나오게 하기)
레플잇 주소