본문 바로가기
프로젝트/수익형 웹 만들기

2021년 8월 23일 - Step 2 : Python Selenium 업무 자동화 기초

by 철제백조 2021. 8. 23.

 ● 본 공부에 대한 기록은 유튜버 '조코딩 JoCodin' 님의 "완전 쉽게 파이썬으로 텍스트 및 이미지 크롤링하기 | 수익형 웹, 앱 만들기 2강"을 기본으로 하였습니다.

https://www.youtube.com/watch?v=1b7pXC1-IbE&list=PLU9-uwewPMe2-vtJAgWB6SNhHcTjJDgEO&index=2 

 


 

☆ Selenium

 

네이버나 구글이 업데이트됨에 따라 지난 과정의 방법으로 크롤링을 하지 못하는 경우가 발생하였다.

따라서 아무리 업데이트가 되어도 막히지 않는 크롤링 기술 Selenium이라는 프레임 워크를 다루겠다. 

 

셀레니움은 실제 브라우저를 코드를 통해 조작하는 방식

직접 인터넷 브라우저를 활용하는 것과 같은 방식으로 동작

따라서 우리가 브라우저를 통해 볼 수 있는 정보는 무조건 크롤링이 가하다.

 

셀레니움은 크롤링에만 사용되는 것이 아니라 메일 등 인터넷 브라우저로 할 수 있는 건 모두 자동화 가능

크롤링, 웹 브라우저 등으로 할 수 있는 건 모두 다 자동화가 가능하다 .

 

셀레니움은 다양한 언어로 활용이 가능하다.

본 기록에서는 Python을 활용하여 구글에서 이미지를 크롤링 하도록 하겠다.

 


 

1. 파이썬 가상환경 설정

 

 

같은 파이썬이라도 버전이나 라이브러리가 각각 만들고자하는 프로젝트 별로 다를 수 있다.

그렇기에 하나의 컴퓨터에서도 파이썬의 버전이나 정보들을 여러개로 분리해 각각을 독립적으로 가상환경처럼 만들어서 선택해서 사용할 수 있다.

 

 

1) VS Code 실행 

File - Open folder - 내가 원하는 작업 폴더를 선택(아무곳이나 상관없음) 

 

 

venv

 

 

 

"pyhton venv 가상환경" 구글링 → https://docs.python.org/ko/3/library/venv.html

 

 

 

venv — 가상 환경 생성 — Python 3.9.6 문서

venv — 가상 환경 생성 소스 코드: Lib/venv/ venv 모듈은 자체 사이트 디렉터리를 갖는 경량 《가상 환경》을 만들고, 선택적으로 시스템 사이트 디렉터리에서 격리할 수 있도록 지원합니다. 각 가

docs.python.org

 

 

◎ 가상 환경 만들기 코드

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

 

 

◎ VS Code에서 터미널을 열고 위의 코드를 붙여 넣고, 아래와 같이 수정해준다.

python -m venv selenium

 

환경변수 등록할 때, 파이썬으로 설치했기에 버전은 기본으로

뒤는 가상환경을 생성할 경로를 입력하는건데, 선택한 폴더 안쪽에 selenium이라는 환경을 만들어주었다.

단, 파이썬 기본 버전들이 갖추어진 환경이 아니면 불가능

 

 

입력할 경우, selenium 파일에 위와 같은 파일들이 생긴다.

이제 위의 파일들로 들어가 가상환경들을 구축해볼 것이다.

 

 

◎ 파일로 들어가기 위해 아래의 코드들을 순차적으로 입력해준다.

 

cd selenium\Scripts

activate

 

경로 에러가 발생하기에 주로 로컬 C에 폴더를 만드는 것이 좋다.

 

 


 

경로 설정 후, "activate : 'activate' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로  인식되지 않습니다." 오류

 

 

 

원인 - written by [솜씨좋은장씨]

 

이는 Visual Studio Code의 기본 터미널이 Windows의 Power Shell로 설정되어 있기 때문.

 

해결방법 

 

이 기본 터미널의 종류를 cmd 또는 Git Bash로 변경하면 오류없이 실행이 가능하다.

 

먼저 Ctrl + Shift + P (컨트롤 + 쉬프트 + P) 키를 눌러

Command Palette를 열고

Terminal: Select Default Shell 을 입력한다.

 

 

그럼 나오는 항목들 중에서

Command Prompt 또는 Git Bash를 선택한다.

 

 

변경 후 Terminal을 닫았다가 새로 Terminal을 열거나 다시 실행하면

 

 

조금 전 내가 선택한 터미널의 종류로 열리게 되고

이상없이 가상환경이 실행되어 오류가 나지 않는 것을 확인할 수 있다.

 

 

또는

 

 

