1. Selenium
Selenium
- 웹 브라우저 자동화를 위한 오픈 소스 프레임워크
- 주로 웹 애플리케이션을 테스트하거나 특정 작업을 자동화하기 위해 사용
- 크롬, 파이어폭스, 엣지 등 여러 웹 브라우저에서 작동 가능
2. Why Selenium?
다양한 브라우저 지원
- 이전에는 특정 브라우저에서만 동작하는 테스트 도구들이 많아서, 여러 브라우저에서 작동을 시험해보려면 여러 테스트 도구들을 사용했어야 했음.
- 그러나 셀레니움은 크로스 브라우저 테스트가 가능해 개발자가 여러 브라우저 환경에서 동일한 결과를 확인할 수 있도록 해줌
언어 제약 해소
- 과거와 달리 셀레니움은 Python, Java, C# 등 여러 언어를 지원하여 개발자가 익숙한 언어로 프로그램을 작성할 수 있도록 함
웹 요소의 세밀한 제어
- 셀레니움은 HTML, CSS, JavaScript로 구성된 웹 애플리케이션의 모든 요소를 세밀하게 제어 가능
- 동적인 요소가 많거나 Ajax 기반의 웹 애플리케이션에서도 강력한 성능을 발휘
셀레니움을 활용한 주요 사례
- 웹 브라우저 자동화를 위한 프레임워크 답게 여러 자동화를 셀레니움을 통해 구현 가
1. UI/UX 테스트 자동화
- 사람이 직접 확인할 필요 없이 자동으로 버튼 클릭, 페이지 이동, 폼 작성 등을 테스트
2. 데이터 크롤링
- 정적 HTML을 넘어 동적 JavaScript 렌더링 데이터를 크롤링할 때 유용
3. 반복 작업 자동화
- 반복적인 폼 제출, 계정 생성 등의 작업을 자동으로 수행 가능
3. 셀레니움 사용 예시
- indeed라는 구직 사이트에서 구직 목록을 불러오는 프로그램
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
options = Options()
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
browser = webdriver.Chrome(options=options)
def get_page_count(keyword):
base_url = "https://kr.indeed.com/jobs?q="
browser.get(f"{base_url}{keyword}")
soup = BeautifulSoup(browser.page_source, "html.parser")
pagination = soup.find("nav", attrs={"aria-label": "pagination"})
pages = pagination.select("div a")
count = len(pages)
if count >= 5:
return 5
elif count == 0:
return 1
else:
return count
def extract_indeed_jobs(keyword):
pages = get_page_count(keyword)
print("Found", pages, "pages in indeed.com")
results = []
for page in range(pages):
base_url = "https://kr.indeed.com/jobs"
final_url = f"{base_url}?q={keyword}&start={page*10}"
print(f"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.replace(",", " "),
'location': location.string.replace(",", " "),
'position': title.replace(",", " ")
}
results.append(job_data)
return results