<인크루트 채용 사이트 백엔드 검색 결과 크롤링>
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값을 크롤링하게 되어 있나보다. 크롬에서 뭔가 바뀐 업데이트가 있는건가..
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페이지니까.
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 은 잘 떴다.
일단 한 페이지만 직무를 뽑아냈다. 했던 것과 달리 마지막에 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
메인은 건들지 않았다.
여기서도 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() 를 활용하여서도 문자열을 캐치할 수 있다는 것을 배웠다.