[Python] selenium 를 이용한 이미지 크롤링

특정 이미지를 학습 시킬 일이 있어 이미지를 모으는 방법을 찾다가 알아낸 방법으로

 

이미지 크롤링이란 녀석이다.

 

홈페이지에 찾고 싶은 검색어를 입력하고 프로그램이 알아서 이미지들을 수집하는 것이라 보면 되겠다.

 

우선 참고한 곳의 블로그들 :

섭섭님 블로그

mjhuh263 님 블로그

 

 그럼 코드 부터!


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

def search_selenium(search_name, search_path, search_limit):
    search_url = "https://www.google.co.kr/imghp?hl=ko"
    driver = webdriver.Edge(executable_path='msedgedriver.exe')
    driver.get(search_url)
    elem = driver.find_element_by_name("q")
    elem.send_keys(search_name)
    elem.send_keys(Keys.RETURN)

    SCROLL_PAUSE_TIME = 1

    # Get scroll height
    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

    # Get each image URL and download it
    count = 1
    images = driver.find_elements_by_css_selector(".rg_i.Q4LuWd")

    for image in images:
        try:
            if search_limit == count:
                break
            image.click()
            time.sleep(3)
            img_url = driver.find_element_by_class_name("n3VNCb").get_attribute("src")

            urllib.request.urlretrieve(img_url, "Image/" + str(count) + ".jpg")
            count = count + 1
        except:
            pass

    # Close driver
    driver.close()


if __name__ == "__main__":
    search_name = input("검색하고 싶은 키워드 : ")
    search_limit = int(input("원하는 이미지 수집 개수 : "))
    search_path = "Your Path"
    search_selenium(search_name, search_path, search_limit)


다른건 위 주소들의 글들을 참조해서 별 문제가 없었는데 이미지 주소(img_url)를 가져오는 

img_url = driver.find_element_by_class_name("n3VNCb").get_attribute("src")

 

부분에서 계속 오류가 발생하거나 정상 동작을 하지 않았다. 

 

그래서 이미지들 마우스 우 클릭으로 검사에 들어가서 해당 부분을 복사하여 같은 부분을 

찾아내어 class 또는 xpath로 해당 이미지 주소를 가져와야한다.


이미지 종류에 따라 해당하는 함수를 사용하여야 한다.


난 바코드 이미지를 찾기위해 소스에서 find_element_by_class_name("n3VNCb")를 사용하였다.


저 부분에서 에러가 나거나 동작을 안하는 사람들은 저 부분을 구분할 수 있는것을 찾아 구현하면 문제가 해결될 것이다.

댓글

이 블로그의 인기 게시물

[Python] 파이썬에서 Opencv를 이용해 웹캠 영상 읽어오기 및 저장

[MFC] 에디트 컨트롤에 계속 문자열 추가하기(List log)

[Python] OpenCv를 이용하여 마우스 위치 가져오기