- 목표 내가 원하는 이미지를 웹사이트 검색을 통해 수집합니다.
- 사용 도구 : Selenium
- Selenium 사용 준비
Python crawling package인 Selenium을 사용하기 위해서는 두가지가 필요합니다.- Selenium에서 사용할 browser에 대한 드라이버 저는 Selenium 내에서 크롬을 사용할 것이기 때문에 chrome driver를 다운받습니다 그리고 나서 Selenium package가있는 python 경로로 옮겨줍니다.
- Geckodriver를 다운받습니다.
- 원하는 이미지 URL selector 획득정보를 가져오기 위해서 저는 크롬 개발자도구에서 element select하는 방법을 활용했습니다. (참고링크)
- 검색하고 나오는 이미지들에 대한 css selector검색 후 나오는 이미지 배열은 공통적으로 class=”rg_i”라는 프로퍼티를 동시에 가집니다.
- 클릭했을 때 나오는 원본 이미지의 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 입니다
- 저는 구글에서 이미지 검색 했을 때 바로 나오는 이미지가 아닌 원본 이미지를 가져오고 싶기 때문에 검색했을 때 나오는 이미지와 클릭후 나오는 원본 이미지에 대한 css selector 또는 Xpath경로가 필요합니다. 이 두가지를 활용하여 해당 Property의 태그 정보를 가져올 수 있기 때문입니다.
- Crawling code 작성
위에서 얻은 property 정보를 활용하여 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)
- 주의할 점
상업적인 목적으로 구글 사이트 크롤링 하는 것은 법으로 금지되어있습니다. 잘 확인하고 사용하시길 바랍니다.
카테고리 없음