반응형

셀레니움 기본 예제 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')

 

반응형

+ Recent posts