5.15 Pages
(Pages 개수 count 하는 함수 만들기)
첫 페이지 pagination(페이지 번호)에서 몇 개의 페이지가 있는지 알아내는 코드를 작성해본다.
페이지 번호가 총 5개, 다음을 넘기는 화살표가 1개 있는 코드를 확인할 수 있다.
nav role 이 navigation인 코드에서
div 가 3개만 있다면, 총 3페이지만 있다는 의미가 되며,
div 가 6개가 있다면, 총 5페이지에 1개의 화살표(다음페이지로 넘어가는) 가 있다는 뜻이 된다.
그럼 얼마만큼의 페이지를 스크래핑해야 하는지 알 수 있다.
프로그램 작동 방식이 바뀌어야 한다.
왜냐하면 이제 프로그램이 해야 하는 일은 2가지이기 때문이다.
( 총 얼마만큼의 페이지가 있는지 개수 세기, 각 페이지 안의 구인정보 가져오기 )
( 몇 개의 페이지를 가지고 있는지 알아낸 후, 각 페이지에 요청을 보내 데이터 추출 )
그럼 기존에 만들었던 구인정보를 가져오는 코드를 함수(function)로 만들어 넣어야한다.
def extract_indeed_jobs(keyword): → indeed 구인정보를 추출하는 함수를 만든다.
from requests import get
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def extract_indeed_jobs(keyword):
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
browser = webdriver.Chrome(options=options)
base_url = 'https://kr.indeed.com/jobs?q='
browser.get(f'{base_url}{keyword}')
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,'\n////////\n')
while(True):
pass
이후 페이지 개수를 추출하는 함수를 만든다.
def get_page_count(keyword): → 페이지를 카운트해주는 함수
< keyword 검색 시 페이지 개수를 카운트 해주는 코드 >
( 구인정보가 없는 검색어를 입력 시 div 가 없기 때문에 0 으로 표시해준다 )
from requests import get
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def get_page_count(keyword):
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
browser = webdriver.Chrome(options=options)
base_url = 'https://kr.indeed.com/jobs?q='
browser.get(f'{base_url}{keyword}')
results = []
soup = BeautifulSoup(browser.page_source,'html.parser')
pagination = soup.find('nav', attrs={'aria-label':'pagination'})
pages = pagination.find_all('div', recursive=False)
print(len(pages))
while(True):
pass
get_page_count('tyhon')
def extract_indeed_jobs(keyword):
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
browser = webdriver.Chrome(options=options)
base_url = 'https://kr.indeed.com/jobs?q='
browser.get(f'{base_url}{keyword}')
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,'\n////////\n')
while(True):
pass
출력값:
0
get_page_count('tyhon')
→ 구인정보가 없는 tyhon 검색 시 nav 안에 페이지를 표시하는 div 가 생성되지 않는다.
그러므로 0이 출력됨.
< keyword 검색 시 페이지 개수를 카운트 해주는 코드 > → 아래 코드의 경우에는 python 검색
( 페이지 카운트 해주는 div 5개 , 다음 페이지로 넘어가는 화살표 div 1개 = 총 6개)
from requests import get
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def get_page_count(keyword):
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
browser = webdriver.Chrome(options=options)
base_url = 'https://kr.indeed.com/jobs?q='
browser.get(f'{base_url}{keyword}')
results = []
soup = BeautifulSoup(browser.page_source,'html.parser')
pagination = soup.find('nav', attrs={'aria-label':'pagination'})
pages = pagination.find_all('div', recursive=False)
print(len(pages))
while(True):
pass
get_page_count('python')
def extract_indeed_jobs(keyword):
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
browser = webdriver.Chrome(options=options)
base_url = 'https://kr.indeed.com/jobs?q='
browser.get(f'{base_url}{keyword}')
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,'\n////////\n')
while(True):
pass
출력값:
6
keyword 를 nest 로 검색했을때 채용공고가 있었지만 0 으로 출력된다.
채용공고가 있는데 1 페이지만 나오면 똑같이 0 이 출력된다. ( 페이지 개수 세는 div 가 없기 때문에 )
채용공고가 있는지 없는지, 있으면 몇 개가 있는지 확인하고 싶고, 없으면 없다고 표시하기 위해
아래 코드로 변경해서 사용해도 된다.
< 구인정보 개수가 출력되는 코드 >
from requests import get
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def get_page_count(keyword):
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
browser = webdriver.Chrome(options=options)
base_url = 'https://kr.indeed.com/jobs?q='
browser.get(f'{base_url}{keyword}')
results = []
soup = BeautifulSoup(browser.page_source,'html.parser')
search_count = soup.find('div',class_='jobsearch-JobCountAndSortPane-jobCount')
if search_count == None:
print('검색 결과 없음')
else:
search_count2 = search_count.find('span')
print(search_count2.string)
pagination = soup.find('nav', attrs={'aria-label':'pagination'})
pages = pagination.find_all('div', recursive=False)
print(len(pages))
while(True):
pass
get_page_count('nest')
def extract_indeed_jobs(keyword):
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
browser = webdriver.Chrome(options=options)
base_url = 'https://kr.indeed.com/jobs?q='
browser.get(f'{base_url}{keyword}')
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,'\n////////\n')
while(True):
pass
출력값:
실제 nest 검색 시 채용 공고가 총 4개가 출력되었다.
< 구인정보가 없는 검색어 입력시 '검색결과 없음' 출력하는 코드 >
from requests import get
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def get_page_count(keyword):
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
browser = webdriver.Chrome(options=options)
base_url = 'https://kr.indeed.com/jobs?q='
browser.get(f'{base_url}{keyword}')
results = []
soup = BeautifulSoup(browser.page_source,'html.parser')
search_count = soup.find('div',class_='jobsearch-JobCountAndSortPane-jobCount')
if search_count == None:
print('검색 결과 없음')
else:
search_count2 = search_count.find('span')
print(search_count2.string)
pagination = soup.find('nav', attrs={'aria-label':'pagination'})
pages = pagination.find_all('div', recursive=False)
print(len(pages))
while(True):
pass
get_page_count('tyhon')
def extract_indeed_jobs(keyword):
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
browser = webdriver.Chrome(options=options)
base_url = 'https://kr.indeed.com/jobs?q='
browser.get(f'{base_url}{keyword}')
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,'\n////////\n')
while(True):
pass
출력값:
검색 결과 없음
0
< 검색 결과 있는지 없는지, 있으면 몇개의 구인정보가 올라왔는지 출력해주는 코드 >
search_count = soup.find('div',class_='jobsearch-JobCountAndSortPane-jobCount')
if search_count == None:
print('검색 결과 없음')
else:
search_count2 = search_count.find('span')
print(search_count2.string)
search_count = soup.find('div',class_='jobsearch-JobCountAndSortPane-jobCount')
→ class 이름이 jobsearch-JobCountAndSortPane-jobCount 인 div 를 search_count 변수에 저장.
( 검색결과 구인정보가 있는 경우에 class 이름이 jobsearch-JobCountAndSortPane-jobCount 인 div 안에 <span>채용공고4개</span> 이 존재한다. )
if search_count == None:
print('검색 결과 없음')
→ search_count 값이 없으면, '검색 결과 없음' 출력
(class 이름이 jobsearch-JobCountAndSortPane-jobCount 인 div 가 없으면 → 검색결과 구인정보 없음)
else:
search_count2 = search_count.find('span')
print(search_count2.string)
→ search_count 값이 있으면, <span>채용공고4개</span> 값을 search_count2 변수에 저장하고,
search_count2 의 텍스트만 출력한다.
(class 이름이 jobsearch-JobCountAndSortPane-jobCount 인 div 가 있으면→ 검색결과 구인정보 있음)
python 웹 스크래퍼 참고 강의
https://nomadcoders.co/python-for-beginners/lobby
selenium 참고 강의
'Programming > Python 웹 스크래퍼 만들기' 카테고리의 다른 글
Python selenium 활용해서 webscrapper 기초 제작 6 (0) | 2022.12.06 |
---|---|
Python selenium 활용해서 webscrapper 기초 제작 5 (0) | 2022.12.05 |
Python selenium 활용해서 webscrapper 기초 제작 3 (0) | 2022.12.01 |
Python None (0) | 2022.11.30 |
Python selenium 활용해서 webscrapper 기초 제작 2 (0) | 2022.11.29 |