Python Library/웹 크롤링

[웹 크롤링 - Python] Selenium 사용법

바보1 2022. 2. 2. 00:44

앞의 글을 읽으시면 이해에 도움이 됩니다.

 

2022.02.01 - [Python Library/웹 크롤링] - [웹 크롤링 - Python] Selenium 프레임워크 및 웹 드라이버

 

[웹 크롤링 - Python] Selenium 프레임워크 및 웹 드라이버

1. Selenium 이란? 만약 우리가 웹 크롤링을 하는 과정에서 로그인이 필요한 경우에는 어떻게 해야할까? 일일이 우리가 로그인을 하고 안에 들어간 다음에 url 주소를 다시 줘야할까?? 혹은 해당 웹

hi-guten-tag.tistory.com


1. find를 이용해 element 찾기(find_element), click(), get_attribute()

 

 

from selenium import webdriver

url = "http://naver.com"
browser = webdriver.Chrome()
browser.get(url)

우선 위 코드를 돌려서 네이버 홈페이지를 열여보자.

 

여기서 우리가 로그인 버튼을 클릭해보자

 

로그인 버튼의 HTML은 다음과 같다.

 

이때, 프로그램으로 로그인 버튼을 찾고, 그 버튼을 누르는 코드를 작성해야한다.

 

로그인 버튼을 찾는 방법은 여러가지가 있겠지만, Class명을 이용하는 방법이 있다.

 

from selenium.webdriver.common.by import By

element = browser.find_element(By.CLASS_NAME, 'link_login')

참고로 frome selenium.webdriver.common.by import By를 통해서 By 모듈을 사용해야한다.

 

사실 저렇게 사용 안 해도

 

elem = browser.find_element_by_class_name('link_login')

 이렇게 찾을 수 있는데, 이렇게 쓰면 

 

DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead

 

라는 오류가 떠서, 위에처럼 By.'element_name' 을 이용해 find를 쓰는게 좋다.

 

이렇게 하면 로그인 버튼에 해당하는 요소를 element변수에 저장할 수 있다.

 

이를 통해 우리는 로그인 버튼을 클릭할 수 있게 된 것이다.

 

로그인 버튼을 클릭하기 위해서는 click()이라는 함수를 쓰면 된다!

 

from selenium import webdriver
from selenium.webdriver.common.by import By

url = "http://naver.com"
browser = webdriver.Chrome()
browser.get(url)

element = browser.find_element(By.CLASS_NAME, 'link_login')

element.click()

이렇게 하면 로그인 버튼을 클릭한다..!

 

코드를 실행하니 자동으로 로그인 버튼을 클릭하는 모습이다.

 

 

만약에 element가 하나가 아니라 여러개라면 find_elements를 이용하면 된다

elements = browser.find_elements(By.TAG_NAME, 'a')

for element in elements:
    print(element.get_attribute('href'))

 

추가적으로 get_attribute라는 함수도 있는데, HTML의 속성 값을 얻기 위해 사용된다.

 

get_attribute('element_name')을 이용하면 엘리먼트 이름에 해당하는 속성의 값을 얻을 수 있다.


2. send_key, Keys_ENTER, clear()

 

우리가 네이버에 무언가를 검색할 때는 검색창에 무언가를 입력한다.

 

이때 무언가를 입력하기 위한 함수가 바로 send_key이다. 우선 send_key를 사용하기 위해서는 검색창에 해당하는 element를 우선적으로 가져와야한다.

 

또한, Keys를 import해줘야하는데 Keys는 By와 마찬가지로 selenium.webdriver.common.keys 아래에 있다.

 

from selenium.webdriver.common.keys import Keys

 

네이버 페이지의 검색창에 해당하는 HTML 이다.

ID를 이용해 검색창을 찾으면 된다.

 

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

url = "http://naver.com"
browser = webdriver.Chrome()
browser.get(url)

element = browser.find_element(By.ID, 'query')

element.send_keys("안녕")

이렇게 되면 검색창에 '안녕'이 들어가있을 것이다.

 

움짤로 증명하고 싶지만, 움짤을 캡쳐하는 법을 몰라서 이렇게 스크린샷으로 올리는 점 양해 부탁 바랍니다..

 

하여튼 이렇게 안녕을 입력하고 나서 검색을 하기 위해서는 어떻게 해야하는가??

 

두 가지 방법이 있다. 하나는 그냥 엔터를 입력하는 것이고, 다른 하나는 옆의 돋보기 표시를 클릭하는 것이다.

 

돋보기 표시를 클릭하는 것은 앞의 1번 click()을 통해 할 수 있으니 패스하고, 엔터를 입력하는 방법을 이용해보자.

 

엔터를 입력하는 방법은 Keys.ENTER을 이용하면 된다. 매우 간단하다.

 

element.send_keys(Keys.ENTER)

 

이렇게 하면 자동으로 안녕을 입력하고, 엔터까지 친 모습을 확인할 수 있다!!!

 

그러면 지금까지의 코드를 한 번 전체적으로 작성해보겠다.

 

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

url = "http://naver.com"
browser = webdriver.Chrome()
browser.get(url)

element = browser.find_element(By.ID, 'query')

element.send_keys("안녕")
element.send_keys(Keys.ENTER)

 

좀 더 간략하게 쓰자면,

 

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

url = "http://naver.com"
browser = webdriver.Chrome()
browser.get(url)

element = browser.find_element(By.ID, 'query').send_keys("안녕", Keys.ENTER)

 

이런식으로 축약해서 쓸 수도 있다!!

 

그리고 검색창에서 내용을 지우고 싶다면 

 

element = browser.find_element(By.ID, 'query')
element.clear()

를 이용해서 검색창을 지울 수 있다.


3. Selenium의 페이지와 관련된 함수 몇 가지

 

 

# 뒤로가기
browser.back()

# 앞으로 가기
browser.forward()

# 새로고침
browser.refresh()

# 탭 닫기
browser.close()

# 창 닫기
browser.quit()

# 창 최대화
browser.maximize_window()

# 창 최소화
browser.minimize_window()

# 브라우저 HTML 정보 출력
print(browser.page_source)

끝!!!

 

참고 : 나도코딩