본문 바로가기
Programming Basics

[크롤링] 셀레늄(selenium) 활용 ; 구글 검색 후 이미지 다운로드

by ISLA! 2023. 8. 8.

셀레늄 활용하여 크롤링하기

webdriver-manager 라이브러리를 활용하여 크롬드라이버의 지속적 업데이트 없이 크롤링 하는 법

 

1. 라이브러리 설치

pip install webdriver-manager

 

2. 셀레늄 활용 기본 코드

  • 기본적으로 활용할 수 있는 코드는 아래 네 줄이다.
  • drivers.get() 에 웹사이트 주소를 입력하면 된다.
  • 셀레늄 코드 작성 팁 : 사람이 찾는것과 동일한 동선을 떠올리며 코드를 작성한다
# 아래 네 줄을 계속 활용하면 됨!
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
#driver.get('https://www.naver.com/')

 

⚡️예제 : 구글 이미지 다운로드해보기 

  • 필요한 라이브러리를 다운받는다. 
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

url = 'https://www.google.co.kr/imghp'
driver.get(url)
  • 이제 구글 창을 열고, '보라카이'를 검색한 다음, '검색'을 눌러 화면이 전환되는 것 까지 해보자.
  • 기본적으로 구글의 '검색창'이 어떤 구조하에 존재하는지를 꼼꼼히 확인해야한다.
    • 마우스 우클릭 > 검사 > 요소를 통해 확인
elem = driver.find_element(By.CSS_SELECTOR, "body > div.L3eUgb > div.o3j99.ikrT4e.om7nvf > form > div:nth-child(1) > div.A8SBwf > div.RNNXgb > div > div.a4bIc > textarea.gLFyf")
elem.send_keys("보라카이")    #구글 검색창에 보라카이 입력
elem.send_keys(Keys.RETURN) #엔터!
  • 스크롤을 내리며 이미지를 확인할 수 있도록 한다.
# 스크롤내리며 이미지 쭉 확인하기
elem = driver.find_element(By.TAG_NAME, "body")
for i in range(60):
    elem.send_keys(Keys.PAGE_DOWN)
    time.sleep(0.1)
  • 페이지를 내리며, 이미지 클릭해보기
# 이미지 클릭하기
try:
    driver.find_element(By.CSS_SELECTOR, "islmp > div > div > div > div.gBPM8 > div.qvfT1 > div.YstHxe > input").click()
    for i in range(60):
        elem.send_keys(Keys.PAGE_DOWN)
        time.sleep(0.1)
except:
    pass
  • 확인한 이미지 저장하기 
    • links 라는 리스트를 만들고, src 로 저장되어 있는 이미지를 저장하려고 한다.
    • src (이미지주소) 의 이미지를 찾아 터미널에 print 되게 한다
links=[] 
images = driver.find_elements(By.CSS_SELECTOR, "#islrg > div.islrc > div > a.wXeWr.islib.nfEiy > div.bRMDJf.islir > img")

for image in images:
    if image.get_attribute('src') is not None:
        links.append(image.get_attribute('src'))
        
print(' 찾은 이미지 개수:',len(links))
  • urllib.request 라이브러리를 import 한 후
  • 리스트의 인덱스 값과 내용을 차례로 리턴하는 enumerate 를 사용하여, 특정 경로에 이미지를 저장할 수 있도록 한다
  • 이미지가 저장되면 다운로드 완료 여부를 알 수 있는 멘트가 print 되도록한다.
  • 메모리 과부하 방지를 위해 driver.quit() 잊지말자!
import urllib.request

for k, i in enumerate(links):
    url = i
    urllib.request.urlretrieve(url, "./images/"+str(k)+".jpg")

print('다운로드 완료하였습니다.')
driver.quit()

👉 결과 확인

728x90