본문 바로가기

Programming/[Python]

[Python] 구글에서 이미지를 수집 해보자 (selenium)

반응형

개발 환경 : Windows 10, VS Code, Python 3.7.11, Google Chrome Browser

기본적인 환경은 구축돼 있다는 가정 하에 진행하겠습니다.

 

1. 개발 환경 구축

우선 터미널에서 selenium을 인스톨 합니다.

 

pip install selenium

 

selenium을 사용하기 위해서는 chromedriver를 설치해야합니다.

우선 구글 크롬 버전을 확인합니다. (설정 > 크롬 정보)

 

크롬 버전 확인

 

https://chromedriver.chromium.org/downloads

 

ChromeDriver - WebDriver for Chrome - Downloads

Current Releases If you are using Chrome version 99, please download ChromeDriver 99.0.4844.35 If you are using Chrome version 98, please download ChromeDriver 98.0.4758.102 If you are using Chrome version 97, please download ChromeDriver 97.0.4692.71 For

chromedriver.chromium.org

위 링크에서 크롬 버전에 맞는 chromedriver를 설치하고, project를 진행할 폴더에 위치시킵니다.

 

코드 작성 전 폴더 내에 먼저 자리하고 있는 chromedriver

2. 작업 진행

조코딩님의 유튜브를 참고하였습니다. 전체적인 진행 및 자세한 설명이 궁금하신 분들은 유튜브를 참고하세요!

 

2.1. 필요한 모듈 불러오기

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request

query = input("검색어 입력 : ")

앞서 설치한 selenium과 time, request 를 불러옵니다. time의 경우 페이지 로딩 시간보다 빨리 입력을 할 경우 오류가 발생하기 때문에 대기시간을 주기 위해 불러왔습니다.

 

2.2. 구글 이미지 페이지에서 검색어 입력하기

driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=ko&ogbl")
elem = driver.find_element_by_name("q") # q는 검색어 입력창
elem.send_keys(query)	# 처음에 입력한 검색어를 받아온다.
elem.send_keys(Keys.RETURN)	# 입력한 검색어로 검색을 진행한다.

driver로 webdriver 클래스 객체를 생성하고 구글 이미지 url을 입력합니다.  다음 명령을 통해 검색 결과를 받게 됩니다.

 

2.3. 페이지 스크롤 끝까지 내리기

이미지를 크롤링 하기 전에 페이지 스크롤을 끝까지 내려 최대한 많은 이미지를 불러옵니다. (그렇지 않으면 맨 처음 불러온 이미지만 크롤링됩니다.)

# 스크롤 높이를 가져옴, javascript 실행 코드
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

다음 코드를 실행하여 갱신된 스크롤 높이와 이전 스크롤 높이가 같을 경우 반복문을 빠져나오도록 합니다.

 

 

2.4. 이미지 내려받기

images = driver.find_elements_by_css_selector(".rg_i.Q4LuWd")
cnt = 1
for image in images:
    try:
        image.click()
        time.sleep(IMAGE_LOAD_TIME)
        imgUrl = 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")
        urllib.request.urlretrieve(imgUrl, f'Google_{query}_{cnt:04d}.jpg')
        cnt += 1
    except:
        pass

driver.close()

구글 페이지 검사 기능을 활용해 이미지 요소를 확인하여 작성한 코드입니다.

cnt 넘버를 지정하여 자릿수에 맞게 파일명이 저장되도록 하였습니다.

 

 

2.5. 전체 코드 및 수집 결과

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request

query = input("검색어 입력 : ")

driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=ko&ogbl")
elem = driver.find_element_by_name("q")
elem.send_keys(query)
elem.send_keys(Keys.RETURN)

SCROLL_PAUSE_TIME = 1.5
IMAGE_LOAD_TIME = 1.5

# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    # Scroll down to bottom
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # 페이지 로딩 대기
    time.sleep(SCROLL_PAUSE_TIME)

    # Calculate new scroll height and compare with last scroll height
    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_css_selector(".rg_i.Q4LuWd")
cnt = 1
for image in images:
    try:
        image.click()
        time.sleep(IMAGE_LOAD_TIME)
        imgUrl = 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")
        urllib.request.urlretrieve(imgUrl, f'Google_{query}_{cnt:04d}.jpg')
        cnt += 1
    except:
        pass

driver.close()

전체 코드입니다. 해당 코드를 이용하여 최근 이슈인 우크라이나를 검색하였습니다. (ㅠㅠ 하루 빨리 평화가 찾아오길 바랍니다.)

코드 실행결과 약 500개의 이미지를 수집할 수 있었습니다.

이미지 수집 결과

 

3. 리뷰

유튜버 조코딩님의 영상을 참고하여 이미지 자동 수집기를 만들어 보았습니다. 해당 코드를 활용해 네이버, 다음 등 여러 사이트의 수집 크롤러를 만들어 볼 수 있겠습니다.

세번째 이미지부터 크롤링하는 것을 확인했는데 이 점은 수정해야할 필요가 있겠습니다.

 

4. 참고 자료

 

조코딩 유튜브

https://www.youtube.com/watch?v=1b7pXC1-IbE 

 

반응형