• [web crawling] 파이썬 selenium 이미지 크롤링

    2020. 11. 25.

    by. seo.0

    '장롱' 이미지를 인식하는 딥러닝 구현을 위한 데이터셋 수집 과정이다.

    구글 이미지 웹사이트를 통해서 '장롱'과 '장롱이 아닌 이미지'들을 크롤링하였다.

     

    1. 가상환경 세팅

     

    Anaconda Prompt에서 selenium이라는 가상 환경을 생성하였다.

    conda create -n selenium
    conda activate selenium

    selenium이라는 이름으로 가상환경을 생성한 후, 활성화한다.

     

     

    2. selenium 설치 및 chromedriver 설치

     

    selenium 가상환경을 활성화하였으면 가상환경에 셀레니움을 설치한다.

     

    pip install selenium

    해당 가상환경에 selenium을 설치한다.

    셀레니움 설치가 완료되면 셀레니움으로 활용할 웹브라우저를 세팅해야한다.

     

     크롬 브라우저 활용을 위해 크롬 드라이버를 다운받는다.

    -> 크롬의 버전을 확인한 후, 해당 버전에 맞는 chromedriver를 다운받는다.

    (해당 정보는 크롬 브라우저의 오른쪽 점 세개 클릭 -> 도움말 -> Chrome 정보 창에서 확인할 수 있다.)

     

    필자의 버전은 87버전이므로 87버전의 chromedriver를 다운받는다.

    다운 받은 크롬 드라이버 파일을 selenium 가상환경 폴더에 저장하고, 크롤링 코드 작성을 위한 파일도 만들어준다.

     

    이렇게 하면 웹크롤링을 위한 모든 세팅은 완료된다.

     

    3. 구글 이미지 크롤링

     

    Jupyter Notebook에서 크롤링을 위한 코드를 작성하였다.

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    import time
    import urllib.request
    
    driver=webdriver.Chrome()  //크롬 브라우저를 받았으므로 chrome을 입력
    driver.get("https://www.google.co.kr/imghp?hl=ko&tab=wi&ogbl")  //구글 이미지 웹사이트
    
    /*find_element를 통해 어떤 특정 요소를 찾을 수 있음.
    여기서 find_element_by_name("q")는 name이 q로 지정된 검색창을 찾는 것을 의미한다.*/
    
    elem = driver.find_element_by_name("q")
    
    elem.send_keys("장롱")  //send_keys를 통해서 원하는 값을 입력할 수 있음
    elem.send_keys(Keys.RETURN)  //엔터키를 통해서 해당값을 전송하는 것을 의미

    여기까지 실행하면 검색창에 '장롱'을 검색하고 엔터를 친 후 이미지들이 나온 것까지 확인할 수 있다.

     

    이제 각각의 이미지들을 다운 받는 코드를 작성해보자.

    '장롱'으로 검색되는 모든 이미지들을 불러오기 위해 반복문을 통해서 스크롤을 내리는 코드도 함께 작성하였다.

    이후 모든 이미지들을 불러오면 맨 처음 이미지부터 차례대로 클릭하여 다운받도록 하였다.

    SCROLL_PAUSE_TIME = 1
    
    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_css_selector(".rg_i.Q4LuWd")  //작은 이미지들이 리스트 형식으로 나와있음
    count = 1
    for image in images:  //반복문을 통해서 개별 이미지를 뽑아서 다운받음
        try:
            image.click()
            time.sleep(2)
            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[1]/div[1]/div/div[2]/a/img').get_attribute("src")
            urllib.request.urlretrieve(imgUrl, str(count) + ".jpg")  //이미지 저장
            count=count+1
        except:
            pass
        
    driver.close()

    웹 크롤링 결과, 총 524장의 장롱이미지를 다운받았다.

    다운 받은 이미지들 중 모델 학습에 적절하지 않은 이미지들은 삭제하여 총 325장의 장롱 이미지를 모았다.

     

    위와 같은 웹크롤링 방식으로 침대, 책상 등의 장롱이 아닌 이미지들 또한 325장을 모아서 모델 학습을 위한 데이터셋을 완성하였다.

     

    댓글