바뀜

둘러보기로 가기 검색하러 가기
6,508 바이트 추가됨 ,  2021년 4월 5일 (월) 23:55
새 문서: ==개요== 셀레니움. 동적 크롤링을 위한 라이브러리. 웹 애플리케이션 테스트 라이브러리다. === 특, 장점 === * 기본적인 웹 스크래핑 도구...

==개요==
셀레니움. 동적 크롤링을 위한 라이브러리. 웹 애플리케이션 테스트 라이브러리다.

=== 특, 장점 ===

* 기본적인 웹 스크래핑 도구는 주어진 것을 받아들일 뿐 로그인 해야만 볼 수 있는 정보를 받아올 순 없다. 이런 한계를 극복하기 위해 자주 사용되는 도구.(실제로 웹서핑을 하듯 사용자의 입력을 넣을 수 있다.)

=== 한계 ===

* 사용자가 실제로 입력하듯 작동한다. 때문에 상대적으로 느리다.

=== 설치 ===
{| class="wikitable"
|+
!과정
!설명
!비고
|-
|설치
|pip install selenium
|
|-
|웹드라이버 설치
|
*크롬 브라우저에서 chrome://version 을 입력해 버전 확인.
*<nowiki>https://sites.google.com/a/chromium.org/chromedriver/downloads</nowiki> 에서 해당 버전에 맞는 드라이버 .zip 파일을 받는다.
*적절한 곳에 옮겨두고 경로를 기억해둔다.<syntaxhighlight lang="python">
from selenium import webdriver

drv = webdriver.Chrome('chromedriver.exe', options=opt) # 웹드라이버 경로를 지정해준다.
</syntaxhighlight>
|매번 웹드라이버를 다운받기 귀찮을 땐, 혹은 이미 브라우저를 사용하고 있을 땐 webdriver-manager를 사용하면 편하다.
|}

=== 웹 드라이버 ===
기본적으로 설치되어 있어야 작동한다.
{| class="wikitable"
!드라이버
!설명
!사용법
|-
|Chrome
|
|
적절한 웹드라이버를 받기 힘들다면, pip install webdriver-manager를 이용해 사용한다.<syntaxhighlight lang="python">
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

browser = webdriver.Chrome(ChromeDriverManager().install()) # 이걸 브라우저로 사용한다.
</syntaxhighlight>
|-
|PhantumJS
|JavaScriptCore 사용. 명령줄에서 웹브라우저를 조작한다.
|
|-
|
|기타(나중에 사용하게 되는 사람들이 사용하면서 정리해줘요~)
Firefox, Ie, Opera, PhantomJS, Remote 등의 웹드라이버사용이 가능하다.
|
|}

== 사용법 ==
웹드라이버를 browser라는 객체에 할당했을 때의 방법이다.
{| class="wikitable"
!의도
!설명
!방법
|-
|기다리기
|브라우저가 초기화될 때까지 기다린다.(보통 3초? 굳이 안써도 잘 작동하긴 한다.)
|browser.implicitly_wait(초)
|-
|웹페이지 읽기
|
|browser.get(url)
|-
|종료하기
|
|browser.quit()
|}

=== 객체 찾기(요소 찾기) ===
객체를 찾아 해당 내용에 접근할 수 있다.(다양한 방법이 있다. 사용하게 될 때마다 검색해서 사용하고 정리해두자.)

* 기본적으로 가장 처음의 하나만 찾을 땐 <code>find_element_by_...</code>를 사용하고, 여러 개 추출할 땐 <code>find_elements_by_...</code>를 사용한다.
* 요소를 찾지 못한다면 NoSuchElementException 에러를 반환한다.

{| class="wikitable"
!의도
!설명
!방법
|-
|DOM 요소로 찾기(id)
|id속성으로 요소를 하나 추출한다.
|target = browser.find_element_by_id('DOM요소')
|-
|css셀렉터로 찾기
|
|form = browser.find_element_by_css_selector("input.btn_global[type=submit]")
|}

