IT 대장간

[파이썬] 업무 자동화 5.웹페이지 & 셀레늄 본문

Programing/Python

[파이썬] 업무 자동화 5.웹페이지 & 셀레늄

태장장이 2021. 3. 18. 16:34

글을 작성하기에 앞서 내용 자체가 워낙 활용할 부분들이 많고 방대하다고 느꼈기에 코드 위주의 글작성이 되겠다.

 

단, 크롤링은 소개하지 않음

이 글에서는 beautiful soap패키지에 대한 내용은 없다. (스크롤 이동 有)

 

 

1. 주요 패키지 & 모듈

 

from selenium import webdriver
from selenium.webdriver.common.keys import Keys #엔터키 입력을 위한 패키지
import time

 위 3개만 있으면 충분하다

 

순서대로 설명하자면, 

1) webdriver 모듈 사용의 용이성을 위함

2) Enter , PageDown 같은 키 입력을 위함

3) 동작의 매끄러움을 위한 딜레이 적용

 

 

2. 웹페이지 가져오기

 

browser = webdriver.Chrome()

#크롬을 통한 웹 페이지 실행
browser.get("https://www.naver.com")

 

: 코드를 실행하면 네이버 메인페이지가 출력된다.

 

 

3. 엘리먼트(Element)를 통한 동작

컴퓨터에게 웹 상 작업명령을 내릴떄 알아 듣도록 지정영역이던 속성이던 잡아줘야 한다

 

그 방법이 몇가지가 있는데 주로 사용하는 속성은 ID , xpath, link_text 정도가 좋은듯하다.

 

 

1) 네이버 페이지 기능 동작

 

from selenium import webdriver
from selenium.webdriver.common.keys import Keys #엔터키 입력을 위한 패키지
import time

browser = webdriver.Chrome()
browser.get("https://www.naver.com")

elem = browser.find_element_by_link_text("카페")
elem.click() # 클릭

time.sleep(3)
browser.back() #뒤로가기

#id가 query인 것을 저장
elem = browser.find_element_by_id("query")

elem.send_keys("태장장이") # 키 입력
elem.send_keys(Keys.ENTER) # 엔터 키 입력

time.sleep(1)
browser.back() #뒤로가기

elem = browser.find_element_by_id("query")
elem.send_keys("대장") # 키 입력

# xpath값을 통한 search기능 활용 , 따옴표 중복으로 컴파일러가 혼동하므로 ' 사용
elem = browser.find_element_by_xpath('//*[@id="search_btn"]') 
elem.click() #서치기능 클릭

browser.save_screenshot("selenium.png") #브라우저화면 스크린샷

<동작순서>

  • link_text를 통해 '카페' 클릭 접속 (직관적인 장점)
  • 뒤로 가기 ( 메인페이지 이동)
  • 검색창 영역에 "태장장이" 입력
  • 뒤로 가기 ( 메인페이지 이동)
  • 검색창 영역에 "대장" 입력
  • Xpath 속성값을 통한 '검색' 기능 클릭 수행
  • 브라우저 화면 스크린샷 (상위 경로 지정없을 경우 워크스페이스에 저장)

 

 

 

 

 

 

xpath값 복사방법

 

 

 

 

 

2) iframe 진입 (Element = xpath)

: 페이지에 iframe이 있을 경우 별도의 웹 페이지(?)로 인식하기 때문에 elemet를 가져올수가 없다.

(위 예시와 다른 페이지를 통한 설명)

 

이럴땐

 

드라이버.switch_to.frame('frame id값')을 통해 frame 내부로 접근해야한다.

 

 

아래 예시는 option타입에서 자동화 수행을 하는 예제이다.

option뿐만 아니라 다른 input 타입또한 클릭으로 수행할 수 있다 ( radio. checkbox 등)

browser = webdriver.Chrome()

browser.get('https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_option')

browser.switch_to.frame('iframeResult')

# xpath > 인덱스를 통한 색인
elem = browser.find_element_by_xpath('//*[@id="cars"]/option[4]')

# xpath > text를 통한 색인
elem = browser.find_element_by_xpath('//*[@id="cars"]/option[text() ="Audi"]')

#텍스트 값이 부분 일치하는 항목 선택하는 방법
elem = browser.find_element_by_xpath('//*[@id="cars"]/option[contains(text(), "Au")]')

elem.click()



browser.switch_to.default_content()

 

 

 

4. 스크롤 이동

: 동적 스크롤이동을 수행하여 페이지내 스크롤을 하단으로 내림과 동시에 늘어나는 페이지 길이를 인식하여 최하단까지 이동하는 예제이다.

browser = webdriver.Chrome()

browser.get("https://shopping.naver.com/home/p/index.nhn")

elem = browser.find_element_by_xpath('//*[@id="autocompleteWrapper"]/input[1]')

elem.send_keys("무선키보드")

time.sleep(1)
elem.send_keys(Keys.ENTER) #엔터 입력

# #웹 페이지 스크롤 이동
# browser.execute_script('window.scrollTo(0, 1080') # Y값 만큼 이동.

time.sleep(1)

#웹 페이지의 스크롤 포함 전체 높이 만큼 이동 = 맨 아래 이동(document.body.Height를 적음으로 전체 페이지 높이가 y좌표로 선택))
# browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')

scroll_PAUSE = 0.5
#현재 문서 높이를 가져와서 저장
prev_height = browser.execute_script("return document.body.scrollHeight")

#반복 수행
while True :
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    time.sleep(scroll_PAUSE)

    #현재 문서 높이 가져와서 지정
    curr_height = browser.execute_script("return document.body.scrollHeight")
    if curr_height == prev_height : 
        break

    prev_height = curr_height

#처음으로 이동
browser.execute_script('window.scrollTo(0,0)')


time.sleep(3)
browser.quit()

 

위 코드는 execute_script를 통해 페이지 높이를 JS코드로 받아와서 반복수행하는 것이다. 맨 아래로 이동할떄까지 스크롤을 반복하여 내리며 웹페이지 길이(Height)가 더 이상 늘어나지 않을 경우 스크롤 이동 반복을 멈추고 맨위로 이동한다.