[EDA] Selenium 기초

쩡이·2023년 8월 9일

EDA

목록 보기
8/12

Beautiful Soup으로 해결할 수 없는 것

접근할 웹 주소를 알 수 없을 때
자바스크립트를 사용하는 웹페이지의 경우
웹 브라우저로 접근하지 않으면 안될 때 -> 예를 들어 인스타그램처럼 스크롤을 내리면 계속 컨텐츠 내용이 생겨나는 형태의 페이지 -> 동적페이지 기능 중 하나

셀리니움의 웹 브라우저를 동작하는 기능을 이용해서 크롤링 하기 위해 셀리니움을 배워본다.

Selenium

  • 웹 브라우저를 원격 조작하는 도구
  • 웹 브라우저를 테스트하기 위해 만들어짐
  • 어떤 서비스가 웹 브라우저에서 정상 작동하는지? 테스트 하기 위해 만들어진 도구
  • 자동으로 URL을 열고 클릭 등이 가능
  • 스크룰, 문자의 입력, 화면 캡처 등등이 필요한 경우
    셀레니움을 사용한다.

Selenium 설치

  • 윈도우, mac(intel)

    • conda install selenium
  • mac(m1)

    • !pip install selenium
  • chromdriver 설치

    • 크롬에서 오른쪽 상단에 점 세개 - 도움말 - chrome 정보
    • 아래 사진에서 크롬 버전을 확인, 제일 앞자리 숫자만 -> 115
    • chromedrive download 검색 후, 버전에 맞는 파일 설치

설치확인했는데
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()

Selenium 기초

참고사이트
https://www.selenium.dev/documentation/

1. selenium webdriver 사용하기

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()를 넣어줘야 실행됨

검색어 입력

  • CSS_SELECTOR
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()
  • XPATH
'//' : 최상위 루트
'*' : 자손 태그 - 바로밑에 밑에 있는 태그
'/' : 자식 태그 - 바로 밑에 속해 있는 태그
'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. 검색 버튼 클릭

  1. 돋보기 버튼 선택에서 돋보기 버튼을 개발자 도구에서 코드를 살펴보면 돋보기 버튼을 누르기 전과, 누르고 난 후 코드가 바뀐다. 즉, 동적페이지로 구성되어있다. 따라서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

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]

0개의 댓글