Selenium
Selenium 기초
- beautifulsoup보다 직관적
- web driver (주로 chromedriver) 사용
- 클릭하거나 스크롤을 내리는 등 웹페이지 원격 조정 가능
- 웹 어플리케이션 테스트를 위해 고안된 도구이기 때문
- requests 활용의 한계 보완
- 로그인이 필요한 사이트는 웹 스크래핑이 힘들다.
- 동적으로 html을 만드는 경우
- 동적으로? : 전체 페이지가 리로딩 되는 것이 아니라, 부분만 정보가 업데이트 되는 html.
- 스크롤하거나, 클릭하면 데이터가 생성되나, url주소가 변경되지 않고 데이터가 변하는 특징.
- 주로 표, 테이블 형태의 데이터
설치
1 |
|
웹 드라이버 설정 (colab 기준)
1 |
|
1 |
|
실행
1 |
|
1 |
|
-
요소 하나 가져오기 vs 요소 여러개 가져오기
- 하나 가져올 때
1
driver.find_element_by
- 여러개 가져올 때
1
driver.find_elements_by
- find_elements로 복수의 요소들 가져올 수 있다.
- 이땐 for 반복문 사용해서 하나씩 리스트에 넣어주거나 프린트 할 수 있다.
- 하나 가져올 때
-
css selector
- select 활용 : 확실한 경로로 지정해주기 때문에 가져오고 싶은 요소 정확히 가져올 수 있음.
- copy selector :
웹페이지 > 마우스 오른쪽 클릭 > 검사 > copy > copy selector
> 붙여넣기 - ex)
1
labels = driver.select('#wrapper > section > div > div > div:nth-child(1) > div > div:nth-child(1) > label')
-
위의 예시에서
div:nth-child(1)
: div의 자식(소속) 중 첫번째 가져오기 - 따라서 모든 자식(label)들을 한꺼번에 가져오고 싶다면,
div
뒤의:nth-child(1)
을 빼고 아래처럼 써주면 된다.1
labels = driver.find_elements_by_css_selector('#wrapper > section > div > div > div > div > div > label')
-
xpath
- copy xpath 활용
- Xpath 구문 의미 및 연습 : w3schools
- ex)
1
labels = driver.find_elements_by_xpath('//*[@id="wrapper"]/section/div/div/div/div/div/label')
-
find_elements(By.~, '찾는 것')
-
find_elements_by~ 접근법 대신 사용 가능
1
2find_elements(By.TAG_NAME,'찾는 것 이름') find_elements(By.CSS_SELECTOR,'찾는 것 위치')
-
ex)
1
2
3
4from selenium.webdriver.common.by import By for label in driver.find_elements(By.TAG_NAME, 'label'): print(label.text)
- 해당 코드랑 동일함 (find_elements_by_tag_name)
1
2for label in driver.find_elements_by_tag_name('label'): print(label.text)
- 해당 코드랑 동일함 (find_elements_by_tag_name)
-
-
기타 이용법
- 태그의 속성 가져오기 (ex. a 태그의 속성인 href 가져오기)
1
driver.find_element_by_tag_name('a').get_attribute('href')
- find_elements로 찾은 elements가 담긴 리스트 안에서 마지막꺼 가져오고 싶을 때 ==> 인덱스로 찾기
1
driver.find_elements_by_tag_name('li')[-1]
- 태그의 속성 가져오기 (ex. a 태그의 속성인 href 가져오기)
Reference
- selenium : 이수안컴퓨터연구소 youtube