
from requests import get
from bs4 import BeautifulSoup
from extractors.wwr import extract_wwr_jobs
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def get_page_count(keyword):
options = Options()
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
browser = webdriver.Chrome(options=options)
browser.get(f"https://kr.indeed.com/jobs?q={keyword}&limit=50")
soup = BeautifulSoup(browser.page_source, "html.parser")
pagination = soup.find('ul',class_="pagination-list")
if pagination == None:
return 1
pages = pagination.find_all("li", recursive=False)
count = len(pages)
if count >= 5:
return 5
else:
return count
def extract_indeed_jobs(keyword):
pages = get_page_count(keyword)
for page in range(pages):
options = Options()
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
browser = webdriver.Chrome(options=options)
browser.get(f"https://kr.indeed.com/jobs?q={keyword}&limit=50")
results = []
soup = BeautifulSoup(browser.page_source,"html.parser")
job_list = soup.find("ul", class_="jobsearch-ResultsList")
jobs = job_list.find_all("li", recursive=False)
for job in jobs:
zone = job.find("div", class_="mosaic-zone")
if zone == None:
anchor = job.select_one("h2 a")
title = anchor['aria-label']
link = anchor['href']
company = job.find("span", class_="companyName")
location = job.find("div", class_="companyLocation")
job_data = {
'link': f"https://kr.indeed.com{link}",
'company': company.string,
'location': location.string,
'position': title
}
results.append(job_data)
for result in results:
print(result)
print("\n/////////\n")
이제 프로젝트가 거의 막바지를 향해 가고 있다. 오늘 해 볼 것은 검색 결과의 페이지 수 만큼 정보를 받아들여와 저장해보는 것을 해 볼것이다.
우선적으로 알아둬야 할 것이 있다.

사이트에 가 보면 정보가 5페이지를 넘는 검색어일 경우, 5페이지 다음으로 화살표가 생겨 더 많은 페이지를 확인 해 볼 수 있도록 되어있다.
웹사이트를 스크래핑해서 화살표가 있는지를 확인 해 볼 수 있고, 화살표가 있다면 화살표가 나오지 않을때 까지 그 링크를 따라가서 나오는 웹사이트를 스크래핑하는 것 이다.
그렇게 되면 우리가 해야 할 일은 두 가지이다.
1. 일단 검색한 첫 페이지로 가야하고
2. 그 다음 몇개의 페이지를 가지고 있는지를 파악해야한다.
간편하게 하기 위해 1번 과정을 def get_page_count(keyword)라는 함수로, 2번 과정을 def extract_indeed_jobs(keyword)로 나눴다.
from requests import get
from bs4 import BeautifulSoup
from extractors.wwr import extract_wwr_jobs
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def get_page_count(keyword):
options = Options()
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
기존에 있던 keyword대신에 함수로 만들어서 argument로 keyword를 받아 올 수 있도록 변경했다.
pagination = soup.find('ul',class_="pagination-list")
if pagination == None:
return 1
pages = pagination.find_all("li", recursive=False)
count = len(pages)
if count >= 5:
return 5
else:
return count
pagination은 페이지 정보가 들어있는 "pagination-list" class를 찾아 저장했다. 만약 pagination이 None이면 스크래핑 할 페이지가 없다는 뜻이므로 return을 1로 해서 페이지수를 하나로 정의해준다.
pages는 pagination에서 바로 하위레벨에 있는 li들을 찾아준 값이고,
여기에 len을 씌워주면count는 우리가 찾는 페이지 수가 된다.
한번에 보여지는 최대 페이지 수가 5이므로, 만약 count가 5보다 크거나 같으면 5를 return 해주고, 그것이 아니라면 count를 return해준다.
나머지는 바로 count를 return 해 주면 된다.
def extract_indeed_jobs(keyword):
pages = get_page_count(keyword)
for page in range(pages):
get_page_count를 제외한 나머지 부분을 extract_indeed_jobs라고 정의했다.
추가로, get_page_count함수에서 return된 값을 pages에 넣어주고,
for loop를 돌려준다.
⦁ range 함수
여기있는 range는 순서 객체를 return 해주는 함수 list 단축어라 생각하면 된다. list 같은 걸 즉석으로 만들 수 있게 해준다.
예를 들어
for x in [1,2,3,4,5]
이럴 경우는 가능한데, 만약
for x in 5
이렇게 숫자만 있다면 어떻게 해야할까?
이럴때 쓰는 것이 바로 range 함수이다.
range(5)는 5 이내의 숫자를 범위로 사용할 수 있다.
즉
for I in range(5)
print(i)
이렇게 하면 결과는
0
1
2
3
4
이렇게 0부터 4까지 나오는 것을 확인 할 수 있다.
우리는 이 range함수를 활용해 for 문에 사용하겠다.
for page in range(pages):
그럼 page마다 for loop를 돌며 스크래핑 하게 될 것이다.