본문 바로가기
코딩 연습/코딩배우기

구글에서 원하는 이미지 다운로드 해보기 (with 파이썬)

by good4me 2021. 10. 11.

goodthings4me.tistory.com

 

구글(google)에서 원하는 이미지 다운로드 해보기 (with 파이썬)

 

◆ 구글에 있는 엄청난 이미지들 중에서 저장해서 보고싶은 이미지를 다운로드 하는 방법

※ 참고 : 파이썬 셀레니움 이미지 크롤링으로 배우는 업무 자동화의 기초 https://youtu.be/1b7pXC1-IbE

 

먼저, 크롬 드라이버(Chrome Driver) 파일이 있어야 한다. (아래 링크 사이트에서 크롬 웹브라우저에 맞는 드라이버 다운로드)

https://chromedriver.chromium.org/downloads

 

ChromeDriver - WebDriver for Chrome - Downloads

Current Releases If you are using Chrome version 95, please download ChromeDriver 95.0.4638.17 If you are using Chrome version 94, please download ChromeDriver 94.0.4606.61 If you are using Chrome version 93, please download ChromeDriver 93.0.4577.63 For o

chromedriver.chromium.org

 

 

◆ 이미지 다운로드 기본 (구글에서 이미지 1개 받아보기)

'파란하늘' 검색

 

 

good4me.co.kr

 

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from urllib import request
import time

driver = webdriver.Chrome()
driver.get('https://www.google.co.kr/imghp?hl=ko&ogbl')  # 구글 이미지 페이지
time.sleep(1) # 페이지 로딩시간

# 구글 검색란 선택 후 찾을 단어(키워드) 입력 & 엔터
elem = driver.find_element_by_name('q')  # class='gLFyf gsfi'
elem.send_keys('파란하늘')
elem.send_keys(Keys.RETURN)
time.sleep(1) # 페이지 전환시간

# 검색 결과, 이미지 페이지 상에서 클릭 시 큰 이미지 보기와 큰 이미지의 링크 주소 확인 
driver.find_elements_by_css_selector('img.rg_i.Q4LuWd')[0].click()
# <img class="rg_i Q4LuWd"> --> .rg_i.Q4LuWd or img.rg_i.Q4LuWd
time.sleep(1)  # 이미지 로딩 시간 주기

# 작은 이미지를 클릭한 페이지에서 큰 이미지를 선택 <img class='n3VNCb'>
big_image = driver.find_element_by_css_selector('img.n3VNCb')  
print(big_image)
# <selenium.webdriver.remote.webelement.WebElement 
# (session="c60d552e6ead7566bb625638934dec9f", element="a1ecafb7-acbe-4c87-83a7-8b7c586e3096")>

# 이미지 src 속성(URL)가져오기
bigImage_url = big_image.get_attribute('src')  
print(bigImage_url)
# http://ojsfile.ohmynews.com/STD_IMG_FILE/2018/0103/IE002266925_STD.jpg

# 이미지 다운로드
request.urlretrieve(bigImage_url, "image01.jpg")

driver.close()

 

 

◆ 반복문으로 처리해보기

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

def google_images(search_word):
    options = webdriver.ChromeOptions()
    options.add_argument('User-Agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36"')
    
    driver = webdriver.Chrome(options=options)
    driver.get('https://www.google.co.kr/imghp?hl=ko&ogbl')
    time.sleep(1)
    
    # 구글 검색란 선택 후 찾을 단어(키워드) 입력
    elem = driver.find_element_by_name('q')  # class='gLFyf gsfi'
    elem.send_keys(search_word)
    elem.send_keys(Keys.RETURN)
    time.sleep(1)
    
    # 브라우저에서 스크롤 높이를 가져와서 변수에 저장
    # 'scrollHeight'는 스크롤 시키지 않았을때의 전체 높이
    scroll_height = driver.execute_script("return document.body.scrollHeight")
    print(scroll_height)
    
    # 이미지 페이지 마지막까지 자동으로 스크롤하기
    while True:
        # 스크롤 높이(document.body.scrollHeight)까지 스크롤하기
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(1)  # 브라우저 로딩 시간
    
        # 스크롤 중단 지점에서 스크롤 위치(높이)를 파악하여 new_scroll_height에 저장하고,
        # 현재 스크롤 높이와 새로운 스크롤 높이가 같으면 끝까지 간 것이기 때문에 break 함
        new_scroll_height = driver.execute_script("return document.body.scrollHeight")
        
        if scroll_height == new_scroll_height:
            try:
                # 결과 더보기 버튼 처리 (버튼이 없을 경우 에러 발생하는 현상 예외 처리) - 2개 있음, xpath로 상세 처리함
                driver.find_element_by_xpath('//*[@id="islmp"]/div/div/div/div[1]/div[2]/div[2]/input').click()  # input class='mye4qd'
            except:
                break
        scroll_height = new_scroll_height
    print('스크롤 완료')
   
    # 이미지 저장 폴더 생성
    try:
        if not os.path.exists(search_word):
            os.makedirs('D:/googleImage/' + search_word)
    except Exception as err:
        print(err)
        pass
    
    # 작은 이미지 전체 가져오기
    images = driver.find_elements_by_css_selector('img.rg_i.Q4LuWd')
    print(f'images count : {len(images)}')
    
    cnt = 0
    for image in images:
        # 이미지 다운로드 시 발생할 수 있는 오류 예외처리
        try:
            image.click()
            time.sleep(1)
            
            # 'img.n3VNCb'가 여러 개 있기 때문에 더 세부적으로 지정 필요
            xpath_= '//*[@id="Sva75c"]/div/div/div[3]/div[2]/c-wiz/div/div[1]/div[1]/div[2]/div[1]/a/img'
            bigImage_url = driver.find_element_by_xpath(xpath_).get_attribute('src')
            file_ext = bigImage_url.split('.')[-1]
            
            # 이미지 확장자가 있는 것과 없는 것을 구분하여 저장
            if file_ext in ['jpg', 'jpeg', 'png', 'gif', 'bmp']:
                filename = str(time.time()) + '_' + os.path.basename(bigImage_url)  # 파일명만 추출
                    
                # 파일을 디렉토리에 저장
                request.urlretrieve(bigImage_url, 'D:/googleImage/' + search_word + '/' + filename)
                
                cnt += 1
                if cnt % 5 == 0:
                    print(f'검색어 "{search_word}"의 이미지 {cnt}장 저장 중...')            
            else:
                # print(bigImage_url)  # “data:image/jpeg;base64,/9j/4AAQSkZJR....”
                filename = str(time.time()) + '_.jpg'
                request.urlretrieve(bigImage_url, 'D:/googleImage/' + search_word + '/' + filename)
                cnt += 1
    
        except Exception as err:
            print(err)
        
        if cnt == 4:
            break
    
    print(f'검색어 "{search_word}"의 이미지 저장 완료!!')
        
    driver.close()

google_images('구름과 하늘')

 

구글에서 키워드로 검색한 모든 이미지를 가져올 수는 없지만, 오류가 없는 다 수의 이미지를 다운로드 받을 수는 있다.

 

※ 관련 포스팅

 

구글 이미지 검색 후 크롤링

'용산 차막힘' 관련 이미지를 검색하다가 구글 이미지 검색 후 다운로드하는 파이썬 크롤링 코드를 만들어 보기로 했다. 2021.10월에 이미지 구글링 관련 포스팅 글(구글에서 원하는 이미지 다운

goodthings4me.tistory.com

 

댓글