ABC 부트캠프
[14일차] ABC 부트캠프 - 데이터 크롤링 (구글 이미지 검색)
서루태
2024. 7. 11. 10:33
안녕하세오 서루태에오!

오늘은 지금껏 했던 글자 크롤링이 아닌
'이미지 크롤링'을 배워봐요
이미지 크롤링
먼저 크롤링을 준비 하기 전
크롤링 알고리즘을 적어볼게요
1. 파이썬 내부 코드로 구글 이미지 검색 창 띄우기
2. 찾고자 하는 이미지를 검색 창에 입력하고 엔터 누르기
3. 스크롤을 끝까지 내려서 이미지 데이터들을 불러오기
4. 이미지의 정보가 담겨있는 url 받아오기
5. 이미지 url로 이미지 다운로드 하기
여기서 문제!
이미지를 어디다 저장하지?
따로 이미지 파일을 만들고싶은데...
파이썬으로 파일 생성하기
#os 라이브러리 임포트
import os
# 폴더 생성 함수 선언
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')
이미지 키워드를 적고,
/키워드_img_download 라는 디렉토리에다가
파일을 만들어주는 코드에요
저는 꽃 이미지들을 검색해서 다운 받아볼게요
1. 파이썬 내부 코드로 구글 이미지 검색 창 띄우기
- 필수 라이브러리 임포트하기 -
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import urllib.request
import time
import os
import warnings
warnings.filterwarnings('ignore')
- 구글 이미지 검색 창 띄우기 -
options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox') #보안 기능인 샌드박스 비활성화
options.add_argument('--disable-dev-shm-usage')# dev/shm 디렉토리 사용 안함
service = ChromeService(execureable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options = options)
driver.implicitly_wait(3)
# 키워드 검색
print('2. 키워드 검색: ', keyword)
driver.get('https://www.google.co.kr/imghp?hl=ko')
2. 찾고자 하는 이미지를 검색 창에 입력하고 엔터 누르기
# 검색창 element 찾기 / 입력 태그들은 'name'이 중요
#구글 이미지 검색은 textarea name = 'q'
input_keyword = driver.find_element(By.NAME, 'q')
input_keyword.send_keys(keyword)
#입력 값 전송
input_keyword.send_keys(Keys.RETURN)
name 태그에 있는 검색창 요소를 찾고 .RETURN을 이용해서 엔터를 누른다고 생각해요
3. 스크롤을 끝까지 내려서 이미지 데이터들을 불러오기
# 스크롤 내리기
SCROLL_PAUSE_TIME = 3
last_height = driver.execute_script('return document.body.scrollHeight')
print('스크롤중...' + keyword)
while True:
driver.execute_script('window.scrollTo(0,document.body.scrollHeight);')
time.sleep(SCROLL_PAUSE_TIME)
new_height = driver.execute_script('return document.body.scrollHeight')
if new_height == last_height:
break
last_height = new_height
time.sleep(SCROLL_PAUSE_TIME)
스크롤 중간에 쉬는 시간을 함수로 지정해주고
끝까지 내려갈때까지 while문으로 반복해주세요
4. 이미지의 정보가 담겨있는 url 받아오기
# 이미지 검색 개수 확인 및 다운로드
links = []
images = []
#img 태그를 감싼 div 찾기 <div class='H8Rx8c'>
div = driver.find_elements(By.CLASS_NAME, 'H8Rx8c')
for i in div:
img_tag = i.find_element(By.CLASS_NAME, 'YQ4gaf')
images.append(img_tag)
print(' 이미지의 개수 확인...')
for image in images:
if image.get_attribute('src') != None:
links.append(image.get_attribute('src'))
print(keyword + '찾은 이미지 개수 : ', len(links))
time.sleep(SCROLL_PAUSE_TIME)
img 태그가 있는 클래스를 찾아서
img 링크 안의 값을 리스트안에 넣어주세요
5. 이미지 url로 이미지 다운로드 하기
print('이미지 다운로드 시작...')
for idx,val in enumerate(links):
try:
url = val
start = time.time()
urllib.request.urlretrieve(url,
'./'+keyword+'_img_download/'+keyword+'_'+str(idx)+'.jpg')
print(str(idx+1)+'/'+ str(len(links)) + keyword +'다운로드... Download time: '+str(time.time() - start)[:5] + ' 초')
except:
print(str(idx+1)+'/'+ str(len(links)) + keyword +'다운로드 실패...')
pass
print(keyword+'------ 다운로드 종료 ------')
이미지 url이 담긴 리스트의 인덱스와 값을 분리해서 받아줄게요
url로 다운로드 하는건 urllib.request.urlretrieve 라이브러리 함수를 사용했어요
그럼 다음과 같이 받아진답니다!
여기서 꽃 사진이 아닌 이미지들은
수작업으로 걸러주셔야 해요... 😢
구글 검색으로 찾은 꽃 사진을 다 긁어온거라
이 방법은 어느정도는 사람이 골라내줘야 한답니다!
여기서 더 나아가 AI를 이용하면
프로그램으로 전부 골라낼 수 있지 않을까요???
여러분의 상상력과 아이디어가 뛰어난 결과물을 만들어내요!
그러니 모두 Keep Going!
오늘은 여기까지!
다들 다음 글에서 봐요~~ 안농~~
