Programming/Python 웹 스크래퍼 만들기

Python selenium 활용해서 webscrapper 기초 제작 6

Security Engineer 2022. 12. 6. 21:00

5.17 Refactor

 

indeed.com 에서 python 을 검색했을때 url 을 보면, 

페이지를 바꿀 때마다 start 숫자가 바뀌는것을 알 수 있다.

2 페이지
3 페이지

2 페이지에는 start 가 10,

3 페이지에는 start 가 20 으로 바뀐다.

따라서 이 페이지의 pagination 은 여기 url 의 &start 부분이다.

 

기존의 아래 코드를 → def extract_indeedn_jobs(keword): 

pages = get_page_count('python')
for page in range(pages):
	base_url = 'https://kr.indeed.com/jobs?q='
	browser.get(f'{base_url}{keyword}')

아래 처럼 바꿔준다.

pages = get_page_count('python')
for page in range(pages):
	base_url = 'https://kr.indeed.com/jobs'
	browser.get(f'{base_url}?q={keyword}&start={page*10}')

위에서 확인했듯이 2 페이지는 start 가 10, 3 페이지는 start 가 20 이다.

range 를 사용해서 0,1,2,3,4... 이런식으로  page 가 반복되는데,

각 페이지에 10 을 곱해서 start 숫자를 맞춰준다.

 

1 페이지의 주소 요청시 0 * 10 = 0

2 페이지의 주소 요청시 1 * 10 = 10

3 페이지의 주소 요청시 2 * 10 = 20

4 페이지의 주소 요청시 3 * 10 = 30

5 페이지의 주소 요청시 4 * 10 = 40

 

위와 같은 주소 요청 start 번호를 맞춰준다.

 

< 채용공고의 개수와 각 페이지 주소요청시 request 되는 구인공고 정보를 출력하는 코드 >

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}')
    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',{'aria-label':'pagination'})  
    pages = pagination.select('div a')

    count = len(pages)+1

    for page in pages:
        if page['aria-label'] == "Previous Page":
            count = count - 1
        if page['aria-label'] == "Next Page":
            count = count - 1

    if count >= 5:
        return 5
    else:
        return count

def extract_indeed_jobs(keyword):
    
    options = Options()
    options.add_experimental_option('excludeSwitches', ['enable-logging'])
    browser = webdriver.Chrome(options=options)
    pages = get_page_count('python')
    print("Found", pages, "pages")
    results = []
    
    for page in range(pages):
        base_url = 'https://kr.indeed.com/jobs'
        final_url = f'{base_url}?q={keyword}&start={page*10}'
        print('Requesting', final_url)
        browser.get(final_url)
       
        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)
              
    return results  

jobs = extract_indeed_jobs('python')
print(jobs)

출력값:

 

1 페이지당 15개의 구인공고 정보가 올라오며,

5 페이지면 총 75개의 구인공고 정보가 올라온다.

 

마지막 코드

print(jobs) 를

print(len(jobs) 로 변경해서 출력한다.

75개의 구인공고 정보를 가져올수 있다는 것을 확인했다.

 

 

마지막으로 이전에 만들었던 extractors 폴더에 indeed.py 라는 새 파일을 만든다.

기존의 main.py 에서 작성했던 위 코드들을 복사하고

아래 jobs 와 print 코드를 삭제 후 indeed.py 파일에 붙여넣는다.

jobs = extract_indeed_jobs('python')
print(jobs)

 

최종적으로 main.py 는 비어있어야 하며

extractor 폴더 안에 indeed.py 와 이전에 만든 wwr.py (weworkremotely)파일이 있어야한다.

다음 게시물에서는 위 2개의 파일을 합쳐서 사용해본다.

댓글수0