본문 바로가기
Python

파이썬 구글 이미지 자동 크롤링 하는 법 정리 (feat.2023)

by Queen2 2023. 2. 20.
728x90
반응형

여기저기 찾아보니 대부분 자료가 오래된 것들이라 없어진 library도 있고 해서 

크롤링 코드를 참조하면서 짜기가 힘들었는데요,,,, 고군분투하면서 만든 2023년 버전 구글 이미지 크롤링 코드 공유합니다! 특히 크롤링 했을 때 썸네일 크기의 이미지가 나와서 원본크기의 이미지 다운로드를 구현하느라 시간이 좀 걸렸네요 ㅜ

#구글 이미지 크롤링 #원본크기 크롤링 #동적 크롤링 

 

구글 코랩이나 아나콘다 노트북에서 처음 selenium을 쓴다면)

! pip install selenium
!apt -get update #Colab
!apt install chromium-chromedriver #Colabe에서 chromedriver사용이 가능하도록 합니다

 

webdriver 설정을 위한 기본 세팅

from selenium import webdriver
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service

driver = webdriver.Chrome(service=Service('C:/Temp/chromedriver'))

driver 설정 혹은 CSS SELECTOR 찾는 법은 아래 게시물을 참조해주세요

2023.02.17 - [Python] - 파이썬 Selenium을 사용한 크롤링 (2023버전) _ 태그 쉽게 찾기

 

from selenium.common.exceptions import NoSuchElementException, TimeoutException, NoSuchWindowException
from requests.exceptions import MissingSchema, InvalidURL
import os

url = "https://www.google.com/search?q="
backurl = "&source=lnms&tbm=isch&sa=X&ved=2ahUKEwiUkNOG76L9AhVION4KHaptAsMQ_AUoAXoECAEQAw&biw=1036&bih=674&dpr=1.25"

fname = ['g1','g2','g3','g4','g5','g6','g7','g8','g9','g10','g11','g12']
cname= ['윤아','유인나','아이유','손예진','태연','전지현','공효진','김희선','제니','이하늬','슬기','조이']

output_folder = "output" #폴더가 없다면 폴더를 만들어달라
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

driver = webdriver.Chrome() #크롬을 열고

for f, c in zip(fname,cname):
    fpath = f'{url}{c}{backurl}' #구글 이미지 페이지에서 검색어를 입력하고
    driver.get(fpath) #크롬으로 앞서 입력한 페이지로 이동(실행)
    cnt=0
    for i in range(2, 40): #40개 정도 이미지를 뽑아봅시다
        try:
            smallimg = driver.find_element(By.CSS_SELECTOR, f"#islrg > div.islrc > div:nth-child({i}) > a.wXeWr.islib.nfEiy > div.bRMDJf.islir > img")
            smallimg.click()  #이미지 검색을 처음나오면 작은 그림들 중 첫번째 클릭
            time.sleep(1) #로딩을 위해 잠시 텀을 주고
            bigimg = driver.find_element(By.CSS_SELECTOR, "#Sva75c > div.DyeYj > div > div.dFMRD > div.pxAole > div.tvh9oe.BIB1wf > c-wiz > div > div.OUZ5W > div.zjoqD > div.qdnLaf.isv-id.b0vFpe > div > a > img")
            src = bigimg.get_attribute("src") #이미지 클릭시 크게 뜨는 이미지 주소를 CSS로 찾아주고, 이미지 소스를 찾습니다
            if src and src.startswith('http'):
                try:
                    r = requests.get(src, verify=False) # verify =False는 보안 문제가 있을 수도 있어서 주의
                    img = Image.open(BytesIO(r.content)) #URL과 이미지 소스에 문제가 없으면 열어서 저장
                    cnt += 1
                    img.save(f"output/{f}_{cnt}.jpg")
                except Exception as e:
                    print(f"Error saving image: {e}")
                    pass
        except NoSuchWindowException:
            print("Window closed before script finished executing")
            break
        except (NoSuchElementException, TimeoutException) as e:
            print(f"Error finding image element: {e}")
            pass

driver.quit()

 

이 코드는 구글 이미지 검색창에서 검색어 검색 > 작은 이미지들 중 하나 클릭 > 원본 크기 큰 이미지 클릭 > url 문제가 없을 시 저장한 방식 format 대로 저장을 수행하는 코드입니다.

 

구글 이미지를 가져올 때 생각보다 이미지를 올린 사이트마다, 혹은 이미지 형식에 따라 error가 계속나서 예외처리를 하면서 pass 되도록 했습니다. 

728x90
반응형

댓글