본문 바로가기
컴퓨터를 알아보자!/파이썬을 이용한 작품 모음집

파이썬 셀레니움을 활용하여 구글 이미지를 다운 받아보자! [ 소스코드 포함 ]

by 피너트 2021. 11. 7.
반응형

저는 게임과 일상 블로그를 올리지만, 어느날 관상 테스트를 만들고 싶다고 생각하여, 제 소스 노트겸, 여러분들께 정보를 공유해드리겠습니다.

 

만약 이 귀찮은 과정을 보고 싶지 않다면은 

 

11. 전체 구문

 

을 찾기 해서 들어가세요.

 

1. 개발 환경

python 3.9

chrome version 95.0.4638.69

 

2. 파이썬 다운로드

https://www.python.org/

 

Welcome to Python.org

The official home of the Python Programming Language

www.python.org

https://www.microsoft.com/store/productId/9P7QFQMJRFP7

 

Get Python 3.9 - Microsoft Store

The Python 3.9 interpreter and runtime.

www.microsoft.com

둘다 파이썬을 까는 겁니다. 실제 환경에서 쓰시려면 아래쪽도 깔아야 하니 참고 바랍니다.

 

3. 자신의 크롬 버전 알기 그리고 자신에게 맞는 chromedriver 찾기

먼저

chrome://version

 

을 주소창에 입력을 해주시면

 

첫번째 줄에

Chrome	95.0.4638.69 (공식 빌드) (64비트) (cohort: Stable)

이렇게 나와있는데, 이 것은 자신의 현재 크롬 버전을 말하는 것입니다. (chrome 옆에 있는 버전은 사용자에 따라서 다를 수가 있습니다. 필자는 21-11-07 기준)

 

다음에는 chromedriver 를 설치하는 방법입니다.

https://chromedriver.chromium.org/downloads

이 주소를 입력하시면은 

 

이러한 창이 뜰텐데, 위에서 여러분들의 크롬 버전과 비슷한 버전을 다운받아 주시면 됩니다. (95 버전은 95 버전으로 다운받아 주세요.)

 

그러면 아래와 같이 새 창이 열리는데,

현재 자신이 사용하고 있는 os 정보에 맞게 설치하시면 됩니다. (win64 는 win32와 동일하게 취급)

 

그 파일을 압축을 풀어주시면 됩니다.

 

4. 필요한 명령어
python -m venv selenium

selenium 이라는 가상환경 폴더를 만듭니다.

cd Scripts
activate

Scripts 라는 폴더에 들어가서, activate 라는 명령어를 실행시켜, 가상 환경을 셋팅합니다.

cd ..

Scripts 라는 폴더를 나갑니다.

 

이때, 파이썬 구문은 selenium 폴더에 넣어 주셔야 하며, 위에서 깐 chromedriver 도 압축을 풀고, 그 프로그램을 동일한 파이썬 구문과 동일한 경로로 옮겨주세요.

pip install selenium

selenium 이라는 패키지를 다운 받습니다.

 

5. 필요한 패키지 찾기
# 필요한 파이썬 패키지
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import urllib.request
import time
import os

selenium 작업과 이미지를 다운받는 패키지(urllib.request), 그리고 간격(time), 폴더 만드는 패키지(os)를 연결한다는 구문입니다.

 

6. 사용자가 원하는 폴더명과, 검색어 넣기
#사용자가 입력할 단어 ( 차례대로 폴더 이름 / 검색어 )
folder = input('사진을 저장할 폴더 이름을 지정해주세요 : ')
search = input('찾는 사진의 검색어를 지정해주세요 : ')

folder 라는 변수는 사용자가 원하는 폴더에다가 저장할 수 있도록 이름을 지정합니다.
search 라는 변수는 사용자가 원하는 검색어를 넣을 수 있습니다.

 

7. 폴더 만들기
#폴더 만들기
if not os.path.isdir(folder):
    os.mkdir(folder)

만약 folder 변수의 이름을 가진 폴더가 없다면은 그것을 만들어줍니다.

 

8. 구글 검색하기
#구글 실행 - 검색하기
driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=ko&authuser=0&ogbl")
google_image_search = driver.find_element_by_xpath('//*[@id="sbtc"]/div/div[2]/input')
google_image_search.send_keys(search)
google_image_search.send_keys(Keys.RETURN)

