크롤링 셀레늄 기능들 - 크롤러 기본 사용법

크롤링 셀레늄 기능들 - 크롤러 기본 사용법

반응형

Selenium Intro

브라우저를 컨트롤을 가능하게 해줌

Python 같은 경우, 3.5 이상부터 지원되며 3.6 이상 버전 부터 pip 로 표준 라이브러리로 사용할 수 있음

사용 가능한 브라우저는 하단에 리스트업

설치 코드

pip install selenium

Driver 다운로드 링크 , 크롬,엣지,파이어폭스, 사파리

브라우저 열기 (chrome)

from selenium import webdriver driver = webdriver.Chrome('chromedriver.exe')

권장 브라우저 열기 코드

브라우져 열기 옵션 넣기

크롬 브라우저를 열 때 넣을 수 있는 옵션을 셀레니움에서도 사용이 가능하다.

윈도우 사이즈

from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('window-size=1920,1080') driver = webdriver.Chrome('chromedriver.exe', options=options)

Headless ( 창을 키지 않고 실행하는 것, 유튜브 같은 곳에서 좋음)

from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('headless') driver = webdriver.Chrome('chromedriver.exe', options=options)

창 최대화 maxmize

from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('start-maximized) driver = webdriver.Chrome('chromedriver.exe', options=options) # 이 방법 이외에는 다음 방법 driver.maximize_window()

브라우저 닫기 Close

driver.close() #현재 탭 닫기 driver.quit() #브라우저 닫기

뒤로가기 Back / 앞으로가기 Front

driver.back() #뒤로가기 driver.forward() #앞으로가기

탭 이동 Tab Move

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]) #세번째 탭으로 이동

탭 닫기 Tab close

driver.switch_to.window(driver.window_handles[0]) #닫을 탭으로 이동 후 driver.close()

엘레먼트에 관하여

우리는 웹브라우저에서 로그인도 하고 버튼도 클릭하고 검색창에 텍스트를 입력하기도 한다. 이렇게 브라우저 상에서 보이는 버튼, 검색창, 사진, 테이블, 동영상 등등 이 모든 것들을 엘레먼트(element, 요소) 라고 부른다. 셀레니움은 우리가 브라우저에서 특정 요소를 클릭하고 텍스트를 입력하고 사진등을 받아오고 텍스트를 가져오는 등등 어떠한 위치에 있는 무언가를 부를 때 엘레먼트라는 개념으로 접근한다. 다양한 방법으로 엘레먼트로 접근할 수 있는데 대부분 xpath 를 사용한다.

엘레먼트 접근하는 방법

driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div/div[3]/form/fieldset/button/span[2]') #xpath 로 접근 driver.find_element_by_class_name('ico_search_submit') #class 속성으로 접근 driver.find_element_by_id('ke_kbd_btn') #id 속성으로 접근 driver.find_element_by_link_text('회원가입') #링크가 달려 있는 텍스트로 접근 driver.find_element_by_css_selector('#account > div > a') #css 셀렉터로 접근 driver.find_element_by_name('join') #name 속성으로 접근 driver.find_element_by_partial_link_text('가입') #링크가 달려 있는 엘레먼트에 텍스트 일부만 적어서 해당 엘레먼트에 접근 driver.find_element_by_tag_name('input') #태그 이름으로 접근 driver.find_element_by_tag_name('input').find_element_by_tag_name('a') #input 태그 하위태그인 a 태그에 접근 driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div/div[3]/form/fieldset/button/span[2]').find_element_by_name('join') #xpath 로 접근한 엘레먼트의 안에 join 이라는 속성을 가진 tag 엘레먼트에 접근

엘레먼트 클릭

driver.find_element_by_id('ke_kbd_btn').click()

텍스트 입력

driver.find_element_by_id('ke_awd2_btn').send_keys('텍스트 입력')

텍스트 삭제

driver.find_element_by_id('ke_awd2_btn').clear()

단축키 입력

from selenium.webdriver.common.keys import Keys # 컨트롤+V driver.find_element_by_id('ke_kbd_btn').send_keys(Keys.CONTROL + 'v') # 다른 방법 from selenium.webdriver import ActionChains ActionChains(driver).key_down(Keys.CONTROL).send_keys('V').key_up(Keys.CONTROL).perform() #위에서 driver 대신 엘리먼트를 입력해도 좋음.

Frame 이동

#이동할 프레임 엘리먼트 지정 element = driver.find_element_by_tag_name('iframe') #프레임 이동 driver.switch_to.frame(element) #프레임에서 빠져나오기 driver.switch_to.default_content()

