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

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

by 여비코기 2021. 5. 8.

이전 글에 이어 이번에는 Pool을 이용하여 multiprocessing를 이용하고, 여러개의 크롬 창에서 이미지들을 동시다발적으로 검색하는 방법에 대해 고안해보았다.

 

이전 글 : yobbicorgi.tistory.com/29

 

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

Python Selenium을 이용하여 구글(Google)에서 이미지를 검색한 후, 검색 목록에 나오는 썸네일 이미지들을 모아 다운로드 해보고자 한다. 해당 게시글은 3개의 시리즈로 게시될 예정이며, 시리즈 별

yobbicorgi.tistory.com

이전에는 Spyder상에서 직접 실행시킨 것과는 다르게 Anaconda Prompt상에서 실행하도록 할 것이다.

또한, 텍스트 파일에 검색하고자 하는 키워드들을 입력하고, 해당 텍스트 파일을 읽어들여 키워드로 검색하도록 하며, 한번에 최대 4개의 크롬 창을 띄워 검색하고 다운로드 하고자 한다.

 

즉, 이전과 달라진 점

1. Anaconda Prompt상에서 직접 실행

2. 텍스트파일에 검색어들을 입력하여 여러 단어 검색

3. 한번에 최대 4개의 크롬창을 이용

 

1. 필요 모듈 import

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys
import time
import os
import urllib.request
from multiprocessing import Pool
import pandas as pd

이전 방법과 크게 다르지 않으나 multiproccesing을 위한 Pool과 텍스트파일을 이용하기 위한 pandas가 추가되었다.

 

2. 키워드 호출

key=pd.read_csv('./keyword.txt',encoding='cp949',names=['keyword'])
keyword=[]
[keyword.append(key['keyword'][x]) for x in range(len(key))]

keyword라는 텍스트 파일에 나는 다음과 같은 8개의 키워드를 입력하였으며, 이를 각각 검색어로 이용할 것이다.

주걱
도마

가위
접시

그릇
세제

 

3. 폴더 형성 및 이미지 다운로드

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

 

def image_download(keyword):
    createFolder('./'+keyword+'_low resolution')
    
    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+"_low resolution/"+keyword+"_"+str(k)+".jpg")
        print(str(k+1)+'/'+str(len(links))+' '+keyword+' 다운로드 중....... Download time : '+str(time.time() - start)[:5]+' 초')
    print(keyword+' ---다운로드 완료---')
    
    driver.close()

이미지 다운로드 방법은 이전 게시글의 방법과 같으며 def를 적용하여 image_download라는 함수로 적용해주었다.

 

4. Multiprocessing 적용

if __name__=='__main__':
    pool = Pool(processes=4)
    pool.map(image_download, keyword)

processes=4로 설정하여 한번에 최대 4개 창을 동시에 활용할 수 있도록 적용하였다.

 

나는 해당 py파일을 img_down_low_fast.py로 저장하였다.

5. 실행

Anaconda Prompt상에서 py 파일이 존재하는 경로로 이동하여 img_down_low_fast.py 파일을 실행시켜 준다,

python img_down_low_fast.py

 

 

keyword 텍스트 파일 내 4개 키워드를 먼저 검색하는 모습
검색이 끝난 키워드들의 이미지를 다운받는 모습

 

해당 키워드들의 폴더가 잘 생성되었고, 이미지들도 각 폴더 안에 잘 저장되었다.

 

마지막으로 다음 영상에서는 현재 다운로드된 이미지들의 낮은 해상도를 극복하고자, 속도는 조금 느리지만 원본 이미지의 링크를 가져와 저장하고, 그 후 이미지들을 다운로드 받는 방법을 고안해보고자 한다.

 

#작동 영상

 

 

#full code

 

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys
import time
import os
import urllib.request
from multiprocessing import Pool
import pandas as pd

key=pd.read_csv('./keyword.txt',encoding='cp949',names=['keyword'])
keyword=[]
[keyword.append(key['keyword'][x]) for x in range(len(key))]

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

def image_download(keyword):
    createFolder('./'+keyword+'_low resolution')
    
    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+"_low resolution/"+keyword+"_"+str(k)+".jpg")
        print(str(k+1)+'/'+str(len(links))+' '+keyword+' 다운로드 중....... Download time : '+str(time.time() - start)[:5]+' 초')
    print(keyword+' ---다운로드 완료---')
    
    driver.close()

# =============================================================================
# 실행
# =============================================================================
if __name__=='__main__':
    pool = Pool(processes=4)
    pool.map(image_download, keyword)

댓글