2025년 2월 12일에 작성됨
크롤링
우선 프로젝트를 진행하기 위해서 Spring Boot를 기반으로 중고차 데이터를 크롤링하여 분석해야하기 때문에 파이썬을 이용한 크롤링 과정부터 진행을 하였다.
크롤링을 하는 과정에서 Selenium이라는 개념을 배웠다. Selenium이란 웹 애플리케이션을 자동화하고 테스트하기 위한 오픈 소스 프레임워크라고 한다.
결과적으로 나는 Selenium과 파이썬을 이용해서 크롤링을 하였다.
크롤링 환경설정
처음으로 크롤링을 위한 환경 설정이 필요하다.
pip install selenium pandas
pip install을 이용해 필수 라이브러리를 설치해준다.
brew install chromedriver
Mac 사용자의 경우 Homebrew를 사용하여 아래의 명령어를 실행하면 된다.
Windows 사용자의 경우 공식 Chromedriver 다운로드 페이지에서 다운로드 후, chromedriver.exe를 실행 폴더에 위치시켜야 한다고 한다.
Selenium을 이용한 기본 크롤링 테스트
아래 코드로 Selenium이 정상적으로 실행되는지 확인할 수 있다.
단순히 홈페이지를 열고 제목을 가져오는 코드를 실행해본다.
import time
from selenium import webdriver
# 크롬 브라우저 실행
driver = webdriver.Chrome()
# Example 사이트 열기 (크롤링 테스트용 사이트)
driver.get("https://www.naver.com/")
time.sleep(5) # 5초 대기 (브라우저가 바로 닫히지 않도록 설정)
# 현재 페이지 제목 출력
print(driver.title)
# 브라우저 종료
driver.quit()
이 코드가 정상적으로 실행된다면 Selenium이 제대로 설치된 것이다.
만약 오류가 난다면 Chromedriver의 경로 문제일 가능성이 크다.
국산차 대수 부터 크롤링 테스트
처음 크롤링을 시도할 때 어려웠던 부분은 페이지의 html구조를 뜯어보면서 어떤 테이블? 컨테이너를 기준으로 코드를 작성해야할지가 막막했다.
그런데 차분히 살펴보니 홈페이지의 자동차를 표현하는 html구조는 생각보다 어렵지 않았다.
특정 컨테이너 안에 자동차에 대한 정보들이 들어있는데 이를 크롤링하여 우리가 원하는 정보를 수집하면 되는 것이었다.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Selenium WebDriver 실행
driver = webdriver.Chrome()
# Wikipedia
driver.get("https://en.wikipedia.org/wiki/Web_scraping")
# 페이지 내 특정 요소가 로드될 때까지 대기 (최대 10초)
try:
heading = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, "h1")) # 위키피디아의 페이지 제목 가져오기
)
print("페이지 제목:", heading.text)
except:
print("요소를 찾을 수 없습니다.")
driver.quit()
(예제에서는 위키피디아로 대체)
위 코드는 단순히 홈페이지를 크롤링하여 위키피디아의 페이지 제목을 가져오는 코드이다.
이제 이를 확장하여, 크롤링을 진행할 수 있는 것이다.
크롤링 전체 코드
# 이 코드는 연구 및 개인 학습 목적으로 작성되었습니다.
# 크롤링을 실행하기 전에 웹사이트의 이용 약관 및 robots.txt 정책을 확인하세요.
import re
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import time
# Chromedriver 실행 파일 경로 설정
chromedriver_path = "your_chromedriver_path"
# Selenium 옵션 설정 (headless 모드 활성화)
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
# WebDriver 실행
service = Service(chromedriver_path)
driver = webdriver.Chrome(service=service, options=chrome_options)
# 예제 URL (실제 URL을 사용하지 않음)
base_urls = {
"국산차": "http://example.com/kor",
"수입차": "http://example.com/for"
}
# 차량 정보 수집 로직 (웹사이트에 따라 다를 수 있음)
cars = []
for car_type, base_url in base_urls.items():
for page in range(1, 3):
search_url = f"{base_url}&page={page}"
driver.get(search_url)
time.sleep(3)
try:
car_table = driver.find_element(By.ID, "sr_normal")
car_rows = car_table.find_elements(By.TAG_NAME, "tr")
print(f"[{car_type}] {page}페이지 로드 완료")
except:
print(f"[{car_type}] {page}페이지 로드 실패")
continue
for car in car_rows:
try:
name_element = car.find_element(By.CSS_SELECTOR, "td.inf")
raw_text = " ".join(name_element.text.strip().split("\n"))
car_model_match = re.search(r"^[가-힣A-Za-z0-9\s\-]+", raw_text)
car_model = car_model_match.group(0).strip() if car_model_match else "차종 정보 없음"
print(f"[{car_type}] 차종: {car_model}")
cars.append({"차량종류": car_type, "차종": car_model})
except Exception as e:
print("크롤링 오류 발생:", e)
driver.quit()
if cars:
print("크롤링 완료! 데이터 분석 가능")
else:
print("크롤링 실패")
아직은 나도 모르는 개념이 많지만 우선 크롤링에 성공한 코드를 작성해보았다.
맨 처음 크롤링했을 때에는 불필요한 정보들이 매우 많았다.
예를 들어 광고에 대한 텍스트까지 읽어들여서 깔끔한 데이터라고는 할 수 없었다.
그래서 위 코드에서 최종적으로 데이터 정제를 하여 필요한 정보만을 수집한 것이다.
위 크롤링에서 중요하다고 생각했던 포인트는 해당 사이트에서 html 구조가 어떻게 이루어져있는지, 그리고 데이터 정제를 어떻게 해야하는지가 관건이었던 것 같다.
나는 차량종류, 차종, 연식, 주행거리, 연료, 지역 이렇게 6가지 정보가 필요하다고 생각하여 정제하였다.
나중에는 이를 더 확장하여 MySQL을 사용해서 해당 데이터베이스에 저장하고 싶다.
주의점
- 이 코드는 교육 및 개인 학습 목적이며, 웹사이트 정책을 준수해야 한다.
- 크롤링을 실행하기 전에 반드시 robots.txt 파일을 확인해야 한다. 예를 들어, https://www.example.com/robots.txt 에 접속하면 크롤링이 허용된 경로와 금지된 경로를 확인할 수 있다.
'SIDE PROJECT > AUTOFINDER' 카테고리의 다른 글
회원가입, 보안 로직 개발 (1) | 2025.04.17 |
---|---|
CRUD 기능 구현 (0) | 2025.04.17 |
스프링 부트(Spring Boot)를 이용한 서버 구축 (0) | 2025.04.17 |
데이터 저장 방식의 변경 (MySQL 사용) (0) | 2025.04.17 |
사이드 프로젝트(AutoFinder) 개요 (0) | 2025.04.17 |