Window, mac(intel)
mac(M1)
버전 앞 큰 수만 기억하기
BeautifulSoup만으로 해결할 수 없는 것
- 접근할 웹 주소를 알 수 없을 때
- 자바스크립트를 사용하는 웹페이지의 경우
- 웹 브라우저로 접근하지 않으면 안될 때
- 동적 페이지(서버 내부에 변화가 일어남)
스크롤을 내리니 코드가 더 늘어나는 것을 볼 수 있다.
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome("../driver/chromedriver.exe")
driver.get("https://www.naver.com")
새로운 웹 브라우저가 생성되면 설치 완료 된 것
맥은 권한 설정 필요
꼭 quit을 이용하여 종료해줘야 한다. 아니면 여러 창이 아래 생성 되어 있을 수 있음
driver.quit()
왼쪽 문법에서 오른쪽 문법으로 변경되었으니 잘 숙지해야한다.
페이지의 태그에서 데이터를 가져 올 때 화면의 크기가 작거나 스크롤로 인해 데이터가 화면에 나타나지 않는 경우 해당 태그가 존재하고 있지 않을 수가 있다.
따라서 화면 크기를 크게 설정하면 도움이 될 수 있다.
driver.maximize_window()
크기 조절 전
크기 조절 후
driver.minimize_window()
driver.set_window_size(600, 600)
driver.refresh()
driver.back()
driver.forward()
해당 태그에서 오른쪽 클릭 > copy > copy selector
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()
클릭 전
클릭 후
driver.execute_script('window.open("https://www.naver.com/")') # 자바 스크립트 코드 사용
len(driver.window_handles)
driver.switch_to.window(driver.window_handles[1])
driver.close()
최종적으로 quit을 잘 해줘야한다. 안그러면 컴퓨터 자원을 계속 사용하고 있어 컴퓨터가 다운될 수 있다.
driver.quit()
()안에 자바스크립트 언어를 이용하겠다.
driver.execute_script("return document.body.scrollHeight")
document(=html)에서 body 태그에서 전체 스크롤 할 수 있는 크기를 반환해라
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
driver.execute_script('window.scrollTo(0, 0)')
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
현재 화면이 저장되었다.
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()
from selenium import webdriver # selenium을 이용하여 크롬 제어하기 위함
from selenium.webdriver.common.by import By # 태그 선택 위함
driver = webdriver.Chrome("../driver/chromedriver.exe")
driver.get("https://www.naver.com/")
keyword = driver.find_element(By.CSS_SELECTOR, "#query")
keyword.clear() # 원래 있던 검색어 지움
keyword.send_keys('딥러닝')
search_btn = driver.find_element(By.CSS_SELECTOR, "#search_btn")
search_btn.click()
CSS_SELECTOR와 동일하지만 TAG 찾는 방법만 조금 달라짐
BeautifulSoup에서는 사용 불가능, selenium에서만 사용 가능
'//': 최상위
'*': 자손 태그 -> ex. 태그 두개 아래 있는 태그
'/': 자식 태그 -> 태그 바로 밑
'div[1]': div 중에서 1번째 태그
해당 태그에서 오른쪽 클릭 > copy > copy XPath
driver.find_element(By.XPATH, '//*[@id="query"]').send_keys('xpath')
driver.find_element(By.XPATH, '//*[@id="search_btn"]').click()
from selenium import webdriver # selenium을 이용하여 크롬 제어하기 위함
from selenium.webdriver.common.by import By # 태그 선택 위함
driver = webdriver.Chrome("../driver/chromedriver.exe")
driver.get("https://pinkwink.kr/")
처음 웹 화면에 검색어 입력창이 나타나지 않고 돋보기를 클릭했을 때 검색창이 나타난다. 하지만 돋보기 버튼 클릭을 했을 때 에러가 발생
driver.find_element(By.CSS_SELECTOR, "#header > div.search").click()
그렇다면 input 태그에 바로 검색어를 입력하는 것은 가능한지 실험을 해보자.
안된다. 그렇다면 직접 돋보기를 클릭한 후 검색을 해보면 작동 된다.
돋보기 클릭 전(search)
돋보기 클릭 후(search on )
돋보기 클릭 전과 클릭 후 class 이름이 변화하는 것을 볼 수 있다.
이것은 동적 페이지 기능 중 하나이다. -> 일반적인 방식으로 동작하지 않는다.
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 코드 가져오기
driver.page_source
from bs4 import BeautifulSoup
req = driver.page_source
soup = BeautifulSoup(req, "html.parser")
soup.select('.post-item')
contents = soup.select('.post-item')
len(contents)
contents[2] # 두 번째 컨텐츠 가져오기
"이 글은 제로베이스 데이터 취업 스쿨 강의를 듣고 작성한 내용으로 제로베이스 데이터 취업 스쿨 강의 자료 일부를 발췌한 내용이 포함되어 있습니다."