<TIL - 0042> celenium으로 구글 이미지 크롤링

개발일지·2023년 6월 14일
0

til

목록 보기
42/43


정말 많은 구글링, 클론코딩, 등등 다해봤지만 안되는게 너무 많고
모르겠고, 미치겠고, 왜안되는지 못찾겠고~

하.지.만

엄 - 청난 시행착오끝에 크롤링 코드 완성

전체 코드

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By 
import os
import time
import urllib.request
# webdriver_manager는 오류가 계속 발생해서 사용하지않았음.

search_keys = ["검색키워드1", "검색키워드2", "..."]
# option도 오류가 계속 발생해서 사용하지않음.
driver = webdriver.Chrome()
driver.get('https://www.google.co.kr/imghp')
driver.implicitly_wait(time_to_wait=5) #time.sleep과의 차이점을 찾아보세요
driver.maximize_window() # 창 최대화
for search_key in search_keys:
    keyElement = driver.find_element(By.NAME, 'q') # 검색찾기(?)
    keyElement.clear() # 검색창 비우기 (다음 키워드 검색 위해서)
    keyElement.send_keys(search_key)
    keyElement.send_keys(Keys.RETURN)

# 휠 내리기에 대한 두가지 방법을 찾았는데 하나는 바디를 기준으로 휠을 내리는것.
# 다른 하나는 높이를 계산해서 끝까지 내리는 방법(?)
# 나는 첫번째 방법을 채택함

# 예전버전은 find_element_by_ID ~~ 였다면
# import By를 통해서 더 쉽게 조작할수있게 되었다(고 한다)
    bodyElement = driver.find_element(By.TAG_NAME, 'body')
    time.sleep(1)
    for i in range(30):
        bodyElement.send_keys(Keys.PAGE_DOWN)
        time.sleep(0.5)

    # SCROLL_PAUSE_TIME = 1.0

    # last_height = driver.execute_script('return document.body.scrollHeight')

    # 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:
    #         try:
    #             driver.find_element(By.CSS_SELECTOR,'.mye4qd').click()
    #         except:
    #             break
    #     last_height = new_height

    images = driver.find_elements(By.XPATH, '//*[@id="islrg"]/div[1]/div/a[1]')

    folder_name = search_key

    if not os.path.isdir(folder_name):
        os.mkdir(folder_name)
        
# 썸네일 이미지가 아니라 클릭시 나타나는 원본이미지를 크롤링하기 위한 코드
    image_count = 1    
    for image in images:
        image.click()
        time.sleep(0.25)

        heightImages = driver.find_element(By.CSS_SELECTOR, '#Sva75c > div.DyeYj > div > div.dFMRD > div.pxAole > div.tvh9oe.BIB1wf > c-wiz > div > div > div > div.n4hgof > div.MAtCL.PUxBg > a > img')
        realImage = heightImages.get_attribute('src')

        try:
            urllib.request.urlretrieve(realImage, folder_name + '/' + search_key + '.' + str(image_count) + '.jpg')
            image_count += 1
        except:
            pass

    driver.back()
driver.close()

처음엔 무작정 다른사람들이 작성한 코드들을 복사해서 붙여넣고 왜 안되는지 이유도 몰랐지만
계속 비교해보고 씹뜯맛즐 하다보니 내 입맛대로 코드가 완성되었다.
정답은 없겠지만 크롤링도 실력인듯

크롤링이 끝나면 디지털 라벨링을 시작해야한다..



profile
아닐지

0개의 댓글