1. File > Preperences > Settings 메뉴를 선택

 

 

 

2. User > Features > Terminal > Integrated>Shell:Windows 항목의

'Edit in settings.json'을 클릭.

(상단의 Search Bar에 'Shell:Windows'를 입력하여 항목을 찾아도 된다.)

(VSCode Setting에는 global setting인 'user setting'과 해당 workspace에만 적용되는 'workspace setting'이 있다)

 

 

 

3. settings.json 파일이 열리면

"terminal.integrated.shell.windows" 항목의 값을 "cmd.exe"로 변경하고 파일을 저장.

 

 

 

4. 다시 터미널을 열어보면 터미널에 cmd 창이 열려 있는 것을 확인 할 수 있다.

 

 

출처 : https://hianna.tistory.com/349

 

 


 

 

정상적으로 'activate' 명령어가 입력되었다면 아래와 같이 맨앞에 selenium이 붙은 명령어창이 나타난다.

현재 우리가 입력하는 이 명령어 창은 가상환경에 들어왔다는 것을 알려주는 표시이다.

 

 

이 표시가 있는 상태로 파이썬 코드를 실행하거나 패키지를 설치하거나 하면, 이 selenium이라는 가상환경 내에서 실행, 설치된다. 따라서 다른 프로젝트와 독립적인 공간에서 패키지를 설치하고 사용할 수 있다. 

 

이제 가상환경에서 셀레니움을 설치해보자.

 


 

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

 

pip install selenium

 

위의 명령어를 입력하면 자동으로 다운받고 설치까지 가능하다.

 

 

※ 경로로 인한 오류 : Fatal error in launcher: Unable to create process using

 

pip 명령어 앞에 python -m 을 붙여주는 것으로 해결이 가능하다.

 

python -m pip install selenium

 

 

설치가 정상적으로 완료되었다.

이제 셀리니움으로 활용할 웹 브라우저를 세팅하도록 하겠다.

 

브라우저는 크롬이나 파이어폭스 등 아무거나 상관없으나, Chrome을 사용해보겠다.

구글 검색창에 Chromedriver를 검색 

 

 

https://chromedriver.chromium.org/downloads

 

ChromeDriver - WebDriver for Chrome - Downloads

Current Releases If you are using Chrome version 93, please download ChromeDriver 93.0.4577.15 If you are using Chrome version 92, please download ChromeDriver 92.0.4515.107 If you are using Chrome version 91, please download ChromeDriver 91.0.4472.101 For

chromedriver.chromium.org

 

위 홈페이지에서 다운로드를 받기 전, 자신이 사용하는 크롬 브라우저 버전을 확인해야한다.

 

 

◎ 크롬 브라우저 우측 상단 → ... → 도움말 → Chrome 정보 → 자신의 크롬 버전 확인

 

 

 

 Chrome driver를 활용해 셀레니움이 브라우저를 실행, 조작할 수 있다.

 

 

◎ 버전에 맞게 다운로드 → 자신의 운영체제에 맞는 버전 다운 끌어다 selenium 파일 안으로 이동

※ VS Code로 바로 이동되지 않을 경우, 파일로 옮겨 VS Code에서 다시 이동시켜준다.

 

 

selenium 폴더 New File → "google.py" 생성 

google driver와 같은 경로에 있어야 함

 

 


 

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

 

잘 짜여진 예시 코드를 이용하도록 하겠다.

 

◎ python selenium example 구글 검색

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

 

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()

 

위의 코드를 "google.py"에 붙여넣는다.

 

※ 붙여넣은 코드에 붉은색으로 오류가 발생할 경우

 

 

셀레니움을 가상환경에 설치했는데 이 VS Code는 가상환경이 아닌, 그냥 컴퓨터에 파이썬이 설치되었다고 인식하고 있기에 셀레니움이 설치되지 않았다고 판단하는 것이다.

 

따라서 왼쪽 아래를 클릭해 위와 같이 바꾸어주면 코드의 붉은 오류 표시가 없어진다.

 

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("http://www.python.org")
# assert "Python" in driver.title
# elem = driver.find_element_by_name("q")
# elem.clear()
# elem.send_keys("pycon")
# elem.send_keys(Keys.RETURN)
# assert "No results found." not in driver.page_source
# driver.close()

 

위 두줄 남기고 주석 처리  우리가 사용할 것은 크롬이기에 Firefox를 Chrome으로 변환

 

cd selenium (오류 발생시 위 코드 한 번 실행하고 입력) → python google. py

 

오류 : ModuleNotFoundError: No module named 'selenium'

→ 가상 환경 안에서 패키지가 임포트 되어야 한다.

 

pip install selenium

 

VS Code를 열고 닫을 때마다 실행시켜주어야 한다.

 

