본문 바로가기

Python

셀레니움 selenium 파이썬으로 여러 개 이미지 한번에 다운받기 + 최신 문법 적용

반응형

https://smart-factory-lee-joon-ho.tistory.com/238

 

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

1. 파이썬 가상 환경 세팅 2. Selenium 설치 및 브라우저 세팅 3. 구글 이미지 크롤링 코드 작성 1. 파이썬 가상 환경 세팅 -> ? 파이썬의 다양한 버전이 각각 다르게 요구되는 경우가 있다. 여러개의

smart-factory-lee-joon-ho.tistory.com

예전에 조코딩을 보고 작성했던 글인데 

이제 셀레니움 문법이 좀 달라져서 

해당 문법을 기반으로 새로 작성해보았습니다.

 

<바뀐 코드>

from selenium.webdriver.common.by import By

driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_element(By.XPATH, '//button')
driver.find_element(By.ID, 'loginForm')
driver.find_element(By.LINK_TEXT, 'Continue')
driver.find_element(By.PARTIAL_LINK_TEXT, 'Conti')
driver.find_element(By.NAME, 'username')
driver.find_element(By.TAG_NAME, 'h1')
driver.find_element(By.CLASS_NAME, 'content')
driver.find_element(By.CSS_SELECTOR, 'p.content’)
driver.find_elements(By.ID, 'loginForm')
driver.find_elements(By.CLASS_NAME, 'content')

 

<전체 코드>

 
# 다음 통해서 진행
import os
import urllib.request
from selenium import webdriver
from selenium.webdriver.common.by import By
import time


# 저장 경로
current_path = os.getcwd()
# 원하는 검색어 및 이미지 개수
inserturl = input("검색어를 입력하세요 : ").strip()
img_num = input("원하는 이미지 개수 입력하세요 : ").strip()

driver = webdriver.Chrome('chromedriver')
driver.implicitly_wait(3)
driver.get(f'https://search.daum.net/search?w=img&q={inserturl}')
driver.maximize_window()

time.sleep(3)

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

# 검색 화면에서 스크롤을 끝까지 내려 관련 이미지 전부를 가져옵니다.
while True:
    # Scroll down to bottom
    # 브라우져 끝까지 스크롤을 내리겠다.
    driver.execute_script(
        "window.scrollTo(0, document.body.scrollHeight);")

    time.sleep(2)

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

    if new_height == last_height:
        try:
            # 화면 맨 아래 펼쳐보기 버튼 클릭
            search_more = driver.find_element(
                By.CSS_SELECTOR, ".expender.open")
            search_more.click()
            time.sleep(2)
        except:
            print("error")
            break
    last_height = new_height

# 복수 이미지 정보를 가져옵니다 list 형  * find_elements 를 사용합니다.
images = driver.find_elements(By.CSS_SELECTOR, ".thumb_img")

# 폴더 명도 검색어랑 동일하게 세팅 !
folder_name = inserturl
# 폴더 있는지 없는지 확인 후 생성
if not os.path.isdir(folder_name):
    os.mkdir(folder_name)
# 원하는 개수의 이미지만 다운로드 !
img_count = 1
for image in images:

    if img_count > int(img_num):
        break
    else:
        try:
            # 이미지 다운에 중요한 src 값 가져오기
            img_url = image.get_attribute('src')
            time.sleep(1)
            # urllib.request— URL 열기를 위한 확장 가능한 라이브러리  검색해서 사용법 숙지
            urllib.request.urlretrieve(
                img_url, folder_name + "/" + inserturl + "." + str(img_count) + ".jpg")
            img_count += 1
        except:
            print("error")
            pass
driver.close()

<검색 방식>

 
# 저장 경로
current_path = os.getcwd()
# 원하는 검색어 및 이미지 개수
inserturl = input("검색어를 입력하세요 : ").strip()
img_num = input("원하는 이미지 개수 입력하세요 : ").strip()

원하는 검색어 입력과 원하는 이미지 개수 입력

img_num은 str 으로 밑에서 형변환 예정

<브라우저>

driver = webdriver.Chrome('chromedriver')
driver.implicitly_wait(3)
driver.get(f'https://search.daum.net/search?w=img&q={inserturl}')
driver.maximize_window()

입력한 검색 값이 바로 세팅 url 의 str 값으로 추가 되어 들어갑니다. 

 

<화면 bottom 스크롤>

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

# 검색 화면에서 스크롤을 끝까지 내려 관련 이미지 전부를 가져옵니다.
while True:
    # Scroll down to bottom
    # 브라우져 끝까지 스크롤을 내리겠다.
    driver.execute_script(
        "window.scrollTo(0, document.body.scrollHeight);")

    time.sleep(2)

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

    if new_height == last_height:
        try:
            # 화면 맨 아래 펼쳐보기 버튼 클릭
            search_more = driver.find_element(
                By.CSS_SELECTOR, ".expender.open")
            search_more.click()
            time.sleep(2)
        except:
            print("error")
            break
    last_height = new_height

 

더 많은 량의 이미지 검색을 원할 때 해당 페이지 끝까지 스크롤 하는 코드 입니다.

소량의 이미지 다운시에는 시간을 잡아 먹을 수 있습니다.

 

<이미지 복수 정보 >

 
# 복수 이미지 정보를 가져옵니다 list 형  * find_elements 를 사용합니다.
images = driver.find_elements(By.CSS_SELECTOR, ".thumb_img")

복수 이미지 정보를 가져옵니다 list 형 변수이 * find_elements 를 사용합니다.

<다운받을 폴더 명 세팅 >

# 폴더 명도 검색어랑 동일하게 세팅 !
folder_name = inserturl
# 폴더 있는지 없는지 확인 후 생성
if not os.path.isdir(folder_name):
    os.mkdir(folder_name)

 

<이미지 url 추출 및 다운>

 
# 원하는 개수의 이미지만 다운로드 !
img_count = 1
for image in images:

    if img_count > int(img_num):
        break
    else:
        try:
            # 이미지 다운에 중요한 src 값 가져오기
            img_url = image.get_attribute('src')
            time.sleep(1)
            # urllib.request— URL 열기를 위한 확장 가능한 라이브러리  검색해서 사용법 숙지
            urllib.request.urlretrieve(
                img_url, folder_name + "/" + inserturl + "." + str(img_count) + ".jpg")
            img_count += 1
        except:
            print("error")
            pass

원하는 개수의 이미지만 다운하고 

이미지 src  값을 가져와서 폴더에 다운로드 

 

반응형