티스토리 뷰

[Selenium(셀레늄) 사용하기]


그전에 사용했던 Requests와 BeautifulSoup는 HTML문서를 가져오고 Parsing하는 역할을 했습니다.

Selenium은 조금더 업그레이드 해서 브라우저를 가동시켜 HTML문서를 객체화 시킵니다.

직접 브라우저를 가동시키면 어떤점이 다르냐.

웹페이지를 작동시킨 이 후, 나중에 구동되는 Javascript 이 후의 내용도 볼 수 있습니다.


웹페이지가 최초 동작한 이 후, HTML DOM (구조)이 바뀌는 경우에 필수적이죠.

실제로 해외축구 사이트 (프리미어리그, 라리가)와 같은 순위표를 보여주는 사이트에 들어가서 순위를 클릭해보면

최초로 보여지는 테이블 이 후, 현재 순위에 맞게 순위가 정렬되는 걸 아주 찰나에 확인해 볼 수 있습니다.


이런 경우에는 실제로 페이지를 구동시켜야 정확한 데이터를 얻을 수 있죠.


혹은 로그인이 필요한 경우, 로그인을 한 뒤 바뀌는 HTML DOM에서 데이터를 가져올 때 Selenium이 필요합니다.


 

설치

pip install selenium

(Mac 이용자는 python3를 이용할 시 pip3로 다운로드)


파이썬 라이브러리로 셀레늄을 설치합니다.


셀레늄에는 다양한 드라이버가 존재합니다.

Chrome이나 FireFox등의 드라이버를 활용해서 브라우징을 할 수 있는데 여기서는 Chrome 드라이버를 설치하겠습니다.


Chrome 드라이버를 사용하기 위해서 설치합니다.


https://sites.google.com/a/chromium.org/chromedriver/


에서 크롬 드라이버를 설치할 수 있습니다.

설치 후에 원하는 폴더에 저장해둡니다. (작업폴더에 넣어두는 것을 추천드립니다.)


그럼 Selenium을 이용해 페이지를 열어보겠습니다.


from selenium import webdriver as wd


## 작업폴더가 아닌 다른 폴더에 넣어뒀을 경우 경로를 적어준다.
driver = wd.Chrome(executable_path = './chromedriver')

## 사이트접속
driver.get('https://importer.ec21.com/shoe.html')


파이썬 파일을 실행하면 사이트가 열리는 걸 확인할 수 있습니다.


Selenium 메소드에는 이전 BeautifulSoup에서 사용한 메소드 Selector 처럼 태그를 추출하는 메소드가 존재합니다.

## 찾는 css가 1개일 때

driver.find_element_by_css_selector('')


## 찾는 css가 여러개 일 때

driver.find_elements_by_css_selector('')

찾는 css가 여러개 일 때는 반드시 element"s" 를 사용해야 합니다.

그리고 여러개의 elements를 저장하면 배열로 사용할 수 있습니다.


css_selector 뿐만 아니라 다양한 elements를 뽑아올 수 있습니다.


페이지를 넘기는 elements를 가져와서 페이지를 넘겨보겠습니다.


[그림1] 페이지를 넘기는 버튼에 해당하는 XPath를 가져온다. Xpath란 XML 구문에서 경로(Path)를 표현하는 언어이다. (위에서는 다음페이지의 경로를 제시한다.) 



버튼에 해당하는 XPath를 받아와서 Click()이라는 메소드를 실행하면 버튼을 클릭한다.

(css_selector로 버튼에 해당하는 element를 Click()해도 상관없음

다른 방법으로, 자바스크립트로 작성되어 있을 경우(onclick="") driver.execute_script로 직접 스크립트를 실행해서 클릭해도 된다.)

첫번째 페이지 버튼 XPath : //*[@id="pageingWrap"]/div/div[1]/a[1]

두번째 페이지 버튼 XPath : //*[@id="pageingWrap"]/div/div[1]/a[2]

세번째 페이지 버튼 XPath : //*[@id="pageingWrap"]/div/div[1]/a[3]

.

.

.


맨 뒤의 숫자만 바꿔주면서 눌러주면 페이지를 하나씩 훑어가면서 브라우징 할 수 있다.


from selenium import webdriver as wd


## 작업폴더가 아닌 다른 폴더에 넣어뒀을 경우 경로를 적어준다.
driver = wd.Chrome(executable_path = './chromedriver')

## 사이트접속
driver.get('https://importer.ec21.com/shoe.html')

## 페이지 하나씩 훑어가기 (1~9)
for page in range(1,10):
driver.find_element_by_xpath('//*[@id="pageingWrap"]/div/div[1]/a[%s]' %page).click()



이제 Selenium으로 직접 브라우징 하는 법을 알았으니 BeautifulSoup로 데이터를 수집할 수 있습니다.

사실, BeautifulSoup를 사용하지 않아도 Selenium 의 메소드들로 데이터를 긁어올 수 있습니다.

Selenium은 브라우저에서 HTML을 곧바로 파싱해주기 때문에 BeautifulSoup를 사용하지 않아도 됩니다.


제목에 해당하는 css를 find_element_by_css_selector로 찾으면 됩니다.


from selenium import webdriver as wd

## 작업폴더가 아닌 다른 폴더에 넣어뒀을 경우 경로를 적어준다.
driver = wd.Chrome(executable_path = './chromedriver')

## 사이트접속
driver.get('https://importer.ec21.com/shoe.html')

## 페이지 하나씩 훑어가기 (1~9)

for page in range(1,10):
## 'div.listLs_L.buyerL > div > h2 > a' 에 해당하는 elements를 모두 받아온다
li = driver.find_elements_by_css_selector('div.listLs_L.buyerL > div > h2 > a')
## li에 저장된 elements에서 loop를 돌리며 제목을 print한다.
for buyer in li:
print(buyer.text)

## 다음 페이지 클릭
driver.find_element_by_xpath('//*[@id="pageingWrap"]/div/div[1]/a[%s]' %page).click()

## 클래스 name 앞에는 .을 붙여주고 띄어쓰기 부분도 .으로 대체한다






댓글
최근에 올라온 글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
공지사항
최근에 달린 댓글