파이썬과 Selenium을 이용한 네이버 이미지 크롤링하는 방법

파이썬과 Selenium을 이용한 네이버 이미지 크롤링하는 방법

이 글에서는 파이썬과 Selenium을 사용하여 네이버에서 이미지 검색 결과를 크롤링하는 방법에 대해 단계별로 알아봅니다. 크롬 드라이버 설치부터 이미지 저장까지 예제로 알아보겠습니다.

1. Chromedriver 설치

네이버 이미지를 크롤링하기 위해서는 Selenium을 사용하여 브라우저를 자동화해야 합니다. 이를 위해 Chrome 브라우저의 드라이버인 chromedriver.exe를 설치해야 합니다. 아래 URL 주소에서 최신 버전을 다운로드하고, 프로젝트 폴더에 chromedriver.exe 파일을 저장합니다.

2. 첫 번째 이미지 Selector 복사

네이버에서 원하는 검색어로 이미지를 검색한 후, 첫 번째 이미지의 selector를 복사합니다. 예를 들어, “강아지”를 검색했을 때 첫 번째 이미지의 selector는 다음과 같습니다.

첫 번째 이미지 Selector 복사
#main_pack > section > div.api_subject_bx._fe_image_tab_grid_root.ani_fadein > div > div > div.image_tile._fe_image_tab_grid > div:nth-child(1) > div > div > div > img

3. 첫 번째 이미지 클릭하여 큰 이미지 복사

첫 번째 이미지를 클릭하면 큰 이미지가 나타납니다. 이 큰 이미지의 selector를 복사합니다. 예를 들어, 큰 이미지의 selector는 다음과 같습니다.

첫 번째 이미지 클릭하여 큰 이미지 복사
body > div.ly_viewer._fe_image_viewer_root.viewer_open > div > div > div.viewer_wrap._fe_image_viewer_wrap > div.viewer_image._fe_image_viewer_main_image_wrap > div.image > img

4. 큰 이미지에서 다음 버튼을 클릭할 때 Selector 복사

큰 이미지에서 다음 이미지를 보기 위해 “>” 다음 버튼을 클릭해야 합니다. 이 버튼의 selector를 복사합니다. 예를 들어, 다음 버튼의 selector는 다음과 같습니다.

큰 이미지에서 다음 버튼을 클릭할 때 Selector 복사
body > div.ly_viewer._fe_image_viewer_root.viewer_open > div > div > div.viewer_wrap._fe_image_viewer_wrap > div.viewer_header._fe_image_viewer_header > a.btn_move.btn_next._fe_image_viewer_next_button

5. 루프를 돌면서 이미지 복사

이제 루프를 사용하여 여러 개의 이미지를 순차적으로 저장할 수 있습니다.

for i in range(2, number + 1):
    next_button_element = driver.find_element(By.CSS_SELECTOR, next_button_selector)
    driver.execute_script("arguments[0].click();", next_button_element)
    time.sleep(3)
    save_large_image(i, fileName)

6. 예제 코드

아래는 전체 과정을 포함한 예제 코드입니다.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
import requests
import time
import os

# 변수 설정
search = '강아지'  # 검색어 설정
fileName = 'dog_image'  # 저장할 파일 이름의 기본 이름 설정
number = 10  # 저장할 이미지 개수 설정

# 크롬 드라이버 경로 설정
chrome_driver_path = "./chromedriver.exe"  # chromedriver.exe가 있는 경로

# 이미지 저장 경로 설정
image_save_path = "./images"
if not os.path.exists(image_save_path):
    os.makedirs(image_save_path)

# 크롬 드라이버 설정
service = Service(chrome_driver_path)
driver = webdriver.Chrome(service=service)

def save_large_image(image_index, fileName):
    # 큰 이미지 URL 추출
    large_image_selector = "body > div.ly_viewer._fe_image_viewer_root.viewer_open > div > div > div.viewer_wrap._fe_image_viewer_wrap > div.viewer_image._fe_image_viewer_main_image_wrap > div.image > img"
    large_image_element = driver.find_element(By.CSS_SELECTOR, large_image_selector)
    large_image_url = large_image_element.get_attribute("src")
    
    # 이미지 다운로드 및 저장
    image_data = requests.get(large_image_url).content
    image_filename = os.path.join(image_save_path, f"{fileName}_{image_index}.jpg")
    with open(image_filename, 'wb') as file:
        file.write(image_data)
    print(f"Image {image_index} saved to {image_filename}")

try:
    # 네이버 이미지 검색 페이지로 이동
    driver.get(f"https://search.naver.com/search.naver?ssc=tab.image.all&where=image&sm=tab_jum&query={search}")
    
    # 페이지가 완전히 로드될 때까지 잠시 대기
    time.sleep(3)
    
    # 첫 번째 이미지를 클릭
    first_image_selector = "#main_pack > section > div.api_subject_bx._fe_image_tab_grid_root.ani_fadein > div > div > div.image_tile._fe_image_tab_grid > div:nth-child(1) > div > div > div > img"
    first_image_element = driver.find_element(By.CSS_SELECTOR, first_image_selector)
    first_image_element.click()
    
    # 잠시 대기 (이미지가 로드되는 시간 고려)
    time.sleep(3)
    
    # 첫 번째 이미지 저장
    save_large_image(1, fileName)
    
    for i in range(2, number + 1):
        # JavaScript를 사용하여 다음 버튼 클릭
        next_button_selector = "body > div.ly_viewer._fe_image_viewer_root.viewer_open > div > div > div.viewer_wrap._fe_image_viewer_wrap > div.viewer_header._fe_image_viewer_header > a.btn_move.btn_next._fe_image_viewer_next_button"
        next_button_element = driver.find_element(By.CSS_SELECTOR, next_button_selector)
        driver.execute_script("arguments[0].click();", next_button_element)
        
        # 잠시 대기 (다음 이미지가 로드되는 시간 고려)
        time.sleep(3)
        
        # 이미지 저장
        save_large_image(i, fileName)
    
finally:
    # 드라이버 종료
    driver.quit()

실행 결과 화면

예제 코드 실행 결과 화면

고려 사항

1. 이미지 URL은 변경될 수 있습니다. 네이버 검색 결과 페이지의 구조가 변경되거나 이미지의 위치가 변경되면, 크롤링 코드에서 사용하는 selector나 URL이 더 이상 유효하지 않을 수 있습니다. 따라서 최신 코드를 확인해야 됩니다.

2. 이미지 사용에 대한 라이센스 정보를 반드시 확인해야 합니다. 네이버에서 크롤링한 이미지는 저작권이 있을 수 있으며, 상업적 사용이나 무단 배포는 법적인 문제를 초래할 수 있습니다.

관련 이전 게시글

이 글이 도움이 되셨다면 공유 부탁 드립니다.

위로 스크롤