1. 셀레늄
Selenium Documentation
설치 코드
- conda install selenium (윈도우, mac intel)
- pip install selenium
Beautiful Soup 만으로 해결할 수 없는 것
- 접근할 웹 주소를 알 수 없을 때
- 자바스크립트를 사용하는 웹페이지의 경우(동적페이지)
- 웹 브라우저로 접근하지 않으면 안될 때
Selenium:
- 웹 브라우저를 원격 조작하는 도구
- 자동으로 URL을 열고 클릭 등이 가능
- 스크롤, 문자의 입력, 화면 캡처 등등
2. selenium webdriver 사용하기
- 윈도우에서는 'chromedriver.exe'처럼 'exe'를 붙여함
- 작업 다하면 'quit()'로 꼭 닫기 → 자원이 계속 사용되는 것 방지
- 'https://' or 'http://' 넣지 않으면 안 나오는 경우 존재
- 화면 크기 설정: maximize_window, minimize_window, set_window_size()
- 화면 내 이동, 탭 이동, 클릭, 닫기
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome(executable_path='../driver/chromedriver')
driver.get('https://pinkwink.kr')
driver.quit()
driver.maximize_window()
driver.minimize_window()
driver.set_window_size(600, 600)
driver.refresh()
driver.back()
driver.forward()
frist_content = driver.find_element(By.CSS_SELECTOR, '#content > div.cover-masonry > div > ul > li:nth-child(1)')
frist_content.click()
driver.execute_script('window.open("http://naver.com")')
driver.switch_to.window(driver.window_handles[0])
driver.close()
driver.quit()
find_element, find_elements
- find_element: 해당 객체 하나 찾기
- find_elements: 해당 객체 모두 찾기
from selenium import webdriver
from selenium.webdriver.common.by import By
driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_elements(By.XPATH, '//button')
'''
ID = "id"
NAME = "name"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
find_element(By.ID, "id")
find_element(By.NAME, "name")
find_element(By.XPATH, "xpath")
find_element(By.LINK_TEXT, "link text")
find_element(By.PARTIAL_LINK_TEXT, "partial link text")
find_element(By.TAG_NAME, "tag name")
find_element(By.CLASS_NAME, "class name")
find_element(By.CSS_SELECTOR, "css selector")
'''
3. 화면 스크롤
from selenium import webdriver
driver = webdriver.Chrome(executable_path='../driver/chromedriver')
driver.get('http://pinkwink.kr')
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);')
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()
4. 검색어 입력
- CSS_SELECTOR
- XPATH → 이름 쌍따옴표를 가져오기 때문에 작은 땨옴표를 사용하기
- '//': 최상위
- '*': 자손 태그
- '/': 자식 태그
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome('../driver/chromedriver')
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()
driver.find_element(By.XPATH, '//*[@id="query"]').send_keys('xpath')
driver.find_element(By.XPATH, '//*[@id="search_btn"]').click()
driver.quit()
---------------------------------------------------------
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome('../driver/chromedriver')
driver.get('https://pinkwink.kr')
from selenium.webdriver import ActionChains
search_tag = driver.find_element(By.CSS_SELECTOR, '.search')
action = ActionChains(driver)
action.click(search_tag).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()
5. selenium + BeautifulSoup
from bs4 import BeautifulSoup
req = driver.page_source
soup = BeautifulSoup(req, 'html.parser')
soup.select('.post-item')
contents = soup.select('.post-item')
``