programming/Python

[selenium] 구글 이미지 검색 후 이미지 파일 저장하기!

Jofresh 2023. 5. 4. 14:41
728x90
반응형

안녕하세요!

조신선입니다. 

 

오늘은 구글 이미지 검색을 하고, 검색한 결과값을 jpg파일로 저장하는 코드를 만들어 보겠습니다.

 

이 코드는 구글 이미지 검색을 통해 검색어에 해당하는 이미지를 원하는 개수만큼 저장하는 코드입니다. 검색어와 저장할 이미지 개수를 입력받아, 해당하는 이미지를 검색하여 urllib 모듈을 이용해 이미지를 저장합니다.

코드에는 webdriver 모듈을 이용하여 크롬 드라이버를 실행하고, 검색어를 입력하는 등의 작업을 수행하는 부분이 포함되어 있습니다. 또한, 이미지를 저장하기 위해 os 모듈과 urllib 모듈을 사용합니다.

위 코드를 실행하면 검색어와 저장할 이미지 개수를 입력하면 해당하는 이미지를 검색하여 ./images 폴더 내에 저장됩니다.

 


1. 필요한 라이브러리 임포트

from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request
import os

 

2. 검색 페이지 접속&검색어 입력

- 검색어를 미리 집어 넣을 수도 있지만, 이번에는 input 함수를 통해서 코드를 실행하면 "검색어를 입력하세요:" 라는 문구가 뜨고, 검색어를 입력하면 해당 검색어를 검색하도록 기능을 추가했습니다.

 

※ headless 옵션을 설정하는 이유와 방법은 아래 포스팅에 가면 자세히 설명되어 있습니다.

2023.04.21 - [개발/PYTHON] - [selenium] webdriver.ChromeOptions 활용 및 add_argument 메소드 예시

# headless 옵션 설정
options = webdriver.ChromeOptions()
options.add_argument("headless") # 크롬 창이 뜨지 않고 실행될 수 있도록 설정
driver = webdriver.Chrome(options=options)

# 검색 페이지 접속
driver.get("https://www.google.co.kr/imghp?hl=ko&tab=wi&authuser=0&ogbl")

# 검색어 입력
search_query = input("검색어를 입력하세요: ")
elem = driver.find_element(By.CSS_SELECTOR,"#APjFqb")
elem.send_keys(search_query)
elem.send_keys(Keys.RETURN)

 

3. 이미지 결과 수집

- 검색어와 마찬가지로 저장할 이미지개수도 input할 수 있도록 기능을 추가하였습니다.

- 최대 50장까지 가능합니다. 아래 완성코드에서는 스크롤을 내리는 방법도 가르쳐 드리겠지만, 사진을 50장 이상 저장할 필요성을 못 느껴서 그냥 주석처리 해두었으니 참고해주세요!

# 이미지 검색 결과 수집
images = driver.find_elements(By.CSS_SELECTOR,"#islrg > div.islrc > div > a.wXeWr.islib.nfEiy")
# 저장할 이미지 개수 입력 및 저장 디렉토리 생성
count = 1
desired_count = int(input("저장할 이미지 개수를 입력하세요: "))
save_dir = "./images"
if not os.path.exists(save_dir):
    os.makedirs(save_dir)

 

4. 이미지 저장 반복분

# 이미지 저장 반복문
for image in images:
    if count > desired_count: # 저장할 이미지 개수를 초과하면 종료
        break
    try:
        # 이미지 클릭 후 이미지 URL 추출
        image.click()
        time.sleep(2) #클릭후 이미지가 뜰 때 까지 2초간 기다립니다.
        imgUrl = driver.find_element(By.CSS_SELECTOR,"#Sva75c > div.DyeYj > div > div.dFMRD > div.pxAole > div.tvh9oe.BIB1wf > c-wiz > div.f2By0e > div.n4hgof > div.MAtCL.b0vFpe > a > img.r48jcc.pT0Scc.iPVvYb").get_attribute("src")
        
        # 이미지 저장
        opener=urllib.request.build_opener()
        opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
        urllib.request.install_opener(opener) #크롬드라이버&셀레니엄을 통해 웹페이지에 접속하면 로그가 뜨기 때문에, 일반 사용자가 접속한 것처럼 바꿔주는 코드
        save_path = os.path.join(save_dir,search_query + str(count) + ".jpg")
        urllib.request.urlretrieve(imgUrl, save_path)
        
        count = count + 1
    except:
        pass
    if count > desired_count:
        break

