본문 바로가기
Python/Selenium & 크롤링

[python] 1/3__Selenium을 이용한 구글 검색 이미지 크롤링 하기

by 여비코기 2021. 5. 6.

Python Selenium을 이용하여 구글(Google)에서 이미지를 검색한 후, 검색 목록에 나오는 썸네일 이미지들을 모아 다운로드 해보고자 한다.

 

해당 게시글은 3개의 시리즈로 게시될 예정이며, 시리즈 별 발전 과정은 다음과 같다.

1. Spyder상에서 하나의 키워드를 검색하고, 비교적 저화질인 썸네일 이미지를 빠르게 다운로드 하는 법

2. Anaconda상에서 Pool를 이용하여 여러개 키워드를 동시 다발적으로 검색하고, 썸네일 이미지를 다운로드 하는 법

3. Anaconda상에서 여러개 키워드를 동시다발적으로 검색하고, 원본 고화질 이미지를 다운로드 하는 법

 

이 중 본 게시글에서는 하나의 키워드만을 사용해볼 것이다.

 

이미지 검색은 아래 Google 이미지 검색 페이지에서 수행하도록 한다.

www.google.co.kr/imghp?hl=ko

 

Google 이미지

 

www.google.co.kr

1. 필요 모듈 import

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

기본적으로 사용될 selenium의 webdriver, Keys

이미지 다운로드 시간을 보여줄 time

경로와 관련된 os

selenium을 통해 가져온 각 이미지들의 url을 불러들여 이미지를 저장하게 할 urllib.request를 import 한다.

 

def createFolder(directory):
    try:
        if not os.path.exists(directory):
            os.makedirs(directory)
    except OSError:
        print ('Error: Creating directory. ' +  directory)

또한 이미지들이 createFolder를 지정하여 이미지들이 저장될 폴더를 만들어 지게 할 것이다.

 

2. 키워드 입력 및 폴더 생성, selenium 실행

keyword='주걱'
createFolder('./'+keyword+'_img_download')

chromedriver = 'C://chromedriver.exe'
driver = webdriver.Chrome(chromedriver)
driver.implicitly_wait(3)

keyword에는 내가 검색할 검색어를 입력해준다. 나는 여기에 '주걱'을 검색하도록 하였다.

또한 createFolder를 통해 폴더를 생성하였다. 주걱 이미지는 주걱_img_download폴더에 저장된다.

마지막으로 크롬드라이버를 불러와 실행시킨다.

 

3. 키워드 검색

print(keyword, '검색')
driver.get('https://www.google.co.kr/imghp?hl=ko')

Keyword=driver.find_element_by_xpath('//*[@id="sbtc"]/div/div[2]/input')
Keyword.send_keys(keyword)

driver.find_element_by_xpath('//*[@id="sbtc"]/button').click()

크롬드라이버가 구글 이미지 검색창에 접근하면, 검색창에 '주걱'을 입력하고 검색을 누르도록 명령한다.

 

※selenium에서 각 요소를 찾는 법은 이전 게시글인 '티스토리 게시글 자동 업로드'에서 확인 할 수 있다.

yobbicorgi.tistory.com/21

 

[python] Selenium을 이용한 티스토리 로그인 & 게시글 자동 작성

이번에는 Selenium과 크롬 웹드라이버('chromedriver')를 이용해 자동으로 티스토리에 로그인을 하고, 간단한 게시글을 작성하는 코드를 짜보고자 한다. 우선 자신이 사용하고 있는 크롬 버전과 맞는 c

yobbicorgi.tistory.com

 

 

아래는 주걱의 검색 결과이다.

 

주걱 구글 검색 결과

 

print(keyword+' 스크롤 중 .............')
elem =  driver.find_element_by_tag_name("body")
for i in range(60):
    elem.send_keys(Keys.PAGE_DOWN)
    time.sleep(0.1)
    
try:
    driver.find_element_by_xpath('//*[@id="islmp"]/div/div/div/div[1]/div[4]/div[2]/input').click()
    for i in range(60):
        elem.send_keys(Keys.PAGE_DOWN)
        time.sleep(0.1)
except:
    pass

PAGE_DOWN키를 통해 검색결과가 더 많이 나올 수 있도록 스크롤해주며, 지속적으로 스크롤 하다 보면 아래 '결과 더보기' 버튼이 생성된다.

해당 버튼이 나오면 'driver.find_element_by_xpath('//*@id="islmp"]/div/div/div/div[1]/div[4]/div[2]/input').click()' 를 통해 눌러주도록 한다.

 

