IT 대장간
[파이썬] 업무 자동화 5.웹페이지 & 셀레늄 본문
글을 작성하기에 앞서 내용 자체가 워낙 활용할 부분들이 많고 방대하다고 느꼈기에 코드 위주의 글작성이 되겠다.
단, 크롤링은 소개하지 않음
이 글에서는 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 속성값을 통한 '검색' 기능 클릭 수행
- 브라우저 화면 스크린샷 (상위 경로 지정없을 경우 워크스페이스에 저장)

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)가 더 이상 늘어나지 않을 경우 스크롤 이동 반복을 멈추고 맨위로 이동한다.
'Programing > Python' 카테고리의 다른 글
| [파이썬] 로그 남기기 (3) | 2021.03.16 |
|---|---|
| [파이썬] 업무자동화 2.이미지 기반 (0) | 2021.03.15 |
| [파이썬] 업무자동화 1. 마우스 이동 (1) | 2021.03.15 |
| 게임만들기 - [2] 캐릭터 이동, 프레임, 충돌처리 (0) | 2021.02.25 |
| 게임만들기 - [1] 화면 프레임, 캐릭터, 배경 (2) | 2021.02.25 |