# 크롬 드라이버 종료
driver.quit()

 

5. 완성 코드

더보기
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request
import os

# headless 옵션 설정
options = webdriver.ChromeOptions()
options.add_argument("headless") # 크롬 창이 뜨지 않고 실행될 수 있도록 설정
driver = webdriver.Chrome(options=options)

# 검색 페이지 접속
driver.get("https://www.google.co.kr/imghp?hl=ko&tab=wi&authuser=0&ogbl")

# 검색어 입력
search_query = input("검색어를 입력하세요: ")
elem = driver.find_element(By.CSS_SELECTOR,"#APjFqb")
elem.send_keys(search_query)
elem.send_keys(Keys.RETURN)

# 이미지 검색 결과 수집
images = driver.find_elements(By.CSS_SELECTOR,"#islrg > div.islrc > div > a.wXeWr.islib.nfEiy")

# 저장할 이미지 개수 입력 및 저장 디렉토리 생성
count = 1
desired_count = int(input("저장할 이미지 개수를 입력하세요: "))

# 스크롤 계속 아래로 내리는 코드인데, 우리는 그렇게 많은 이미지가 필요 없음으로 그냥 주석처리했음.
# SCROLL_PAUSE_TIME = 1
# # Get scroll height
# last_height = driver.execute_script("return document.body.scrollHeight")
# while True:
#     # Scroll down to bottom
#     driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
#     # Wait to load page
#     time.sleep(SCROLL_PAUSE_TIME)
#     # Calculate new scroll height and compare with last scroll height
#     new_height = driver.execute_script("return document.body.scrollHeight")
#     if new_height == last_height:
#         try:
#             driver.find_element(By.CSS_SELECTOR,"#islmp > div > div > div > div > div.gBPM8 > div.qvfT1 > div.YstHxe > input").click()
#         except:
#             break
#     last_height = new_height

#./images폴더에 이미지 담기 if 폴더 없으면 만들어서 담기!

save_dir = "./images"
if not os.path.exists(save_dir):
    os.makedirs(save_dir)

# 이미지 저장 반복문
for image in images:
    if count > desired_count: # 저장할 이미지 개수를 초과하면 종료
        break
    try:
        # 이미지 클릭 후 이미지 URL 추출
        image.click()
        time.sleep(2)
        imgUrl = driver.find_element(By.CSS_SELECTOR,"#Sva75c > div.DyeYj > div > div.dFMRD > div.pxAole > div.tvh9oe.BIB1wf > c-wiz > div.f2By0e > div.n4hgof > div.MAtCL.b0vFpe > a > img.r48jcc.pT0Scc.iPVvYb").get_attribute("src")
        
        # 이미지 저장
        opener=urllib.request.build_opener()
        opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
        urllib.request.install_opener(opener)
        save_path = os.path.join(save_dir,search_query + str(count) + ".jpg")
        urllib.request.urlretrieve(imgUrl, save_path)
        
        count = count + 1
    except:
        pass
    if count > desired_count:
        break

# 크롬 드라이버 종료
driver.quit()

★참고로 css_selector 값은 주기적으로 바뀝니다. 그래서 잘 되다가 안 되는 경우에는 css_celetor값이 바뀌었는지 확인해주셔야 합니다.(네이버, 다음 등 다른 페이지도 마찬가지입니다. 웹크롤링을 막기 위해서 한번씩 바꿔주는 것 같아요)

 

아래 이미지처럼 사진을 클릭해서 들어가면 img 태그 안에 이미지가 저장되어 있는 웹페이지 주소를 품고 있는 src를 확인하고 우클릭 후 "copy selector"를 누르시면 됩니다. 

그리고 완성된 코드에 기존 selector 내용을 지우고 붙여넣어 주시면 끝!!

 

728x90
반응형