ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • selenium을 이용한 image down auto 실행
    Coding 2022. 7. 4. 22:29

    셀레니움을 통한 이미지를 다운로드해보기를 진행하고자한다.

    1.파이썬 가상 환경 세팅

    A. python 3.8 A(1.0), B(1.1)

    B. python 3.5 A(1.1), C(1.0)

    C. python 2.7 B(2.0), D(1.0)

    상황에 따른 호환되는 파이썬 버전이 다름

    파이썬 버전을 분리해 가상환경화 하여 선택할 수 있음

    1) 비주얼스튜디오 실행

    Python venv 가상 환경 구글 검색 > 공식홈페이지 > 명령어 확인

    python3 -m venv /path/to/new/virtual/environment

    명령어를 통해서 가상환경 구축 진행가능함

    여기서 본인 컴퓨터에 설치한 파이썬 이름을 확인해서 작성하고 일부 경로 수정

    /~ 이후는 생성할 파일명이기 때문에 본인이 만들 이름을 만들어줌

    python -m venv selenium

    폴더 생성
    폴더 생성

    명령어를 실행하면 C드라이브 user 폴더에 이렇게 생긴 걸 볼 수 있음 해당 폴더를 VScode에서 열어주고 여기에 가상환경 구성

    명령어

    cd Selenium\Scripts 입력

    activate 입력

    입력할때 현재 위치
    입력할때 현재 위치

    이제 셀레니움 설치

     

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

    1)셀레니움 설치

    Pip install selenium 입력

     

    2)셀레니움으로 활용할 브라우저 세팅

    구글 검색창 chromedriver 검색

    본인 버전과 맞는 설치파일 확인

    크롬 제일 우측 상단 탭 그림과 같은 점점점(점3개)을 눌러서

    크롬의 오른쪽 상단 점새게
    크롬의 오른쪽 상단 점새게
    도움말 > 크롬정보 > 버전확인
    도움말 > 크롬정보 > 버전확인

    도움말 > chrome 정보 눌러서 버전 확인, 버전과 운영체에 맞는 드라이버를 다운

    크롬 드라이버 다운
    크롬 드라이버 다운

    압축을 풀고 설치파일을 셀레니움 폴더 안쪽에 드래그하여 넣어줌

    크롬드라이버 위치
    크롬드라이버 위치
    뉴파일 생성
    뉴파일 생성

    뉴파일을 만들어서 이름을 google.py로 해줌 (chromedriver.exegoogle.py 가 같은 폴더에 있어야함)

    이제 세팅은 끝났으며 본격적으로 코드를 작성해줌

     

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

    구글 Python selenium example 검색

    공식홈페이지에 나와있는 셀레니움 예제를 활용

    셀레니움 예제를 활용
    셀레니움 예제를 활용

    하단에 버전이 나와 있는 부분을 눌러서 셀레니움 환경으로 바꿔주고

    버전위치
    버전위치

    위에 해당 코드를 가져와서 넣어줌

    셀레니움 예제 코드
    셀레니움 예제 코드
    pylint 문법검사 인스텐션 다운
    pylint 문법검사 인스텐션 다운

    또한 문법을 검사해주는 pylint를 설치해줌

    우선 위 2줄 제외 주석처리
    우선 위 2줄 제외 주석처리

    2줄 제외 주석처리해주고 쓰려고하는 웹브라우저 이름을 써주고 ()를 넣어준다음 아래 경로에 맞는지 확인한 후 명령어 python google.py 입력 (selenium 폴더에 google.py를 실행)

    그러면 웹페이지가 뜸

    주소를 바꿔줌 https://www.google.com/ 그래서 실행해주면 이렇게 구글 웹페이지가 뜨며 이미지를 검색해줄 것이기에 이미지를 눌러 들어가서 주소를 복사해줌

    이미지를 들어가줌
    이미지를 들어가줌
    주소 복사
    주소 복사

    찾고자하는 키워드를 검색함

    찾고자하는 검색어 입력
    찾고자하는 검색어 입력

    이 과정을 코드에 적용해줄 예정임

    개발자 모드 접속하여 검색창 태그 확인
    개발자 모드 접속하여 검색창 태그 확인

    검색창 요소를 확인해보면 검색창 요소가 name=q로 되어 있음


    >>여기서 주의

    iframe 요소란?

     

    iframe이란 inline frame의 약자로 쉽게 말해 페이지 안의 페이지임

     

    위에서 오류가 났던 이유는 iframe 페이지 안의 요소는 selenium이 참조하지 못 하기 때문임

     

    아래의 그림을 보시면 큰 빨간색 사각형으로 표시한 부분이 iframe 영역인데 이것을 잘 구분해서 찍어봐야함


     

    검색어를 입력하는 것까지 코드
    검색어를 입력하는 것까지 코드

    이렇게 하고 실행해봄

    실행시 누를 아이콘 위치
    실행시 누를 아이콘 위치
    코드가 실행되면서 웹페이지가 뜨고 검색어가 입력됨
    코드가 실행되면서 웹페이지가 뜨고 검색어가 입력됨
    검색어에 해당하는 이미지가 나옴
    검색어에 해당하는 이미지가 나옴

    이 과정까지 자동으로 진행되는 것을 확인할 수 있음

    이미지 개체를 확인해서 태그를 확인
    이미지 개체를 확인해서 태그를 확인

    F12로 개체 확인을 해보면 이미지를 보면 클래스가 동일한 문자로 다른 이미지도 적용되고 있는 것을 알 수 있음

    코드를 적용해주면

    driver.find_element

    는 해당 개체를 찾는 코드로 elementelements가 있는데 s가 없는 것은 한가지만을 찾음 이미지가 여러 개인 것을 리스트에 담기위해서는 s를 적용

    더보기

    여기서

    - 하나의 요소만 찾을 때 : find_element
    -
    여러 개의 요소만 찾을 때 : find_elements


    find_element _by_
    로 요소를 찾기

    들어갈 수 있는 것 :
    id / name / class_name / link_text / partial_link_text / tag_name / css_selector / xpath
    로 값을 찾기

    1) id
    로 접근 (여러 개 요소로 접근 불가!)
    driver.find_element_by_id('insert_btn')

    2) name
    으로 접근
    driver.find_element_by_name('movie')

    3) class
    명으로 접근
    driver.find_element_by_class_name('submit')

    4)
    링크가 달려 있는 텍스트로 접근
    driver.find_element_by_link_text('
    회원가입')

    5)
    링크가 달려 있는 엘레먼트에 텍스트 일부만 적어서 해당 엘레먼트에 접근
    driver.find_element_by_partial_link_text('
    가입')

    6)
    태그 이름으로 접근
    driver.find_element_by_tag_name('input')

    7) css
    셀렉터로 접근
    driver.find_element_by_css_selector('#account > div > a')

    8) xpath
    로 접근
    driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div/div[3]/form/fieldset/button/span[2]')
    //input[@id='username']

    9) xpath + tag
    driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div/div[3]/form/fieldset/button/span[2]').find_element_by_name('join')

    #xpath
    로 접근한 엘레먼트의 안에 join 이라는 속성을 가진 tag 엘레먼트에 접근

    10) tag_name + tag_name
    driver.find_element_by_tag_name('input').find_element_by_tag_name('a')

    출처: https://jennana.tistory.com/162 [제나나's 블로그:티스토리]

    클래스 명칭
    클래스 명칭
    클래스 태그 코드 입력
    클래스 태그 코드 입력

    실행해보니 오류가 나와서 코드를 찾아봄

    구글에 Python selenium elements example 검색하니 공식홈페이지에 예문이 나와있음

    셀레니움 버전 업데이트로 바뀐 코드
    셀레니움 버전 업데이트로 바뀐 코드
    클릭했을 때 큰 이미지 개채의 태그
    클릭했을 때 큰 이미지 개채의 태그

    이미지를 다운받을때 클릭하고 큰 이미지가 뜨면 이미지를 마우스 오른쪽 클릭해서 다른이미지로 저장하기 때문에 클릭했을 때 큰 이미지가 뜨는 창의 개채 태그를 확인해봄 그래서 코드에 적어줌

     

    driver.find_element(By.CSS_SELECTOR, ".n3VNCb.KAlRDb")

    와 같이 작성하고

    이제 이미지 src를 가져와서 다운로드를 하는 순서이기때문에

    src를 가져오는 방법은

    구글에 Python selenium img src 검색

    src 가져오는 방법
    src 가져오는 방법

    import unittest
    
    from attr import Attribute
    
    from selenium import webdriver
    
    from selenium.webdriver.common.keys import Keys
    
    from selenium.webdriver.common.by import By
    
    import time
    
     
    
    driver = webdriver.Chrome()
    
    driver.get("https://www.google.co.kr/imghp?hl=ko&ogbl")
    
    elem = driver.find_element(By.NAME, "q")
    
    elem.send_keys("황금알 낳는 거위를 찾아서")
    
    elem.send_keys(Keys.RETURN)
    
    driver.find_elements(By.CSS_SELECTOR, ".rg_i.Q4LuWd")[0].click()
    
    time.sleep(3)
    
    print(driver.find_element(By.CSS_SELECTOR, ".n3VNCb.KAlRDb").get_attribute("src"))

    위 코드로 실행해보면 이미지 주소가 프린트되는 것을 확인 할 수 있음

    터미널에 프린트된 img src
    터미널에 프린트된 img src

    이제 이 이미지 주소를 사용하여 다운로드를 위해서 코드를 알아보기 위해

    구글에 python download image by url 을 검색

    이미지 URL 다운로드하는 코드

    import urllib.request
    urllib.request.urlretrieve("http://www.gunnerkrigg.com//comics/00000001.jpg", "00000001.jpg")

    를 활용해줌

    적용된 코드
    적용된 코드

    URL주소를 img 변수로 만들어주고 그 변수를 다운로드하도록 코드를 수정해서 넣어주고 실행해주면 00000001.jpg 파일을 다운로드한 것을 볼 수 있음

    이제 코드가 자동 반복하도록 반복문을 만들어줌

    반복문을 적용한 코드
    반복문을 적용한 코드

    반복문으로 만들어주고 실행하면 이미지를 이렇게 다운로드함

    다운로드된 파일들이 셀레니움 폴더에 저장됨
    다운로드된 파일들이 셀레니움 폴더에 저장됨

    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

    코드를 다운로드 받기전 코드 위에 추가해줘서 모든 페이지를 스크롤을 내려서 확인한 후에 다운받기를 할 수 있도록 코드를 추가해줌

     

Copyright 2024