프로젝트 - Selenium Basic

허재정·2024년 2월 28일

EDA

목록 보기
8/13

Selenium 기초

(chrome 브라우저 도움말에서 버전 확인 (122) 이에 따른 driver 다운로드 후 ds_study폴더로 이동 chrome 드라이버를 다운로드 (버전에 맞게) ds_study에 driver 폴더 만들어 안에 download한 드라이버 복사해 넣어둠)

  • 셀레니움 설치
  • 윈도우 mac(intel)
  • conda install selenium
  • mac(m1)
  • pip install selenium (!pip list로 확인가능)
  • chromedriver

!!!주의!!!
selenium의 코드가 바뀜 (인강의 내용과 달라짐 숙지) - 공식문서 확인하기
기존:find_element_by_css_selector('tag') 에서
현재:find_element(By.CSS_SELECTOR('tag')) 로 바뀌었음


google에서 selenium documentation 검색

참고 : - https://www.selenium.dev/documentation/webdriver/getting_started/install_library/


selenium을 사용하는 이유

  • Beautiful Soup만으로 해결할 수 없는것
  • 자바스크립트 사용하는 웹페이지 경우
  • 웹브라우저로 접근하지 않으면 안될 때

selenium 기능

  • web browser를 원격 조작하는 도구
  • 자동으로 url 열고 클릭 등 가능
  • 스크롤, 문자의 입력, 화면 캡처, 앞으로가기, 뒤로가기 등 (스크롤 할 수록 동적으로 스크롤이 늘어나며 정보 보여줌 : instgram, facebook등)

webdriver import

  • web browser 콘트롤 위해 selenium client사용
  • WebDriver (공통 인터페이스) + Browser Driver (각 브라우저 타입별 (Chrome, IE, FireFox 등 기타)
  • webdriver.Chrome() 은 Selenium 브라우저 제어 위한 WebDriver 생성하는 메서드
  • Chrome 브라우저와 동일한 버전 chromedriver 다운로드 받음
    WebDriver의 get() 메서드 사용 특정 URL 웹페이지 열음
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# Chrome webDriver의 실행파일 경로
chrome_driver_path = webdriver.Chrome('../driver/chromedriver.exe')

# Chrome WebDriver 인스턴스 생성 및 실행 파일 경로 지정
service = Service(executable_path = chrome_driver_path driver)

options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service = service, options = options)

get() 함수로 접근하려는 웹 주소 지정

driver.get("https://www.naver.com")

윈도우 창 닫기

driver.quit()
```
----------------------------
------------------------------------
```
### 브라우저 조작
-------------------------------------------
#### 화면 최대 크기 설정

driver.maximize_window()
-----------------------------------------
#### 화면 최소 크기 설정
driver.minimize_window()

------------------------------------
#### 화면 크기 설정
driver.set_window_size(600,600)
-----------------------------------
#### 새로고침
driver.refresh()
-------------------------------------------------------------------------------------
#### 뒤로가기
driver.back()
------------------------------------------------------------------------------------
#### 앞으로 가기
driver.forward() 
-----------------------------------------------------------------------------------
#### 새로운 탭 생성 - 자바스크립트 코드 사용
driver.execute_script('window.open("https://www.naver.com");')
-----------------------------------------
#### 탭 이동
len(driver.window_handles)
driver.switch_to.window(driver.window_handles[0])
-------------------------------------------------
#### 탭 닫기
driver.close()
----------------------------------------------
#### 화면 스크롤

# 위에서 종료했으니 다시 브라우저 띄우기  
# execute_script는 자바스크립트 사용하겠다는 의미
driver.execute_script('return document.body.scrollHeight')

-------------------------------------------------------------------------------------
#### 화면 스크롤 하단 이동
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
-------------------------------------------------------------------------------------
#### 현재 보이는 화면 스크린샷 저장
driver.save_screenshot('./last_height.png')
-------------------------------------------------------------------------------------
#### 화면 스크롤 상단 이동
driver.execute_script('window.scrollTo(0,0);')
-------------------------------------------------------------------------------------
#### 스크린샷
driver.save_screenshot("./screenshot.png")

--------------------------------------------
### 웹 html 요소 검색
- find_element() or find_elements() 사용

from selenium.webdriver.common.by import By    #세로 땡땡땡 클릭 도구더보기 / 개발자도구에서 찾기
first_content = driver.find_element(By.CSS_SELECTOR, '#content > div.cover-masonry > div > ul > li:nth-child(1)')
first_content.click()

--------------------------------------------
원하는 페이지의 ul 밑에 li를 커서 움직이며 원하는 해당 페이지의 li 부분에 우클릭 / 카피 / copy selector
' ' 공백에 tag값 넣어줌 그러면 상세 페이지만 따로 브라우져에 띄워줌 예) #content > div.cover-masonry > div > ul > li:nth-child(1) 에서 #은 ID 의미

from selenium.webdriver import ActionChains

some_tag = driver.find_element(By.CSS_SELECTOR, '#content > div.cover-list > div > ul > li:nth-child(1)')

action = ActionChains(driver)
action.move_to_element(some_tag).perform()
------------------------------------------
#### 브라우저 완전 종료
driver.quit()
-------------------------------------
#### google에서 selenium python document 검색
https://selenium-python.readthedocs.io/

webDrive API에서 Action Chains
다양한 마우스 기능들 담당고할 selenium python document (google에서 검색)

driver.quit()
-----------------------------------------
### 검색어 입력
#### CSS_SELECTOR

- 네이버 검색창에 검색어 입력
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome('../ds_study/driver/chromedriver.exe')
driver.get('https://www.naver.com')

keyword = driver.find_element(By.CSS_SELECTOR, '#query')
keyword.send_keys('파이썬')

- 찾기 (돋보기) 버튼 클릭
search_btn = driver.find_element(By.CSS_SELECTOR, '#search-btn')
search_btn.click
-----------------------------
#### xpath
- '//': 최상위
- '*': 자손 태그
- '/' : 자식 태그
----------------------------------
# 원하는 페이지의 개발자 도구에서 찾아서 저장시 xpath로 함
- 최상위 - 
driver.find_element(By.XPATH, '//*[@id="query"]').send_keys('xpath')

- 자손 태그 -
driver.find_element(By.XPATH, '//*[@id="search-btn"]').click()
driver.quit()

------------------------------------------------------------------------------------
### 검색어 입력 (예제)
#### webdriver import
```
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome('../ds_study/driver/chromedriver.exe') 

driver.get('http://pinkwink.kr')

# 1. 지역 선택 고정
from selenium.webdriver import ActionChains

- 검색어 입력 문법
search_tag = driver.find_element(By.CSS_SELECTOR, '.search')
action = ActionChains(driver)
action.click(search_tag)
action.perform()
-----------------------------------------------------
#### 검색어 입력 (딥러닝 입력해 봄)

driver.find_element(By.CSS_SELECTOR, '#header > div.search > input[type=text]').send_keys('딥러닝')
--------------------------------------
#### 검색버튼 클릭 문법
driver.find_element(By.CSS_SELECTOR, '#header > div.search.on > button').click()
------------------------------------------------------------------------
### selenium + beautifulsoup
- 현재 화면의  html코드 가져오기

from bs4 import BeautifulSoup
req = driver.page_source

# web page의 html 코드를 beautifulsoup으로 읽어와서 
soup = BeautifulSoup(req, 'html.parser')
---------------------------------------------------------
#### 원하는 데이터를 뽑아오도록 제어

soup.select('.post-item')
contents = soup.select('.post-item')
len(contents)
contents[2]
```

profile
Data Science 스터디로그

0개의 댓글