본문 바로가기
App Programming/Web Crawler

[Web Crawler] 셀레니움 (Selenium) (2)

by goatlab 2022. 2. 15.
728x90
반응형
SMALL

엘레먼트 (element)

 

웹브라우저에서 로그인도 하고 버튼도 클릭하고 검색창에 텍스트를 입력한다. 브라우저 상에서 보이는 버튼, 검색창, 사진, 테이블, 동영상 등등 이 모든 것들을 엘레먼트 (element, 요소) 라고 부른다. 셀레니움은 브라우저에서 특정 요소를 클릭하고 텍스트를 입력하고 사진등을 받아오고 텍스트를 가져오는 등등 어떠한 위치에 있는 무언가를 부를 때 요소라는 개념으로 접근한다. 다양한 방법으로 요소로 접근할 수 있는데 대부분 xpath 를 사용한다.

 

river.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div/div[3]/form/fieldset/button/span[2]') # xpath 로 접근
driver.find_element_by_class_name('ico_search_submit') # class 속성으로 접근
driver.find_element_by_id('ke_kbd_btn') #id 속성으로 접근
driver.find_element_by_link_text('회원가입') # 링크가 달려 있는 텍스트로 접근
driver.find_element_by_css_selector('#account > div > a') # css 셀렉터로 접근
driver.find_element_by_name('join') # name 속성으로 접근
driver.find_element_by_partial_link_text('가입') # 링크가 달려 있는 엘레먼트에 텍스트 일부만 적어서 해당 엘레먼트에 접근
driver.find_element_by_tag_name('input') # 태그 이름으로 접근
driver.find_element_by_tag_name('input').find_element_by_tag_name('a') # input 태그 하위태그인 a 태그에 접근
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 엘레먼트에 접근

 

요소 클릭

 

driver.find_element_by_id('ke_kbd_btn').click()

 

요소 찾기 (Locating Elements)

 

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

options = webdriver.ChromeOptions()
options.add_argument('window-size=1920,1080')

driver = webdriver.Chrome('chromedriver', options=options)
driver.implicitly_wait(5)

driver.get(url='https://www.google.com/')

search_box = driver.find_element_by_xpath('//*[@id="tsf"]/div[2]/div[1]/div[1]/div/div[2]/input')

search_box.send_keys('greeksharifa.github.io')
search_box.send_keys(Keys.RETURN)

elements = driver.find_elements_by_xpath('//*[@id="rso"]/div[*]/div/div[1]/a/h3/span')

for element in elements:
    print(element.text)
    print(element.text, file=open('gorio.txt', 'w', encoding='utf-8'))

sleep(3)
driver.close()

 

XPath로 요소 찾기

 

표현식 설명
nodename nodename을 name으로 갖는 모든 요소 선택
/ root 요소에서 선택
// 현재 요소의 자손 요소를 선택
. 현재 요소를 선택
.. 현재 요소의 부모 요소를 선택
@ 속성 (attibutes)를 선택
* 모든 요소에 매치됨
@* 모든 속성 요소에 매치됨
node() 모든 종류의 모든 요소에 매치됨
| OR 조건의 기능
표현식 설명
/div root 요소의 div 요소
./div 현재 요소의 자식 요소 중 div 요소
/* name에 상관없이 root 요소를 선택
./* 또는 * context 요소의 모든 자식 요소를 선택
//div 현재 웹페이지에서 모든 div 요소를 선택
.//div 현재 요소의 모든 자손 div 요소를 선택
//* 현재 웹페이지의 모든 요소를 선택
.//* 현재 요소의 모든 자손 요소를 선택
/div/p[0] root > div > p 요소 중 첫 번째 p 요소를 선택
/div/p[position()<3] root > div > p 요소 중 첫 두 p 요소를 선택
/div/p[last()] root > div > p 요소 중 마지막 p 요소를 선택
/bookstore/book[price>35.00] root > bookstore > book 요소 중 price 속성이 35.00 초과인 요소들을 선택
//*[@id="tsf"]/div[2]/ id가 tsf인 모든 요소의 자식 div 요소 중 3번째 요소를 선택
//title | //price title 또는 price 요소를 선택

 

텍스트 입력

 

driver.find_element_by_id('ke_awd2_btn').send_keys('텍스트 입력')

 

텍스트 삭제

 

driver.find_element_by_id('ke_awd2_btn').clear()

 

단축키 입력

 

from selenium.webdriver.common.keys import Keys

# 컨트롤 + V
driver.find_element_by_id('ke_kbd_btn').send_keys(Keys.CONTROL + 'v')

# 다른 방법
from selenium.webdriver import ActionChains

ActionChains(driver).key_down(Keys.CONTROL).send_keys('V').key_up(Keys.CONTROL).perform() 
# 위에서 driver 대신 요소를 입력해도 좋음.

 

Window / Frame 이동

 

예전에 만들어진 사이트라면 frame을 사용한 경우가 있다. frame 안에 들어 있는 요소는 find_element 함수를 써도 그냥 찾아지지 않는 경우가 있다. find_element 함수는 frame 내에 있는 요소를 찾아주지 못하기 때문에 특정 frame으로 이동해야 할 때가 있다.

 

# 이동할 프레임 요소 지정
element = driver.find_element_by_tag_name('iframe')

# 프레임 이동
driver.switch_to.frame(element)

# 프레임에서 빠져나오기
driver.switch_to.default_content()

 

https://selenium-python.readthedocs.io/index.html

 

Selenium with Python — Selenium Python Bindings 2 documentation

Note This is not an official documentation. If you would like to contribute to this documentation, you can fork this project in GitHub and send pull requests. You can also send your feedback to my email: baiju.m.mail AT gmail DOT com. So far 50+ community

selenium-python.readthedocs.io

 

728x90
반응형
LIST