❗ Beautiful Soup으로 해결할 수 없는 경우
selenium
selenium은 웹 브라우저를 원격 조작하는 도구이다.
자동으로 URL을 열고 클릭, 스크롤, 문자의 입력, 화면 캡쳐 등을 할 수 있다.
https://www.selenium.dev/documentation/
https://selenium-python.readthedocs.io/installation.html
conda install selenium
https://googlechromelabs.github.io/chrome-for-testing/
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/")
화면에 이용하려는 태그가 존재하지 않으면 에러가 발생하기 때문에, 한 화면에 많은 정보가 담기는 게 더 유리하다.
# 화면 최대 크기 설정
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]) 이동 후 재실행
# 스크롤 가능한 높이(길이)
# 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()
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()
Beautiful Soup에서는 XPath를 사용할 수 없다.
driver.find_element(By.XPATH, '//*[@id="query"]').send_keys("파이썬")
driver.find_element(By.XPATH, '//*[@id="sform"]/fieldset/button').click()
# 돋보기 버튼을 클릭하면 (동적 페이지 기능)
<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()
# 현재 화면의 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">
...
BeautifulSoup(이하 bs)에 대한 설명 중 틀린 것은?
1. bs에서는 동적 페이지에 접근하기 위해 selenium을 호출 할 수 있다. ➡ 정답
2. bs는 html 태그를 해석하는 도구로써 꼭 html이 아니라도 태그로 되어 있는 언어를 해석할 수 있다.
파이썬에서 쌍따옴표(")와 따옴표(')와 세 개 연달아 사용하는 따옴표(''')에 대한 설명으로 틀린 것은?
1. 따옴표 안의 문자열에 쌍따옴표가 있으면 안 된다. ➡ 정답
2. 셋 연달아 사용하는 따옴표는 그 안에 쌍따옴표나 따옴표가 다 올 수 있다.
3. 셋 연달아 사용하는 따옴표는 줄 바꿈도 포함될 수 있다.
🚗🚗🚗