본문 바로가기

Python

파이썬 셀레늄 selenium 사용하여 이미지 한번에 크롤링 하는 방법 요기 ! + 여러 검색어 한 번에 크롤링 추가 코딩

반응형

1. 파이썬 가상 환경 세팅

2. Selenium 설치 및 브라우저 세팅

3. 구글 이미지 크롤링 코드 작성 

 

 

1. 파이썬 가상 환경 세팅  :    파이썬의 다양한 버전이 각각 다르게 요구되는 경우가 있다. 

여러개의 파이썬 버전을 다양한게 설치해 놓고 그때 그때 필요한 상황에서 가져와서 사용

venv 를 사용 한다

 

가상환경이 생성 된다. 

터미널 창에서 명령어를 입력하여 가상의 환경으로 들어가 줍니다.

위 이미지 Script 폴더 해당 루트로 들어가 

activate 명령으로 입력하여 활성화 시켜줍니다. 

가상 환경이 활성화 되면 selenium 이 생깁니다.

Script 폴더 에서 

가상 환경에서 pip install selenium 명령어로 설치해 줍니다. 

해당 드라이브 설치 전에 본인 chrome 버전을 확인해 줍니다. 

제일 근접한 버전으로 설치해 줍니다. 

 

해당 프로그램을 드래그 엔 드랍으로 Visual Studio selenium 가상 환경에 옮겨주겠습니다.

 

https://selenium-python.readthedocs.io/getting-started.html

 

2. Getting Started — Selenium Python Bindings 2 documentation

2.2. Example Explained The selenium.webdriver module provides all the WebDriver implementations. Currently supported WebDriver implementations are Firefox, Chrome, IE and Remote. The Keys class provide keys in the keyboard like RETURN, F1, ALT etc. from se

selenium-python.readthedocs.io

코드를 옮겨주고 -> import 부분에 에러가 발생사면 python 버전이 selenium으로 되어있는지 확인 ~

2023.03.08 - [C#] - C# 기초 문법 - TRY 예외처리

아랫부분 주석처리 해주고

driver = webdriver.Firefox()

Chrome()으로 바꿔 줍니다.

이제 다시 코드를 보겠습니다.

웹 페이지 의 요소를 찾는 코드 입니다.

반응형
elem = driver.find_element_by_name("q")  # 검색탕의 검색엔진을 찾는 코드

name("q")인 요소를 불러오는 명령어 입니다. 

개발자 모드 F12 키보드를 눌러 활성화 시킨 뒤 

빨간색 체크 부분을 누르면 웹페이지 하나하나 파트 별 코드 확인이 가능하다. 

구글 검색 엔진의 name = "q" 라서 위와 같이 코딩을 하면 해당 파트를 호출할 수 있다.

driver. find_ element_ ...... 다양한 문법이 존재한다. 

원하는 요소로 불러 낼 수 있다. 

elem  = 검색창

elem.clear()-> 한 번 검색창 청소를 해줍니다. 

elem.send_keys(검색어)-> 입력 원하는 검색어를 적습니다.

elem.send_keys(keys.RETURN) -> 해당 입력한 검색어로 검색 (엔터키)

 

위 코딩을 완료하고 실행하면 자동으로 

 이까지 실행 될겁니다. 

여러 개의 이미지를 한꺼번에 크롤링을 할려면

웹페이지 검색 화면은 끝까지 스크롤 해주어야 합니다.

SCROLL_PAUSE_TIME = 0.5

# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    # Scroll down to bottom
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # Wait to load page
    time.sleep(SCROLL_PAUSE_TIME)

    # Calculate new scroll height and compare with last scroll height
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

해당 코드를 사용합니다.

화면을 끝까지 자동으로 내려줍니다. 

저렇게 검색된 이미지에 대한 코드를 보면  

작은 이미지의 class가 rg_i Q4LuWd 로 다 동일한 것을 확인 가능하다.

작은 이미지가 다 클릭 되도록 코드를 짜면

driver.find_elements_by_css_selector(".rg_i.Q4LuWd").click()

find_element_by_css_selector 문법을 통해 해당 클래스 이미지를 클릭할 수 있다. 

이후 해당 이미지를 내려 받을려면 src를 알아야한다.

검색해보니 나온다. 

이렇게 코딩했다. 일단 한 검색어당 100개의 이미지만 다운 받게 해 놓았다. 

이미지를 클릭하고 3초의 여유를 둔 뒤 xpath 경로를  find_element_by_xpath 문법을 통해 찾아 경로를 받았다 . 

import urllib.request
f = open('00000001.jpg','wb')
f.write(urllib.request.urlopen('http://www.gunnerkrigg.com//comics/00000001.jpg').read())
f.close()

이걸 가져다가 쓰면됩니다.

 

나는 해당 검색어의 폴더를 만들어 해당 경로로 100개의 이미지가 저장되도록 코딩을 하였다.

그리고 한번에 여러가지의 검색어를 미리 입력해 놓고 루프문을 통해 

복수의 검색어 이미지 100개가 알아서 다운 받아지도록 추가 코딩을 하였다. 

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

search_words = ["워너원황민현", "엑소시우민", "강동원", "이종석", "이준기"]
driver = webdriver.Chrome()  #chromedriver.exe -> 가져 옴
driver.get("https://www.google.co.kr/imghp?hl=ko&tab=wi&authuser=0&ogbl")
# assert "Python" in driver.title
current_path = os.getcwd() # 저장 경로
for search_word in search_words:
    elem = driver.find_element_by_name("q")  # 검색탕의 검색엔진을 찾는 코드
    elem.clear()
    elem.send_keys(search_word)  # 해당 검색엔진에 글자를 입력
    elem.send_keys(Keys.RETURN)
    SCROLL_PAUSE_TIME = 1

    # Get scroll height
    last_height = driver.execute_script(
        "return document.body.scrollHeight")  #브라우져 높이를 확인 가능(자바스크립트)

    while True:
        # Scroll down to bottom
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);"
                              )  # 브라우져 끝까지 스크롤을 내리겠다.

        # Wait to load page
        time.sleep(SCROLL_PAUSE_TIME)  # 페이지 로딩 될 동안 웨잇

        # Calculate new scroll height and compare with last scroll height
        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")

    folder_name = search_word
    #해당 이미지 이름과 동일한 폴더 생성
    if not os.path.isdir(folder_name):  # 없으면 새로 생성하는 조건문
        os.mkdir(folder_name)

    count = 1
    for image in images:
        if count > 100:
            break
        try:
            image.click()
            time.sleep(3)
            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/div[1]/div[1]/div[2]/div/a/img").get_attribute("src")
            urllib.request.urlretrieve(
                imgUrl,
                folder_name + "/" + search_word + "." + str(count) + ".jpg")
            count = count + 1
        except:
            pass
    driver.back()

driver.close()

dirver.back()이  전 페이지로 돌아가주게 하고 

검색창을 다시 청소한 뒤 다음 검색어를 다운받는 방식이다.

반응형