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()
■ 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()
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
[Python] 파이썬을 활용한 업무자동화 - 이메일 보내기 받기 연습 코드 정리 (0) | 2021.07.09 |
---|---|
[Python] 파이썬으로 이메일 리스트(엑셀) 불러와서 email 정상 여부 체크하기 (re 정규식과 openpyxl 사용) (0) | 2021.07.09 |
[Python] 파이썬 파일 시스템(디렉토리, 파일) 다루기 연습 코드 정리 (0) | 2021.07.06 |
[Python] 파이썬을 활용한 업무자동화 - 데스크탑 자동화(pyautogui - 파이썬으로 마우스, 키보드 제어하기) 연습 코드 정리 (0) | 2021.07.06 |
[Python] 파이썬을 활용한 업무자동화 - 엑셀 자동화(with openpyxl) 연습 코드 정리 (0) | 2021.07.01 |
댓글