selenium을 사용한 크롤링

목록으로 돌아가기

selenium란?

이미지 설명

Selenium은 웹 애플리케이션을 테스트하고 자동화하기 위한 도구라고 한다. 주로 웹 애플리케이션의 기능을 자동으로 시뮬레이션하고 그 결과를 확인하기 위해 사용된다. 때문에 Selenium을 활용하여 html 파일에 접근하고 필요한 정보들을 웹 크롤링 할 수 있다.



selenium 구성요소

사용법

아래와 같이 먼저 패키지들을 참조해야한다. 필요시 pip 명령어를 통해 설치할 수 있다.

pip install selenium
from selenium import webdriver
from selenium.webdriver.chrome.service import Service # 등등 다양한 기능 필요에 맞추어 참조

크롬을 사용할 경우 크롬브라우저 설치뿐만 아니라 크롬드라이버도 설치해야하며 이는 버젼이 맞아야한다.
아래와 같은 명령어를 사용하여 크롬 드라이버를 찾고 창을 조절할 수 있다.

# 본인의 경로 설정해서 붙여두기
s = Service('/opt/homebrew/bin/chromedriver')
driver = webdriver.Chrome(service=s)
# 브라우저가 이미 최대화되어 있는지 확인
if driver.get_window_position()['x'] == 0 and driver.get_window_position()['y'] == 0 and driver.get_window_size()['width'] == driver.execute_script("return window.screen.availWidth") and driver.get_window_size()['height'] == driver.execute_script("return window.screen.availHeight"):
    print("창이 이미 최대화되어 있습니다.")
else:
    # 브라우저 창 최대화
    driver.maximize_window()

페이지 이동시 get 함수를 사용하여 이동할 수 있다.

driver.get('https://tumblbug.com/')

html 요소에 접하는 방법은 몇가지가 있다. 다음과 같다.

driver.find_element(By.CLASS_NAME, "test") # CLASS 이름으로 접근
driver.find_element(By.CSS_SELECTOR, '.test') # CSS로 접근
driver.find_element(By.XPATH, '//*[@id=test') #xpath로 접근

아래를 클릭의 예이다. 이렇게 하면 페이지 내에 test란 클래스 항목을 마우스 클릭할 수 있다.

btn = driver.find_element(By.CLASS_NAME, "test")
btn.click()

다음과 같이 자바스크립트 문법도 실행시킬수 있다

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

다음과 같이 텍스트의 값을 가져올 수 있다.

title = driver.find_element(By.XPATH, '//*[@id="test"]/div[1]/h1').text

다음과 같이 이미지 또한 가져올 수 있다.

image_element = driver.find_element(By.XPATH, '//*[@id="test"]/div/img')
image_url = image_element.get_attribute('src')

if image_url:
    # 이미지 다운로드
    image_response = requests.get(image_url, stream=True)
            
    # 이미지 저장 폴더 생성
    os.makedirs('images', exist_ok=True)
            
    # 이미지 저장 경로
    image_path = f'images/test.jpg'
            
    # 이미지 저장
    with open(image_path, 'wb') as f:
        shutil.copyfileobj(image_response.raw, f)
        print("이미지를 저장했습니다.")

간단한 크롤링 방법들 몇가지를 공부해 보았다. 같은 사이트의 상품 화면이더라도 조금씩 다르기 때문에 예외처리를 많이 해야함을 느꼈다.



author-profile
Written by 유찬영

댓글