본문 바로가기

카테고리 없음

구글 이미지 정보 크롤링 하기

  1. 목표 내가 원하는 이미지를 웹사이트 검색을 통해 수집합니다.
  2. 사용 도구 : Selenium
  3. Selenium 사용 준비
    Python crawling package인 Selenium을 사용하기 위해서는 두가지가 필요합니다. 
    1. Selenium에서 사용할 browser에 대한 드라이버 저는 Selenium 내에서 크롬을 사용할 것이기 때문에 chrome driver를 다운받습니다 그리고 나서 Selenium package가있는 python 경로로 옮겨줍니다.
    2. Geckodriver를 다운받습니다.
  4. 원하는 이미지 URL selector 획득정보를 가져오기 위해서 저는 크롬 개발자도구에서 element select하는 방법을 활용했습니다. (참고링크)
    1. 검색하고 나오는 이미지들에 대한 css selector검색 후 나오는 이미지 배열은 공통적으로 class=”rg_i”라는 프로퍼티를 동시에 가집니다.
    2. 클릭했을 때 나오는 원본 이미지의 XPath클릭 후 이미지의 Xpath는 //*[@id="Sva75c"]/div[2]/div/div[2]/div[2]/div[2]/c-wiz/div[2]/div[1]/div[1]/div[2]/div/a/img 입니다
  5. 저는 구글에서 이미지 검색 했을 때 바로 나오는 이미지가 아닌 원본 이미지를 가져오고 싶기 때문에 검색했을 때 나오는 이미지와 클릭후 나오는 원본 이미지에 대한 css selector 또는 Xpath경로가 필요합니다. 이 두가지를 활용하여 해당 Property의 태그 정보를 가져올 수 있기 때문입니다.
  6. Crawling code 작성
    # 모듈 임포트
    import requests
    from selenium import webdriver
    from bs4 import BeautifulSoup
    from selenium.webdriver.common.by import By
    import time
    import json
    # 크롬 옵션
    chrome_options = webdriver.ChromeOptions()
    chrome_options.binary = '/Users/chemseok/miniforge/envs/epicone/bin/chromedriver'
    # 검색할 쿼리
    query = '루피'
    
    # 구글 드라이버에 루피 검색
    driver = webdriver.Chrome()
    driver.get(f'<https://www.google.com/imghp>')
    # Search my query
    search_bar = driver.find_element(By.NAME,"q")
    search_bar.send_keys(query)
    search_bar.submit()
    
    # 그림이 한번에 다 나오지 않으므로 스크롤 내리면서 이미지 활성화
    PAUSE_TIME = 2
    last_hegiht = driver.execute_script("return document.body.scrollHeight")
    new_height = 0
    while True :
        driver.execute_script("window.scrollBy(0,5000)")
        time.sleep(PAUSE_TIME)
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height - last_hegiht > 0 :
            last_hegiht = new_height
            continue
        else : 
            break
    
    # 아까 확인했던 property로 클릭할 image element list 획득
    img_elements = driver.find_elements(By.CSS_SELECTOR,".rg_i")
    # 해당 이미지들을 클릭하여 필요한 정보 획득
    img_rst = []
    for idx, img in enumerate(img_elements) :
        print(f"{query} : {idx+1}/{len(img_elements)} proceed...")
        try :
            img.click()
            time.sleep(PAUSE_TIME)
            img_element = driver.find_element(By.XPATH,'//*[@id="Sva75c"]/div[2]/div/div[2]/div[2]/div[2]/c-wiz/div[2]/div[1]/div[1]/div[2]/div/a/img')
            img_src = img_element.get_attribute('src')
            img_alt = img_element.get_attribute('alt')
            img_rst.append({
                'alt' : img_alt,
                'src' : img_src
            })
        except :
            pass
    driver.close()
    # 결과 확인
    print(img_rst)
    
    위에서 얻은 property 정보를 활용하여 Crawling을 code를 작성합니다.
  7. 주의할 점
    상업적인 목적으로 구글 사이트 크롤링 하는 것은 법으로 금지되어있습니다. 잘 확인하고 사용하시길 바랍니다.