본문 바로가기
코딩 연습/코딩배우기

[Python] 파이썬을 활용한 업무자동화 - 웹 자동화(iframe 스크래핑, Web Element, 동적페이지 스크래핑) 연습 코드 정리

by good4me 2021. 7. 7.

goodthings4me.tistory.com

 

[출처] [나도코딩] 파이썬 코딩 무료 강의 (활용편4) - 업무자동화(RPA), 이제는 일하는 척(?)만 하세요 https://youtu.be/exgO1LFl9x8

■ selenium 스크래핑 시, 웹 페이지 내 iframe이 있는 경우는 frame 전환 후 스크래핑 함

## https://www.w3schools.com/html/tryit.asp?filename=tryhtml_input_text 일부분 ##

<div id="iframecontainer">
    <div id="iframe">
      <div id="iframewrapper">
          <iframe frameborder="0" id="iframeResult" name="iframeResult" allowfullscreen="true">
            <html>
                <head>
                </head>
                <body contenteditable="false">
                    <h2>Text field</h2>
                    <p>The <strong>input type="text"</strong> defines a one-line text input field:</p>
            
                    <form action="/action_page.php">
                      <label for="fname">First name:</label><br>
                      <input type="text" id="fname" name="fname"><br>
                      <label for="lname">Last name:</label><br>
                      <input type="text" id="lname" name="lname"><br><br>
                      <input type="submit" value="Submit">
                    </form>
                    
                    <p>Note that the form itself is not visible.</p>
                    <p>Also note that the default width of a text field is 20 characters.</p>
                    </body>
            </html>          
          </iframe>
      </div>
    </div>
</div>

browser.switch_to.frame() 과 browser.switch_to.default_content()

from selenium import webdriver
import time

browser = webdriver.Chrome()
url = 'https://www.w3schools.com/html/tryit.asp?filename=tryhtml_input_text'
browser.get(url)
time.sleep(1)

# elem = browser.find_element_by_xpath('//*[@id="fname"]')  # 스크래핑 실패
# elem.click()
# time.sleep(2)
# browser.quit()
# NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="fname"]"}
#   (Session info: chrome=91.0.4472.114)


## frame 전환 후 
# <iframe frameborder="0" id="iframeResult" name="iframeResult" allowfullscreen="true">

browser.switch_to.frame('iframeResult')  # frame 전환
elem = browser.find_element_by_xpath('//*[@id="fname"]')
elem.click()

# iframe 스크래핑 후 상위로 빠져 나옴
browser.switch_to.default_content()  # 상위로 이동
time.sleep(3)

browser.quit()

 

■ Radio 버튼 선택하기 - is_selected()

from selenium import webdriver
import time

browser = webdriver.Chrome()
url = 'https://www.w3schools.com/html/tryit.asp?filename=tryhtml_input_radio'
browser.get(url)
time.sleep(1)

browser.switch_to.frame('iframeResult')  # frame 전환
elem = browser.find_element_by_xpath('//*[@id="html"]')

# 선택이 안되어 있으면 선택하기
if elem.is_selected() == False:
    elem.click()
else:
    print('이미 선택되었음')
    
time.sleep(3)

if elem.is_selected() == False:
    elem.click()
else:
    print('이미 선택되었음')
    
browser.quit()

good4me.co.kr

 

■ Checkbox 체크하기 - is_selected()

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

browser = webdriver.Chrome()
url = 'https://www.w3schools.com/html/tryit.asp?filename=tryhtml_input_checkbox'
browser.get(url)
time.sleep(1)

browser.switch_to.frame('iframeResult')  # frame 전환

## x_path 입력 부분을 다르게 해봄
# elem = browser.find_element_by_xpath('//*[@id="vehicle1"]')
# elem = browser.find_element(By.XPATH, '//*[@id="vehicle1"]')   # 위 줄과 같음
elem = browser.find_element(By.ID, 'vehicle1')  # 위 줄과 같음

time.sleep(3)  # 수동 체크해 볼 시간 줌

# 체크가 안되어 있으면 체크하기
if elem.is_selected() == False:
    elem.click()
else:
    print('이미 체크되었음')

time.sleep(2)

browser.quit()

 

■ Select & Option - is_selected()

from selenium import webdriver
import time

browser = webdriver.Chrome()
url = 'https://www.w3schools.com/html/tryit.asp?filename=tryhtml_elem_select'
browser.get(url)
time.sleep(1)

browser.switch_to.frame('iframeResult')  # frame 전환

# cars에 해당하는 element를 찾고, 드롭다운 내부에 있는 4번째 옵션을 선택
elem = browser.find_element_by_xpath('//*[@id="cars"]/option[4]')
time.sleep(2)
elem.click()
if elem.is_selected():
    print('선택되었음')
time.sleep(2)

