ABC 부트캠프 데이터 탐험가 4기

[25 일차] ABC 부트캠프 : 머신러닝 팀 프로젝트(1)

marriina 2024. 8. 7. 16:16

16일차에 사용한 구글 이미지 자동 수집 활용 후 필요하지 않는 사진 삭제

# 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

# 2.폴더 생성 함수 선언
def createFolders(directory):
    try:
        if not os.path.exists(directory):
            os.makedirs(directory)
        
    except:
        print('Error: creating directory', directory)

# 3.키워드 입력 및 폴더 생성
keyword = '이디야 아이스'
createFolders('./'+keyword+'_img_download')
print('1.키워드 설정 및 폴더 생성 완료.....')

options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox') # 보안 기능인 샌드박스 비활성화
options.add_argument('--disable-dev-shm-usage') # dev/shm 디렉토리 사용 안함

service = ChromeService(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service,options=options)

# 4. 키워드 검색
print('2. 키워드 검색', keyword)
driver.get('https://www.google.co.kr/imghp?hl=ko')

# 검색창에 키워드 입력 - > 입력태그의 name 속성을 이용해서 요소 찾기
# 구글 이미지 검색 textarea name="q"
input_keyword = driver.find_element(By.NAME,'q')
input_keyword.send_keys(keyword)

# 검색(엔터) 키 전송
input_keyword.send_keys(Keys.RETURN)

# 5. 스크롤 내리기
# 대문자는 절대로 바꾸지 않는 변수
SCROLL_PAUSE_TIME = 3

# 댓글 수집을 위한 스크로 내리기
last_height = driver.execute_script('return document.body.scrollHeight')

while True:
    print('스크롤 중...', keyword)
    #스크롤을 최대로 내리기
    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)


# 6. 이미지 검색 개수 확인 및 다운로드
images =[]
links = []

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('4. 이미지 개수 확인....')
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)

print('5. 이미지 다운로드 시작')

for i, v in enumerate(links):
    
    try:
        url = v
        start = time.time()
        urllib.request.urlretrieve(url, './' + keyword + '_img_download/' + keyword + '_' + str(i + 1) + '.jpg')
        print(i+1,'/',len(links),keyword,'다운로드..Download time:',str(time.time()-start)[:5],'초')
        
    except:
        # 1/957  다운로드 실패..... 몇번째 사진이 다운에 실패 했는지확인
        print(i+1,'/',len(links),keyword,'다운로드 실패.....')
        pass