=== 객체 조작(요소 조작) ===
키를 선택하거나 입력하는 등의 조작을 하기 위한 기능이다.

아래에서 사용된 target은 위에서 찾은 요소의 객체를 의미한다.
{| class="wikitable"
!의도
!설명
!방법
|-
|지우기
|양식에 처음부터 추가되어 있는 내용을 지운다.
|target.clear()
|-
|클릭
|
|target.click()
|-
|키 입력
|input 양식 따위에 내용을 입력한다.
|target.send_keys(입력값)
|-
|특수키 입력
|방향키, ALT, COMMAND, F1 등 특수키를 사용하고 싶을 때.
|<syntaxhighlight lang="python">
from selenium.Webdriver.common.keys import Keys
</syntaxhighlight>위 모듈을 불러온 후 ARROW_DOWN, ALT, COMMAND, F1등을 입력한다.
|-
|전송
|form 요소의 버튼같은 객체를 찾은 후 전송.
|target.submit()
|}
이외 쿠키값을 조작하거나 브라우저의 위치, 크기를 조작하는 등 브라우저로 할 수 있는 대부분의 것들을 할 수 있다.

==== 자바스크립트 사용 ====
셀레니움에서 다양한 기능을 제공하지만, 더 세부적으로 조작하고싶은 경우, 자바스크립트를 사용할 수도 있다.
{| class="wikitable"
!의도
!설명
!방법
|-
|자바스크립트 사용
|JS를 실행한 결과는 객체에 담긴다.
|객체 = browser.execute_script("자바스크립트")
|}

=== 하위속성 접근 ===
{| class="wikitable"
!의도
!설명
!방법
|-
|id속성에 접근
|id속성을 보여준다.
|target.id
|-
|태그이름
|요소의 태그
|target.tag_name
|-
|텍스트에 접근
|요소의 내부 글자를 보여준다.
|target.text
|}

=== 자주 안쓸 것 같은 기능 ===
{| class="wikitable"
!의도
!설명
!방법
|-
|스크린샷
|브라우저의 화면을 캡처한다.(스크롤바까지 찍힌다.)
|browser.save_screenshot("경로.png")
|}

= 다양한 사용법 =

=== 로그인 ===
네이버에 로그인할 때의 예시.
{| class="wikitable"
!과정
!설명
!방법
|-
|사전 내용 기입
|이것저것 준비하는 단계
|<syntaxhighlight lang="python">
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

User = 'id'
User_target = '타겟' # id를 입력할 DOM요소 등을 지정.
Pass = 'password'
Pass_target = '타겟' # password를 입력할 DOM요소 등을 지정.
form_target = '타겟' # id와 password를 입력하고 제출버튼의 위치를 찾을 단서를 지정.
url_login = "http://주소" # 로그인 페이지 주소.
</syntaxhighlight>
|-
|로그인페이지 접근
|selenium 사용을 위한 설정 및 접근
|<syntaxhighlight lang="python">
browser = webdriver.Chrome(ChromeDriverManager().install()) # 이걸 브라우저로 사용한다.
browser.implicitly_wait(3)
browser.get(url_login)
</syntaxhighlight>
|-
|각종 내용 입력 후 제출
|
|<syntaxhighlight lang="python">
target = browser.find_element_by_id(User_target)
target.clear()
target.send_keys(User) # ID에 해당하는 내용 입력
target = browser.find_element_by_id(Pass_target)
target.clear()
target.send_keys(Pass) # 비밀번호에 해당하는 내용 입력
## 버튼 누르기
form = browser.find_element_by_css_selector(form_target)
form.submit()
</syntaxhighlight>
|}
(로그인할 때 글자를 쓰게 하거나.. 이것저것 입력할 것을 요구하면... 못한다.)
[[분류:라이브러리]]

둘러보기 메뉴