# 텍스트 값을 통해서 선택하는 방법 - 옵션 중 주어진 텍스트로 선택 - text()="Fiat"
elem = browser.find_element_by_xpath('//*[@id="cars"]/option[text()="Fiat"]')
elem.click()
if elem.is_selected():
    print('선택되었음')
time.sleep(2)

browser.quit()

 

■ 동적 페이지(네이버 쇼핑 스크롤) - 스크롤 시 로딩되는 동적인 페이지에 대해 스크래핑

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

browser = webdriver.Chrome()
browser.maximize_window()

url = 'https://shopping.naver.com/home/p/index.nhn'
browser.get(url)
time.sleep(3)

### 검색어 입력 방법 1 - 돋보기 버큰 클릭
# 검색 <div input - //*[@id="autocompleteWrapper"]/input[1] 에 '무선마우스' 입력
browser.find_element_by_xpath('//*[@id="autocompleteWrapper"]/input[1]').send_keys('무선마우스')
time.sleep(0.5)
browser.find_element_by_xpath('//*[@id="autocompleteWrapper"]/a[2]').click()  # 검색 버튼 클릭

# ### 검색어 입력 방법 2 - 검색어 입력 후 엔터
# elem = browser.find_element_by_xpath('//*[@id="autocompleteWrapper"]/input[1]')
# elem.send_keys('무선마우스')
# time.sleep(0.5)
# elem.send_keys(Keys.ENTER)


# ## 스크롤 하는 방법 
# # - 지정한 위치(모니터 해상도 기준 높이)로 내리기
# browser.execute_script('window.scrollTo(0, 1080)')  # 세로 위치 1080으로 스크롤
# browser.execute_script('window.scrollTo(0, 2080)')  # 숫자를 늘림

# # - 화면 가장 아래로 스크롤 내리기 - 네이버 쇼핑은 또 다른 화면(페이지)이 하단에 생김
# browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')


## 동적페이지 맨 마지막까지 스크롤 반복 수행하는 방법 - 네이버 쇼핑 스크롤
interval = 2  # 2초에 한 번씩 스크롤 내리기
prev_height = browser.execute_script('return document.body.scrollHeight') # 현재 문서 높이
while True:
    # 스크롤을 화면 가장 아래로 한 번 내리고, 그 위치를 직전 높이와 비교하면서 반복 수행
    browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
    time.sleep(interval)
    curr_height = browser.execute_script('return document.body.scrollHeight')
    if curr_height == prev_height:
        break
    prev_height = curr_height

# 맨 위로 올리기
time.sleep(interval)
browser.execute_script('window.scrollTo(0, 0)')

time.sleep(5)
browser.quit()

 

■ 웹 페이지 내 특정 엘리먼트 스크롤 하기

# 페이지 내 특정 영역을 스크롤해야 할 경우 - 예, 좌측 메뉴 스크롤
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time

browser = webdriver.Chrome()
browser.maximize_window()

url = 'https://www.w3schools.com/html/default.asp'
browser.get(url)
time.sleep(3)

# 좌측 메뉴 스크롤 해서 HTML Tag List 항목 보이게
elem = browser.find_element_by_xpath('//*[@id="leftmenuinnerinner"]/a[61]')

# # 방법 1 - ActionChains
# actions = ActionChains(browser).move_to_element(elem).perform()

# 방법 2 - 좌표 정보 이용하는 변수 사용
xy = elem.location_once_scrolled_into_view  # 함수 아닌 변수
print(type(xy), xy)  # <class 'dict'> {'x': 0, 'y': 268}
elem.click()

time.sleep(5)
browser.quit()

 

■ 핸들(Handle) - 운영체제가 어떤 대상에 대해 식별하기 위한 키값 (브라우저가 뜨면 브라우저마다 핸들번호 부여)

from selenium import webdriver
import time

browser = webdriver.Chrome()
browser.maximize_window()

url= 'https://www.w3schools.com/tags/att_input_type_radio.asp'
browser.get(url)

curr_handle = browser.current_window_handle  # 현재 브라우저 핸들 정보 가져옴
print(curr_handle)  # CDwindow-3B25C8B59F3557298216D54CF8B8572A

# Try it yourself
browser.find_element_by_xpath('//*[@id="main"]/div[2]/a').click()

handles = browser.window_handles  # 모든 핸들 정보
for handle in handles:
    print(f'브라우저 핸들: {handle}')  # 각 핸들 정보
    browser.switch_to.window(handle)  # 각 핸들로 이동해서
    print(f'브라우저 제목: {browser.title}')

# 새로 이동한 브라우저에서 작업

print('현재 핸들 닫기')
browser.close()  # 작업중인 브라우저 종료

# 이전 핸들로 돌아오기
print('처음 핸들로 돌아오기')
browser.switch_to.window(curr_handle)
print(f'브라우저 제목: {browser.title}')

time.sleep(3)
browser.get('http://daum.net')  # 브라우저 컨트롤 가능 확인

time.sleep(5)
browser.quit()

 

댓글