결과 더보기 버튼

4. 이미지 검색 개수 및 다운로드

 

links=[]
images = driver.find_elements_by_css_selector("img.rg_i.Q4LuWd")
for image in images:
    if image.get_attribute('src')!=None:
        links.append(image.get_attribute('src'))

print(keyword+' 찾은 이미지 개수:',len(links))
time.sleep(2)

구글 이미지 검색 결과의 각 썸네일 이미지 class nameimg.rg_i.Q4LuWd이다. 따라서 driver.find_elements_by_css_selector를 통해 해당 class name을 가진 모든 요소를 images로 불러온다.

 

또한, 구조를 살펴보면 각 이미지는 src에 해당 이미지 링크를 가지고 있다. get_attribute를 통해 links라는 빈 리스트에 각 link들을 넣어주었다.

이미지의 class name과 src의 링크

for k,i in enumerate(links):
    url = i
    start = time.time()
    urllib.request.urlretrieve(url, "./"+keyword+"_img_download/"+keyword+"_"+str(k)+".jpg")
    print(str(k+1)+'/'+str(len(links))+' '+keyword+' 다운로드 중....... Download time : '+str(time.time() - start)[:5]+' 초')
print(keyword+' ---다운로드 완료---')

driver.close()

links에 들어있는 link를 urllib.request를 통해 하나씩 요청하고, 해당 이미지들을 '키워드_number'의 형태로 위에서 만들어준 폴더에 저장하도록 한다.

 

주걱을 검색하여 총 537개의 이미지를 찾았으며, 썸네일 1개의 이미지를 다운로드 하는데에는 약 0.1~0.2초가 소요되는 것을 확인 할 수 있다.

 

주걱 이미지들이 아주 잘 다운로드 되었다.

 

하지만 본 코드의 분명한 한계점은 원본 이미지가 아닌, 구글 검색결과의 썸네일 이미지만을 가져오기 때문에 사진의 해상도가 떨어진다는 단점이 존재한다.

 

다음 게시글에서는 여러개의 검색어를 한번에 찾는 법, 원본 사진을 다운로드 하는 법을 보완해 볼 것이다.

 

 

#작동 영상

 

#full code

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

def createFolder(directory):
    try:
        if not os.path.exists(directory):
            os.makedirs(directory)
    except OSError:
        print ('Error: Creating directory. ' +  directory)



keyword='주걱'
createFolder('./'+keyword+'_img_download')

chromedriver = 'C://chromedriver.exe'
driver = webdriver.Chrome(chromedriver)
driver.implicitly_wait(3)


# =============================================================================
# 구글 이미지 검색 접속 및 검색어 입력
# =============================================================================
print(keyword, '검색')
driver.get('https://www.google.co.kr/imghp?hl=ko')

Keyword=driver.find_element_by_xpath('//*[@id="sbtc"]/div/div[2]/input')
Keyword.send_keys(keyword)

driver.find_element_by_xpath('//*[@id="sbtc"]/button').click()


# =============================================================================
# 스크롤
# =============================================================================
print(keyword+' 스크롤 중 .............')
elem =  driver.find_element_by_tag_name("body")
for i in range(60):
    elem.send_keys(Keys.PAGE_DOWN)
    time.sleep(0.1)
    
try:
    driver.find_element_by_xpath('//*[@id="islmp"]/div/div/div/div[1]/div[4]/div[2]/input').click()
    for i in range(60):
        elem.send_keys(Keys.PAGE_DOWN)
        time.sleep(0.1)
except:
    pass


# =============================================================================
# 이미지 개수
# =============================================================================
links=[]
images = driver.find_elements_by_css_selector("img.rg_i.Q4LuWd")
for image in images:
    if image.get_attribute('src')!=None:
        links.append(image.get_attribute('src'))

print(keyword+' 찾은 이미지 개수:',len(links))
time.sleep(2)


# =============================================================================
# 이미지 다운로드
# =============================================================================
for k,i in enumerate(links):
    url = i
    start = time.time()
    urllib.request.urlretrieve(url, "./"+keyword+"_img_download/"+keyword+"_"+str(k)+".jpg")
    print(str(k+1)+'/'+str(len(links))+' '+keyword+' 다운로드 중....... Download time : '+str(time.time() - start)[:5]+' 초')
print(keyword+' ---다운로드 완료---')

driver.close()

 

 

 

 

 

댓글