-
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.exe와 google.py 가 같은 폴더에 있어야함)
이제 세팅은 끝났으며 본격적으로 코드를 작성해줌
3.구글 이미지 크롤링 코드 작성
구글 Python selenium example 검색
공식홈페이지에 나와있는 셀레니움 예제를 활용
하단에 버전이 나와 있는 부분을 눌러서 셀레니움 환경으로 바꿔주고
위에 해당 코드를 가져와서 넣어줌
또한 문법을 검사해주는 pylint를 설치해줌
위 2줄 제외 주석처리해주고 쓰려고하는 웹브라우저 이름을 써주고 ()를 넣어준다음 아래 경로에 맞는지 확인한 후 명령어 python google.py 입력 (selenium 폴더에 google.py를 실행)
그러면 웹페이지가 뜸
주소를 바꿔줌 https://www.google.com/ 그래서 실행해주면 이렇게 구글 웹페이지가 뜨며 이미지를 검색해줄 것이기에 이미지를 눌러 들어가서 주소를 복사해줌
찾고자하는 키워드를 검색함
이 과정을 코드에 적용해줄 예정임
검색창 요소를 확인해보면 검색창 요소가 name=q로 되어 있음
>>여기서 주의
iframe 요소란?
iframe이란 inline frame의 약자로 쉽게 말해 페이지 안의 페이지임
위에서 오류가 났던 이유는 iframe 페이지 안의 요소는 selenium이 참조하지 못 하기 때문임
아래의 그림을 보시면 큰 빨간색 사각형으로 표시한 부분이 iframe 영역인데 이것을 잘 구분해서 찍어봐야함
이렇게 하고 실행해봄
이 과정까지 자동으로 진행되는 것을 확인할 수 있음
F12로 개체 확인을 해보면 이미지를 보면 클래스가 동일한 문자로 다른 이미지도 적용되고 있는 것을 알 수 있음
코드를 적용해주면
driver.find_element
는 해당 개체를 찾는 코드로 element와 elements가 있는데 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 검색
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"))
위 코드로 실행해보면 이미지 주소가 프린트되는 것을 확인 할 수 있음
이제 이 이미지 주소를 사용하여 다운로드를 위해서 코드를 알아보기 위해’
구글에 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
코드를 다운로드 받기전 코드 위에 추가해줘서 모든 페이지를 스크롤을 내려서 확인한 후에 다운받기를 할 수 있도록 코드를 추가해줌