구글 이미지 주소를 불러서, search 라는 변수를 검색어에 입력시켜서 들어갑니다.

 

9. 스크롤 최대한 내리기
#구글 실행 - 스크롤 최대로 내리기
SCROLL_PAUSE_SEC = 1.5
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(SCROLL_PAUSE_SEC)
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        try:
            driver.find_element_by_css_selector(".mye4qd").click()
        except:
            break
    last_height = new_height

구글 이미지를 다운받는다 하면은 50개만 뜨고 나머지는 스크롤을 내려야 하는데, 이 구문이 없으면은 50개밖에 다운을 못 받습니다. 그래서 스크롤 줄 수를 아는 자바스크립트를 불러와서 끝까지 내립니다. 그리고 검색 더보기 버튼이 있으므로, 그것을 누르는 것도 추가를 했습니다.

이로써, 검색 결과가 없습니다. 까지 스크롤을 내립니다.

 

10. 구글 이미지 다운로드 하기
#구글 실행 - 파일에다가 사진 저장 (기본값 : .png)
google_image = driver.find_elements_by_css_selector(".rg_i.Q4LuWd")
count = 1
for image in google_image:
    try:
        image.click()
        time.sleep(2)
        google_image_url = driver.find_element_by_xpath('/html/body/div[2]/c-wiz/div[3]/div[2]/div[3]/div/div/div[3]/div[2]/c-wiz/div/div[1]/div[1]/div[2]/div/a/img').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.urlretrieve(google_image_url, f'./' + folder + '/' + search + " " + str(count) + ".png")
        count = count + 1
    except:
        pass
        
#구글 실행 - 종료
driver.close()

구글 이미지의 기본 클래스는 rg_i Q4LuWd 입니다. 그래서 이것을 .으로 한단어를 완성을 시킵니다.

그러면 작은 이미지를 눌러서, 크게 한 다음에 큰 사진을 다운을 받습니다.

만약 에러가 난다면은 구문이 알아서 넘겨줍니다.

파일 명은 검색어 {count}.png 입니다. 이 png 부분을 jpg 로 바꿔도 상관이 없습니다.

그리고 봇의 감지를 피하기 위해서 우회 구문도 남겨놨습니다.

다 실행이 됬다면은 셀레니움을 종료합니다.

 

11. 전체 구문
# 출처 : 피너트의 게임&일상 블로그
# 개발자 블로그 : https://game1ife-pnut.tistory.com/
# 수정, 2차 배포는 가능하지만, 판매는 금지합니다.

# 필요한 파이썬 패키지
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import urllib.request
import time
import os

#사용자가 입력할 단어 ( 차례대로 폴더 이름 / 검색어 )
folder = input('사진을 저장할 폴더 이름을 지정해주세요 : ')
search = input('찾는 사진의 검색어를 지정해주세요 : ')

#폴더 만들기
if not os.path.isdir(folder):
    os.mkdir(folder)

#구글 실행 - 검색하기
driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=ko&authuser=0&ogbl")
google_image_search = driver.find_element_by_xpath('//*[@id="sbtc"]/div/div[2]/input')
google_image_search.send_keys(search)
google_image_search.send_keys(Keys.RETURN)

#구글 실행 - 스크롤 최대로 내리기
SCROLL_PAUSE_SEC = 1.5
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(SCROLL_PAUSE_SEC)
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        try:
            driver.find_element_by_css_selector(".mye4qd").click()
        except:
            break
    last_height = new_height

#구글 실행 - 파일에다가 사진 저장 (기본값 : .png)
google_image = driver.find_elements_by_css_selector(".rg_i.Q4LuWd")
count = 1
for image in google_image:
    try:
        image.click()
        time.sleep(2)
        google_image_url = driver.find_element_by_xpath('/html/body/div[2]/c-wiz/div[3]/div[2]/div[3]/div/div/div[3]/div[2]/c-wiz/div/div[1]/div[1]/div[2]/div/a/img').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.urlretrieve(google_image_url, f'./' + folder + '/' + search + " " + str(count) + ".png")
        count = count + 1
    except:
        pass

#구글 실행 - 종료
driver.close()

 

다음에는 이 이미지를 가지고, 어떻게 관상 테스트를 만들 수가 있을지 알려드리겠습니다. 감사합니다!

반응형

 

반응형

댓글