goodthings4me.tistory.com
구글(google)에서 원하는 이미지 다운로드 해보기 (with 파이썬)
◆ 구글에 있는 엄청난 이미지들 중에서 저장해서 보고싶은 이미지를 다운로드 하는 방법
※ 참고 : 파이썬 셀레니움 이미지 크롤링으로 배우는 업무 자동화의 기초 https://youtu.be/1b7pXC1-IbE
먼저, 크롬 드라이버(Chrome Driver) 파일이 있어야 한다. (아래 링크 사이트에서 크롬 웹브라우저에 맞는 드라이버 다운로드)
https://chromedriver.chromium.org/downloads
◆ 이미지 다운로드 기본 (구글에서 이미지 1개 받아보기)
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('구름과 하늘')
구글에서 키워드로 검색한 모든 이미지를 가져올 수는 없지만, 오류가 없는 다 수의 이미지를 다운로드 받을 수는 있다.
※ 관련 포스팅
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
[python] 장고(django)로 게시판 만들어보기 (1) | 2021.10.11 |
---|---|
파이썬 datetime 모듈과 장고(django) 시간대(use tz) 설정 (0) | 2021.10.11 |
VS Code에서 파이썬 가상환경 만들기 (1) | 2021.10.11 |
파이썬 장고(django) 웹 프로그래밍 - 웹 페이지 만들기 # 1 (0) | 2021.09.23 |
티스토리 포스팅 글, 이미지 백업 (with 파이썬) (1) | 2021.09.06 |
댓글