EDA - selenium : 데이터 취업 스쿨 스터디 노트 12/6

slocat·2023년 12월 6일
0

start-data

목록 보기
34/75

❗ Beautiful Soup으로 해결할 수 없는 경우

  • 동적 페이지
  • 접근할 웹 주소를 알 수 없을 때
  • 자바스크립트를 사용하는 웹 페이지일 때
  • 웹 브라우저로 접근하지 않으면 안 될 때

selenium
selenium은 웹 브라우저를 원격 조작하는 도구이다.
자동으로 URL을 열고 클릭, 스크롤, 문자의 입력, 화면 캡쳐 등을 할 수 있다.

https://www.selenium.dev/documentation/
https://selenium-python.readthedocs.io/installation.html

1. selenium 설치

파이썬 모듈 설치

conda install selenium

크롬 드라이버 설치

https://googlechromelabs.github.io/chrome-for-testing/

2. webdrive 사용하기

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains

driver = webdriver.Chrome(executable_path="../driver/chromedriver.exe")

driver로 웹 페이지 띄우기

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

3. 기본 동작

화면 크기

화면에 이용하려는 태그가 존재하지 않으면 에러가 발생하기 때문에, 한 화면에 많은 정보가 담기는 게 더 유리하다.

# 화면 최대 크기 설정
driver.maximize_window()

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

# 화면 크기 설정
driver.set_window_size(600, 600)

새로고침, 뒤로 가기, 앞으로 가기

# 새로고침
driver.refresh()

# 뒤로 가기
driver.back()

# 앞으로 가기
driver.forward()

요소 찾기

https://www.selenium.dev/documentation/webdriver/getting_started/first_script/#5-find-an-element

first_content = driver.find_element(by=By.CSS_SELECTOR, value="#content > div.cover-masonry > div > ul > li:nth-child(1)")
first_content.click()

# 새로운 탭 생성하기
# 괄호 안에 쓰인 코드는 자바스크립트
driver.execute_script("window.open('https://www.naver.com/')")

# 탭 이동하기
driver.switch_to.window(driver.window_handles[1])

# 탭 닫기
driver.close()

# 전체 종료
driver.quit()

❗ Error - driver.close()

NoSuchWindowException: Message: no such window: target window already closed
from unknown error: web view not found

➡ driver.switch_to.window(driver.window_handles[0]) 이동 후 재실행

4. 화면 스크롤

# 스크롤 가능한 높이(길이)
# document.body = html document의 body 부분
driver.execute_script("return document.body.scrollHeight")

# 스크롤 하단 이동
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

# 스크롤 상단 이동
driver.execute_script("window.scrollTo(0, 0);")

# 현재 보이는 화면 스크린샷 저장
driver.save_screenshot("./last_height.png")
# 특정 태그 지점까지 스크롤 이동
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()

5. 검색어 입력

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

search_btn = driver.find_element(By.CSS_SELECTOR, "#sform > fieldset > button")
search_btn.click()

XPath 이용하기

Beautiful Soup에서는 XPath를 사용할 수 없다.

driver.find_element(By.XPATH, '//*[@id="query"]').send_keys("파이썬")
driver.find_element(By.XPATH, '//*[@id="sform"]/fieldset/button').click()
  • // : 최상위 루트 ("query"라는 id 태그 값을 찾기 위한 경로 중 최상위)
    • : 자손 태그 (최상위의 하위에 있는 id 태그의 속성 값에 "query"가 있는지)
  • / : 자식 태그 (바로 밑에 있는 경우)
  • div[1] : div 태그 중에서 1번째 태그
  • 예시)
    //*[@id="fdr-c4670d928a1d4508b7e7882fc43c7d4b"]
    /div/div/div[3]/div[1]/div[2]/div[1]/div/a[1]/span

추가 연습

# 돋보기 버튼을 클릭하면 (동적 페이지 기능)

<div class="search"><div class="search on">
# 돋보기 버튼 선택
search_tag = driver.find_element(By.CSS_SELECTOR, "#header > div.search")
action = ActionChains(driver)
action.click(search_tag)
action.perform()

# 검색어 입력
driver.find_element(By.CSS_SELECTOR, "#header > div.search.on > input[type=text]").send_keys("딥러닝")

# 검색 버튼 클릭
driver.find_element(By.CSS_SELECTOR, "#header > div.search.on > button").click()

6. Selenium + Beautiful Soup

# 현재 화면의 html 코드 가져오기
driver.page_source

# BeautifulSoup
req = driver.page_source
soup = BeautifulSoup(req, "html.parser")

contents = soup.select(".post-item")
contents[0]

>>>
<div class="post-item">
<a href="/1445">
<span class="thum">
...

quiz 오답노트

BeautifulSoup(이하 bs)에 대한 설명 중 틀린 것은?
1. bs에서는 동적 페이지에 접근하기 위해 selenium을 호출 할 수 있다. ➡ 정답
2. bs는 html 태그를 해석하는 도구로써 꼭 html이 아니라도 태그로 되어 있는 언어를 해석할 수 있다.

파이썬에서 쌍따옴표(")와 따옴표(')와 세 개 연달아 사용하는 따옴표(''')에 대한 설명으로 틀린 것은?
1. 따옴표 안의 문자열에 쌍따옴표가 있으면 안 된다. ➡ 정답
2. 셋 연달아 사용하는 따옴표는 그 안에 쌍따옴표나 따옴표가 다 올 수 있다.
3. 셋 연달아 사용하는 따옴표는 줄 바꿈도 포함될 수 있다.

🚗🚗🚗

0개의 댓글