경고창 (alert)

경고창이 떴을 때 수락 또는 거절을 눌러주거나 경고창의 텍스트를 가져올 수 있다.

경고창 이동

#경고창으로 이동 driver.switch_to.alert

경고창 수락 / 거절

from selenium.webdriver.common.alert import Alert Alert(driver).accept() #경고창 수락 누름 Alert(driver).dismiss() #경고창 거절 누름 print(Alert(driver).text # 경고창 텍스트 얻음

쿠키 값 얻기

#쿠키값 얻기 driver.get_cookies() #쿠키 추가 driver.add_cookie() #쿠키 전부 삭제 driver.delete_all_cookies() #특정 쿠기 삭제 driver.delete_cookie(cookiename)

자바스크립트 코드 실행

자바스크립트를 실행할 수 있다. 자주 그리고 많이 사용하는 자바스크립트 몇개를 알아본다.

스크롤 이동

#브라우저 스크롤 최하단으로 이동 driver.execute_script('window.scrollTo(0, document.body.scrollHeight);') # CSS 셀렉터로 클릭 driver.execute_script("document.querySelector('body > div.modal-options__buttons > button.btn.btn-primary').click();") #또는 elemToclick = driver.~~~ driver.execute_script('arguments[0].click();', elemToclick) # driver.find_element_by_css_selector(~~).click() 과 동일하나 이 코드가 작동하지 않을시 자바스크립트 코드를 시도해볼만하다. # 스크롤 특정 엘리먼트로 이동 element = driver.find_element_by_css_selector('div > a') driver.execute_script('arguments[0].scrollIntoView(true);', element)

새 탭 열기

driver.execute_script('window.open("https://naver.com");')

스크린샷 Screenshot

#캡쳐할 엘레먼트 지정 element = driver.driver.find_element_by_class_name('ico.search_submit') #캡쳐 element.save_screenshot('image.png')

뒤로 Back , 앞으로 Front

# 뒤로가기 driver.back() #앞으로 가기 driver.forward()

예외처리 / Exceptions

from selenium.common.exceptions import NoAlertPresentException, NoSuchElementException, TimeoutException, ElementNotInteractableException,NoSuchWindowException, NoSuchFrameException # NoAlertPresentException 경고창 관련 명령어를 실행했으나 현재 경고창이 뜨지 않음 # NoSuchElementException 엘레먼트 접근하였으나 없음 # TimeoutException 특정한 액션을 실행하였으나 시간이 오래 지나도록 소식이 없음 # ElementNotInteractableException 엘리먼트에 클릭등을 하였으나 클릭할 성질의 엘리먼트가 아님 # NoSuchWindowException 해당 윈도우 없음 # NoSuchFrameException 해당 프레임 없음

shadow DOM 처리

#shadow dom 엘레먼트 열어주는법 element = driver.execute_script("return document.querySelector('#syndi_powerpage > div').shadowRoot").get_attribute('innerHTML') # css Selector 이용 # element 의 HTML 내용 return # shadow dom 처리를 통한 크롬 인터넷 기록 삭제 def expand_shadow_element(element): shadow_root = driver.execute_script('return arguments[0].shadowRoot', element) return shadow_root driver.get('chrome://settings/clearBrowserData') elem = driver.find_element_by_css_selector('body > settings-ui') elem1 = expand_shadow_element(elem) elem1 = elem1.find_element_by_id('main') elem2 = expand_shadow_element(elem1) elem2 = elem2.find_element_by_tag_name('settings-basic-page') elem3 = expand_shadow_element(elem2) elem3 = elem3.find_element_by_tag_name('settings-privacy-page') elem4 = expand_shadow_element(elem3) elem4 = elem4.find_element_by_tag_name('settings-clear-browsing-data-dialog') elem5 = expand_shadow_element(elem4) elem5forconfirmelem = expand_shadow_element(elem4) # 인터넷 사용기록 삭제버튼 클릭을 위한 엘레먼트 따로 빼놓기 elem5 = elem5.find_element_by_id('clearFromBasic') elem6 = expand_shadow_element(elem5) elem6 = elem6.find_element_by_id('dropdownMenu') elem6.find_element_by_css_selector('option[value="4"]').click() # 전체기간 선택 elem5forconfirmelem.find_element_by_id('clearBrowsingDataConfirm').click() #

반응형

from http://ongbike.tistory.com/478 by ccl(A) rewrite - 2021-11-26 06:02:12