위의 코드 입력하면 가상환경에 selenium이 설치되어 모듈을 인식하게 된다.

오류 해결 후, 다시 코드를 실행한다.

 

실행하면 파이썬 홈페이지가 열리는 걸 확인할 수 있다.

 

 오류 : uSB: usb_device_handle_win.cc:1049 Failed to read descriptor from node connection: 시스템에 부착된 장치가 작동하지 않습니다.

→ 치명적인 오류도 아니고, 과정에 상관없는 오류지만 해결 방법은 다음과 같다.

 

 


 

1) 'Window + x' 키를 눌러 장치관리자에 들어간다.

 

2) 범용 직렬 버스 컨트롤러를 클릭

 

3) USB Composite Device를 우클릭하여 디바이스 사용 안함으로 변경

 

 

[출처] https://blog.naver.com/PostList.naver?blogId=statp_r 

 

 


 

 

실행된 창 상단에 "Chorme이 자동화된 테스트 소프트웨어에 의해 제어되고 있습니다."라는 문구가 보인다.

우리가 작성한 코드가 실행되어 크롬 브라우저 상에서 작동하는 것이다.

 

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("http://www.python.org")

 

위에 두 줄은 우리가 설치한 셀레니움 관련 라이브러리를 불러오는 코드이다.

불러온 웹드라이버를 이용해서 webdriver.chrome을 이용해서 우리가 다운받은 chrome driver를 불러와 driver라는 변수에 저장하였다.그리고 driver 크롬 브라우저로 입력된 주소로 이동하게 된다.

 

 

이제 이걸 이용해서 구글에서 이미지를 찾는 과정을 코드로 작성해보자.

 

 

◎ 파이썬 홈페이지 주소 대신에 구글 주소를 복사해서 붙여넣어주자.

 

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://www.google.com/")

 

실행하면 이번엔 크롬 홈페이지가 나타난다.

그러나 우리는 이미지 검색을 할 것이기에, 구글 홈페이지 이미지를 눌렀을 때 나오는 주소로 설정하자.

 

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=ko&tab=ri&ogbl")

 

이미지 검색창에 찾고자 하는 키워드를 입력 후 엔터

이 과정을 셀레니움으로 자동화시켜보자.

 


 

1) 검색창을 찾아 여기에 우리가 원하는 검색어를 입력해주는 작업

 

driver.find_element를 활용해서 특정 요소를 찾을 수 있다.

해당 줄을 메인 코드에 붙여 넣는다.

또한 이 요소의 범위는 매우 광범위한데, 이를 확인하기 위해 크롬 이미지창에 들어가 F12를 눌러보자.

 

 

사이트의 html 코드를 직접 확인할 수 있는데, 좌측 상단의 inspect를 누르면 각 요소들이 어떻게 생겼는지 직접 확인이 가능하다. 우리는 입력창을 선택해야하니 검색창을 눌러보자.

 

 

그러면 검색창에 대한 정보와 규칙들을 확인할 수 있다.

그럼 name="q" 이므로, 이 요소를 규칙으로 그대로 사용해보자.

 

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=ko&tab=ri&ogbl")
elem = driver.find_element_by_name("q")

 

그러면 검색창을 찾는 것까지는 구현이 완료되었다.

그러면 검색창을 찾았으니 우리가 찾는 키워드를 입력해야한다.

 

입력하는 것은 "send_keys"를 이용해 어떤 키보드 입력값을 전송할 수 있다.

찾을 키워드를 입력해보자.

 

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=ko&tab=ri&ogbl")
elem = driver.find_element_by_name("q")
elem.send_keys("롤 티모")

 

※ 오류

SyntaxError: Non-UTF-8 code starting with '\xb7' in file c:\selenium crawling\selenium\google.py on line 7, but no encoding declared;

→ 한글 인코딩 문제

EUK-KR을 사용할 경우 아래의 코드를 맨 첫줄에 붙여넣으면 된다.

 

# -*- coding: euc-kr -*-

 

 

이 코드를 실행시키면 창이 열리며, 아래의 과정까지는 자동으로 실행이 된다.

 

 

 

이후에는 엔터를 눌러 검색을 해야한다.

이는 'send_keys(keys.RETURN)'으로 표현이 되어있다. 이것이 엔터키를 의미한다.

 

※ 우리가 무지하다고 할때 모르는 내용을 검색해 답을 찾을 줄 알아야 한다.

 

이제 엔터키를 의미하는 자동화 도구를 붙여넣도록 하자.

 

# -*- coding: euc-kr -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=ko&tab=ri&ogbl")
elem = driver.find_element_by_name("q")
elem.send_keys("롤 티모")
elem.send_keys(Keys.RETURN)

 

 

