셀레니움 기본 예제 2
1. 페이지 응답 처리
browser.find_element_by_link_text("...").click()
try:
elem = WebDriverWait(broswer, 10).until(EX.presence_of_element_located(By.XPATH, " ")
print(elem.text())
# 성공 작업 ...
finally:
broser.quit()
예제 코드
from selenium import webdriver
# 경로 설정
path = 'C:\chromedriver_win32\chromedriver.exe' # 자신의 드라이버 위치로 설정
url = '원하는 url 경로'
# 드라이버 설정
driver = webdriver.Chrome(path)
driver.implicitly_wait(10) # seconds 기다리기
# 경로 설정
driver.get(url)
driver.implicitly_wait(10) # seconds 기다리기
#드라이버 끝내기
driver.quit()
from selenium import webdriver
# 경로 설정
path = 'C:\chromedriver_win32\chromedriver.exe' # 자신의 드라이버 위치로 설정
url = '원하는 url 설정'
# 드라이버 설정
def drive_path(x, path):
global driver # 전역변수 선언하기
if x == 'chrome':
driver = webdriver.Chrome(path)
else:
print('driver 새로 설정하세요')
# url 설정
def url_move(url):
if isinstance(url, str):
driver.get(url)
else:
driver.get(str(url))
# 실행 부분
if __name__ == '__main__': # True
drive_path('chrome',path) # driver 설정
driver.implicitly_wait(10) # seconds 기다리기
url_move(url) # 설정한 url을 url_move에 넣기
driver.implicitly_wait(10) # seconds 기다리기
#드라이버 끝내기
driver.close()
driver.quit()
2. 브라우저 옵션
driver설정 후, 원하는 url로 접근하면 새 크롬 창이 뜨고, 해당 url 주소로 접속한다.
브라우저를 열 때 옵션을 정해줄 수 도 있다.
윈도우 사이즈 설정
options = webdriver.ChromeOptions()
options.add_argument('window-size=1920,1080')
driver = webdriver.Chrome(path, options=options)
헤드리스 설정
options = webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome(path, options=options)
창 최대화 설정
# 방법 1
options = webdriver.ChromeOptions()
options.add_argument('start-maximized')
driver = webdriver.Chrome(path, options=options)
# 방법 2
driver.maximize_window()
3. 이전/이후 페이지 이동
뒤로 이동, 앞으로 이동
driver.back() #뒤로
driver.forward() #앞으로
4. 탭 이동 및 닫기
driver.window_handles[0] #브라우저 탭 객체를 리스트로 반환
# [0]은 첫번재 탭 의미
driver.switch_to.window(driver.window_handles[0]) #첫번째 탭으로 이동
driver.switch_to.window(driver.window_handles[1]) #두번째 탭으로 이동
driver.switch_to.window(driver.window_handles[2]) #세번째 탭으로 이동
탭 닫기
driver.switch_to.window(driver.window_handles[0]) #닫을 탭으로 이동
driver.close() #현재 탭 닫기
5. Selenium driver 객체의 메소드
driver. 또는 browser. 형태 이름으로 많이 사용한다.
페이지의 단일 element에 접근하기
(페이지의 여러 elements에 접근하고 싶을 때, 보통 element를 elements로 바꾸면 된다.)
driver.find_element_by_xpath('/html/body/div[2]/~~~') # xpath로 접근
driver.find_element_by_class_name('class_name') # class 속성으로 접근
driver.find_element_by_id('id') # id 속성으로 접근
driver.find_element_by_link_text('텍스트') # 링크 달린 텍스트로 접근
driver.find_element_by_css_selector('#account > div > a') # css 셀렉터로 접근
driver.find_element_by_name('name') # name 속성으로 접근
driver.find_element_by_partial_link_text('link_text') # 링크 달린 엘레먼트에 텍스트 일부로 해당 엘레먼트 접근
driver.find_element_by_tag_name('tag_name') # 태그 이름으로 접근
driver.find_element_by_tag_name('tag_name').find_element_by_tag_name('a') # tag_name 태그의 하위태그인 a 태그 접근
driver.find_element_by_xpath('/html/body/div[2]~~~').find_element_by_name('name') # xpath로 접근한 엘레먼트의 안에 name 속성을 가진 tag 엘레먼트 접근
6. 클릭, 키 조작 수행
클릭하기: .click()
키 입력하기: .send_keys()
.send_keys('텍스트 입력') 으로 텍스트를 입력할 수 있다.
명령어 기능
-----------------------------------------------
Keys.ENTER 엔터
Keys.RETURN
Keys.SPACE 스페이스
Keys.ARROW_UP 방향키 (상하좌우)
Keys.ARROW_DOWN
Keys.ARROW_LEFT
Keys.ARROW_RIGHT
Keys.BACK_SPACE 지우기 (백스페이스)
Keys.DELETE 지우기 (딜리트)
Keys.CONTROL 자주 사용하는 기능키
(Ctrl, Alt, Shift, Tab)
Keys.ALT
Keys.SHIFT Keys.TAB
Keys.SHIFT Keys.TAB
Keys.PAGE_UP 스크롤 업
Keys.PAGE_DOWN 스크롤 다운
Keys.F1~9 F1부터 F9 (F + 숫자)
Keys.EQUALS 기타 등등
Keys.ESCAPE
Keys.HOME Keys.INSERT
Keys.HOME Keys.INSERT
7. 단축키 입력 방법
from selenium.webdriver.common.keys import Keys
# 방법 1 (Ctrl+V)
driver.find_element_by_id('id').send_keys(Keys.CONTROL + 'v')
# 방법 2
from selenium.webdriver import ActionChains
ActionChains(driver).key_down(Keys.CONTROL).send_keys('V').key_up(Keys.CONTROL).perform()
# 위에서 driver 대신 엘리먼트를 입력해도 OK
8. 데이터 가져오기
class_name, name, tag_name, id, css_selector를 통해 데이터를 가져올 수 있다.
find_element를 이용하면 처음 것만 가져오고,
find_elements를 이용하면 전체를 가져온다
#class_name을 통해 처음 한 개 가져오기
title=driver.find_element_by_class_name('class_name입력')
print(title.text)
# tag_name을 통해 모두 가져오기(리스트)
titles=driver.find_elements_by_tag_name('tag 입력 (ex: h2)') # 해당 태그 가진 데이터 전체 저장
for title in titles:
print(title.text)
9. Google에서 파이썬 공식 홈페이지 이동
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import time
# 경로 설정
path = 'C:\chromedriver_win32\chromedriver.exe'
url = 'https://www.google.co.kr/'
# 드라이버 설정
def drive_path(x, path):
global driver # 전역변수 선언하기
if x == 'chrome':
driver = webdriver.Chrome(path)
else:
print('driver 새로 설정하세요')
# url 설정
def url_move(url):
if isinstance(url, str):
driver.get(url)
else:
driver.get(str(url))
# 실행
drive_path('chrome',path)
print('드라이버 설정 완료')
print('-----------------------')
url_move(url)
print('url로 창 열기 완료')
print('-----------------------')
driver.implicitly_wait(10) # 10초 기다리기
# 공식 홈페이지 검색하기
# 텍스트 입력하기
point = driver.find_element_by_xpath('/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input')
point.send_keys('파이썬 공식 홈페이지')
# 입력 후 엔터
point.send_keys(Keys.ENTER)
# 파이썬 홈페이지로 이동하기
driver.find_element_by_xpath('//*[@id="rso"]/div[1]/div/div/div/div/div/div[1]/a/h3').click()
# 다운로드 칸 클릭하기
driver.find_element_by_xpath('//*[@id="downloads"]/a').click()
# 드라이버 끝내기
driver.quit()
10. Table 읽기
selenium으로 테이블을 읽는 방법은 구조를 파악했으면 어렵지 않게 유추할 수 있다.
table element에 먼저 접근한 뒤,
필요에 따라 thead, tbody, tfoot 영역에 접근하고
순서대로 tr, td 요소에 접근한다. 즉, 반복문을 이용하면 된다.
테이블의 모든 데이터가 필요한 게 아니면 적절히 접근 영역을 조절한다.
코드
table 요소의 하위 요소는 tag 이름으로 찾아들어간다.
from selenium import webdriver
driver_path = 'PATH'
driver = webdriver.Chrome(driver_path)
# table element 접근. 찾는 속성은 적절하게 고려한다.
table = driver.find_element_by_xpath("TABLE_XPATH")
# thead
thead = table.find_element_by_tag_name("thead")
# thead > tr > th
thead_th = thead.find_element_by_tag_name("tr").find_elements_by_tag_name("th")
for th in thead_th:
print(th.text) # text 속성 읽기
# tbody
tbody = table.find_element_by_tag_name("tbody")
# tbody > tr > td
for tr in tbody.find_elements_by_tag_name("tr"):
for td in tr.find_elements_by_tag_name("td"):
print(td.get_attribute("innerText"))
# tfoot
tfoot = table.find_element_by_tag_name("tfoot")
thead_th = tfoot.find_element_by_tag_name("tr").find_element_by_tag_name("td")
예시)
실행 예시로 https://finance.daum.net/domestic의 표 일부를 읽으려고 한다.
tbody 영역만을 읽어보려고 한다.
코드
from selenium import webdriver
driver_path = 'D:\projects\selenium_test\driver\chromedriver.exe'
driver = webdriver.Chrome(driver_path)
url = "https://finance.daum.net/domestic"
driver.get(url)
# table
table = driver.find_element_by_xpath('//*[@id="boxMarketTrend"]/div[3]/div[1]/table')
# tbody
tbody = table.find_element_by_tag_name("tbody")
for tr in tbody.find_elements_by_tag_name("tr")[:5]:
txt = tr.find_element_by_tag_name("th").get_attribute("innerText")
for td in tr.find_elements_by_tag_name("td")[:3]:
txt += " " + td.get_attribute("innerText")
print(txt)
-----------------------------------------------------------------------------
from selenium import webdriver
import pandas as pd
import time
driver=webdriver.Chrome("C:/Users/user/Downloads/chromedriver_win32 (14)/chromedriver")
driver.get("https://www.airport.co.kr/www/extra/stats/timeSeriesStats/layOut.do?menuId=399")
try:
for i in range(2001, 2020):
#원하는 연도 설정
driver.find_element_by_xpath('//*[@id="strStYear"]/option[text() ='+str(i)+']').click()
driver.find_element_by_xpath('//*[@id="strEnYear"]/option[text() ='+str(i)+']').click()
driver.find_element_by_xpath('//*[@id="strStMonth"]/option[text() ="1"]').click()
driver.find_element_by_xpath('//*[@id="strEnMonth"]/option[text() ="12"]').click()
driver.find_element_by_xpath('//*[@id="statsForm"]/div[2]/div/div[2]/button').click()
#해당 연도 항공통계 데이터 불러오기
page = driver.page_source
soup = BeautifulSoup(page, 'html.parser')
temp = soup.find_all('table')
p = parser.make2d(temp[1])
data = pd.DataFrame(p[2:], columns=p[0])
#각 데이터 합치기
df = pd.concat([df,data])
except:
print('error')
'웹 크롤링, 스크래핑' 카테고리의 다른 글
셀레니움 quit(), close() 사용법 (0) | 2022.07.09 |
---|---|
봇 접근 차단 사이트 접속 (0) | 2022.07.09 |
Selenium, 윈도우 최대화, 윈도우 스크롤 내리기 (0) | 2022.07.07 |
Selenium - 동적 사이트 테이블 Crawling (!!!) (0) | 2022.07.04 |
Selenium 웹 테이블, 프레임 및 동적 요소 처리 (0) | 2022.07.04 |