접근할 웹 주소를 알 수 없을 때
자바스크립트를 사용하는 웹페이지의 경우
웹 브라우저로 접근하지 않으면 안될 때 -> 예를 들어 인스타그램처럼 스크롤을 내리면 계속 컨텐츠 내용이 생겨나는 형태의 페이지 -> 동적페이지 기능 중 하나
셀리니움의 웹 브라우저를 동작하는 기능을 이용해서 크롤링 하기 위해 셀리니움을 배워본다.
윈도우, mac(intel)
mac(m1)
chromdriver 설치

설치확인했는데
AttributeError: 'str' object has no attribute 'capabilities' 라고 뜨면서 계속 에러가 난다면
셀레니움4부터는 chrome 경로를 입력하면 오류가 난다고 한다.
chrome 경로를 없앴더니 잘 실행이 된다.
!pip install selenium
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.naver.com")
#종료
driver.quit()
참고사이트
https://www.selenium.dev/documentation/
from selenium import webdriver
driver = webdriver.Chrome(executable_path="../driver/chromedriver.exe") #executable_path= 생략가능
driver.get("https://www.naver.com")
driver.quit()
내가 이용할 태그가 화면에 나타나있지 않으면 에러 발생한다.
그래서 화면에 많은 정보를 담고 있도록 크기를 적절히 조정하는 것이 좋다.
# 화면 최대 크기 설정
#maximize_window()는 함수이므로 () 써줘야함
driver.maximize_window()
#화면 최소 크기 설정
driver.minimize_window()
#화면 크기 설정
driver.set_window_size(600,600)
#새로 고침
driver.refresh()
#뒤로 가기
driver.back()
#앞으로 가기
driver.forward()
#클릭하기
#클릭할때 변수명을 받아오기위해서 BY모듈 사용
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) > a > span.thum > img')
first_content.click()
'#content > div.cover-masonry > div > ul > li:nth-child(1) > a > span.thum > img'
#이 붙어있으면 id를 의미함
content라는 id 밑에 div태그를 갖고 있고 거기에 클래스 이름이 cover-masonry이고, 그 바로 밑에 div태그가 있고 그 바로 밑에 ul태그가 있고 그 바로 밑에 li태그가 있다. (1)은 여러개 li 중 1번째라는 의미
#새로운 탭 생성
#자바 스크립트 코드
driver.execute_script('window.open("https://www.naver.com")')
#탭 이동
driver.switch_to.window(driver.window_handles[인덱스])
#지금 떠있는 탭 갯수
len(driver.window_handles)
# 탭 닫기
#close()는 하나씩 닫고, quit()는 전체 닫기
driver.close()
driver.quit()
#현재 보이는 화면 스크린샷 저장
#현재 위치를 의미하는 ./ 생략 가능
driver.save_screenshot('./last_height.png')
내가 이용할 태그가 화면에 나와있지 않으면 그 태그를 가져올 수 없기 때문에 화면 스크롤을 해주거나 해당 태그에 해당하는 내용이 나오게 화면 조정을 해준다.
#스크롤 가능한 높이(길이)
#자바스크립트 코드 실행
#이 document의 body부분에서 scroll의 길이를 반환한다
driver.execute_script('return 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()
(위 코드 설명)
내가 원하는 지점의 태그값을 some_tag에 담아주고
ActionChains를 이용해서 현재 사용중인 드라이버를 넣어주고 이를 제어하겠다
move_to_element 내가 지정한 태그로 이동하겠다. perform()를 넣어줘야 실행됨

from selenium import webdriver
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()
'//' : 최상위 루트
'*' : 자손 태그 - 바로밑에 밑에 있는 태그
'/' : 자식 태그 - 바로 밑에 속해 있는 태그
'div[1]' : div 중에서 1번째 태그
태그 읽어보기
//*[@id="main_pack"]/section[2]/div/div[2]/panel-list/div/ul/li[1]/div/div/a]
최상위 루트에서 시작해서 자손태그중에 아이디가 main_pack이 있고
바로 밑에 selection의 2번째 태그가 있고 그 바로 밑에 div태그가 있고 그 바로 밑에 div2번째 태그가 있고
그 바로 밑에 panel-list태그가 있고 ...
#검색창에 'xpath' 입력
driver.find_element(By.XPATH, '//*[@id="query"]').send_keys('xpath')
#검색창에 검색버튼 클릭
driver.find_element(By.XPATH, '//*[@id="search-btn"]').click()
<아래 사이트에서 검색어 입력해보기>

절차
1. 돋보기 버튼 선택
2. 검색어 입력
3. 검색 버튼 클릭
driver.find_element(By.CSS_SELECTOR,'')로 실행되지 않고, ActionChains를 이용한다.from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome("../driver/chromedriver.exe")
driver.get("https://pinkwink.kr")
# 1. 돋보기 버튼 선택
from selenium.webdriver import ActionChains
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()

selenium을 이용해서 웹 페이지에 접속하고, beautifulsoup을 이용해서 원하는 데이터를 가져온다
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome("../driver/chromedriver.exe")
driver.get("https://pinkwink.kr")
#현재 화면의 html 코드 가져오기
#위에서 웹드라이버를 quit()으로 중단한 경우 경로를 다시 읽어줘야 아래코드가 실행됨
driver.page_source
#beautifulsoup 불러오기
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[1]