위처럼 엔터끼까지 눌린 모습의 창이 출력된다.

이제 이 이미지들을 각각 다운로드 받는 코드만 추가하면 된다.

구글 이미지의 경우, 검색된 이미지들을 클릭 - 이미지 다운의 과정을 자동화시켜야 한다.

 

F12를 눌러 이미지 파일의 규칙들을 찾아주도록 하자.

구글 이미지의 규칙성은 "rg_i"로 파악되었다.

 

먼저 작은 이미지들을 선택하는 작업을 코드를 추가해보자.

"driver.find_element_by_name()"으로 찾을 수 있을 것이다.

 

 

element : 하나의 요소를 선택할 때 사용

elements : 여러개의 요소를 선택할 때 사용

 

"find_elements_by_css_slector"를 이용

 

 

여기에 가장 첫번째 요소를 클릭하는 요소 [0].click() 추가.

 

 

 

※ 오류selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH.

 

정말 많이 만나는 오류다. VS Code를 껐다 킬때마다 발생하니 머리가 아플 지경이다.

알아본 결과, 이건 chromedriver의 경로가 잘못 되어 있어 발생하는 것이다.

 

 

chrome driver에 마우스를 가져다대면 경로가 나온다.

이 경로를 아래와 같이 앞에 r 을 추가해서 webdriver.Chrome( ) 안에 붙여 넣어주자.

 

# -*- coding: euc-kr -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome(r"C:\Users\user\chromedriver.exe")
driver.get("https://www.google.co.kr/imghp?hl=ko&tab=ri&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()

 

오류해결 후 실행하면 구글에서 이미지를 클릭하는 과정까지 실행된다.

이제 남은 건 큰 이미지를 선택해서 다운로드를 받으면 된다.

마찬가지로 F12 버튼을 눌러 규칙성을 찾아낸다 → 'n3VNCb'라는 class 규칙성을 가지고 있다.

 

큰 이미지의 태그를 찾고, 태그에 src 주소를 가져오면 된다.

위와 동일하나, 하나씩 이미지를 태그하는 것이기에 element로 구성한다.

 

 

뭔가 클릭하거나 이동할 때, 브라우저도 어느정도 시간이 필요하다.

그렇기에 클릭하고 조금 기다리는 시간을 지연시키는 코드를 넣어주어야 한다.

import time + time.sleep으로 컴퓨터에게 쉬는 시간을 부여할 수 있다.

 

# -*- coding: euc-kr -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Chrome(r"C:\Users\user\chromedriver.exe")
driver.get("https://www.google.co.kr/imghp?hl=ko&tab=ri&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").get_attribute("src"))

 

 

이제 마지막으로 이미지를 다운받는 코드만 더해주면 끝이다.

"python download image by url" 구글링 사이트에서 코드 검색 후 복사.

 

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

 

import는 잘라서 왼쪽 위에 붙여준다.

그리고 print 대신에 나온 주소를 imgUrl 이라는 변수에 담아주자.

 

# -*- coding: euc-kr -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request

driver = webdriver.Chrome(r"C:\Users\user\chromedriver.exe")
driver.get("https://www.google.co.kr/imghp?hl=ko&tab=ri&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)
imgUrl = driver.find_element_by_css_selector(".n3VNCb").get_attribute("src")
urllib.request.urlretrieve(imgUrl, "00000001.jpg")

 

창을 확인하면 파일이 잘 다운된 걸 확인할 수 있다.하나만 다운받을 것이 아니라, 여러장을 다운받을 것이다. 따라서 이걸 반복하는 형식으로 되풀이하면 될 것이다.

 

증감식, 반복문 등을 코드에 더해주자.

이 방법으로 다운받으면 최대 50장이 전부인데, 스크롤을 내리는 코드를 더하기도 한다.

 

# -*- coding: euc-kr -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request

driver = webdriver.Chrome(r"C:\Users\user\chromedriver.exe")
driver.get("https://www.google.co.kr/imghp?hl=ko&tab=ri&ogbl")
elem = driver.find_element_by_name("q")
elem.send_keys("롤 티모")
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")
count = 1
for image in images:
    try:
        image.click()
        time.sleep(2)
        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[1]/a/img').get_attribute("src")
        urllib.request.urlretrieve(imgUrl, str(count) + ".jpg")
        count = count + 1
    except:
        pass

driver.close()

# assert "Python" in driver.title
# elem = driver.find_element_by_name("q")
# elem.clear()
# elem.send_keys("pycon")
# elem.send_keys(Keys.RETURN)
# assert "No results found." not in driver.page_source
# driver.close()

 

# 특정 검색어 입력하고 목록에 있는 이미지를 전부 다운로드하는 코드 작성 완료

 

 

 

 

 

 

댓글