티스토리 뷰
▶셀레니움(Selenium)
셀레니움은 브라우저를 컨트롤 할 수 있도록 지원하는 라이브러리 입니다.
▷셀레니움 실행을 위한 chrome 드라이버 다운로드
1) 우선 크롬 버전을 확인해야 합니다. (버전에 맞는 드라이버를 설치하기 위함 입니다.)
주소창에 chrome://version/ 입력해서 버전을 확인합니다.
2) 버전에 맞는 크롬 드라이버 다운로드
버전에 완전히 동일하지 않아도 괜찮습니다. 최대한 비슷한 버전으로 설치하시면 되겠습니다.
https://sites.google.com/chromium.org/driver/
▷셀레니움 설치 및 import
!pip install selenium
from selenium import Webdriver
from selenium.webdriver.common.keys import Keys
▷연습 예제
1) 드라이버로 접속할 사이트 : https://www.python.org
2) 드라이버를 통해 크롬창 열기
driver = webdriver.Chrome('./chromdriver.exe')
driver.get('https://www.python.org')
3) 검색창을 찾아 글자 입력 후 엔터 누르기
search = driver.find_element('name', 'q') # 검색창을 찾는 것
search.send_keys('lambda') # 'lambda'라는 글자를 입력
search.send_keys(Keys.RETURN) # 엔터키를 쳐줌
첫 번째 줄 코드는 다음을 의미합니다.
위 코드를 실행해보면 드라이버로 열린 크롬창이 lambda를 검색해서 페이지가 잘 넘어간 모습을 볼 수 있겠습니다.
▷네이버 웹툰 댓글
0) 네이버 웹툰 댓글창에 대한 이해
우선 위 사이트에 접속 해서 아무 웹툰이나 눌러줍니다.
웹툰 맨 밑에 보시면 댓글창이 있는 걸 볼 수 있겠습니다.
하지만, 이전에 알아보았던 크롤링 방법처럼 시도하면 파싱이 불가능합니다.
왜나하면, 이 댓글창은 본래 사이트가 있는데, 이것을 가져와서 쓰는 것이기에 본래 사이트를 통해 파싱을 시도해야 합니다.
저 부분이 바로 본래 사이트를 의미합니다.
다만, 완전한 웹사이트 주소가 아니기 때문에 조금 수정이 필요합니다.
앞에 http://comic.naver.com/...으로 입력하면 되겠습니다.
1) 드라이버를 통해 접속할 사이트 : https://comic.naver.com/comment/comment?titleId=795487&no=19
2) 드라이버를 통해 크롬창 열기
driver = driver.Chrome('./chromdriver.exe')
driver.get('https://comic.naver.com/comment/comment?titleId=795487&no=19')
3) 베스트 댓글 크롤링
from bs4 import BeautifulSoup
html = driver.page_source # 불러온 페이지의 html 소스를 다 불러옴
soup = BeautifulSoup(html)
# 베스트 댓글 파싱
comment_area = soup.findAll('span', {'class':'u_cbox_contents'})
3-1) 출력해보기
print(*****베스트 댓글*****)
for i in range(len(comment_area)):
comment = comment_area[i].text.strip()
print(comment)
print('-'*50) # 댓글 구분선으로 이용하기 위해
4) 전체 댓글 더보기 크롤링
우리는 1페이지에서 2페이지로 그 다음으로 2페이지에서 3페이지로 이동할 겁니다.
또한 10페이지가 되면 다음 버튼을 눌러서 11페이지로 갈 것입니다. 즉 페이징을 할 겁니다.
우리가 이전까지 원하는 데이터를 파싱할 때 soup.findAll을 통해 찾았었습니다.
그렇지만, 이 명령어를 사용하기 어려울 때 driver.find_element라는 또 방법이 있습니다.
이 방법을 사용하는 방법은 다음과 같습니다.
F12 누르기 → 페이지의 html 코드 부분 찾기 → 그 부분에서 우클릭 → Copy → Copy Xpath
위 방법대로 살펴보면 다음과 같습니다.
(1페이지 → 2페이지) 2페이지 Xpath : //*[@id="cbox_module"]/div/div[7]/div/a[1]
(2페이지 → 3페이지) 3페이지 Xpath : //*[@id="cbox_module"]/div/div[7]/div/a[3]
(3페이지 → 4페이지) 4페이지 Xpath : //*[@id="cbox_module"]/div/div[7]/div/a[4]
.
.
.
(10페이지 → 다음페이지) 다음페이지 Xpath : //*[@id="cbox_module"]/div/div[7]/div/a[11]/span[1]
(11페이지 → 12페이지) 12페이지 Xpath : //*[@id="cbox_module"]/div/div[7]/div/a[3]
(12페이지 → 13페이지) 13페이지 Xpath : //*[@id="cbox_module"]/div/div[7]/div/a[4]
.
.
.
(20페이지 → 다음페이지) 다음페이지 Xpath : //*[@id="cbox_module"]/div/div[7]/div/a[12]/span[1]
.
.
.
driver.find_element('xpath', '//*[@id="cbox_module"]/div/div[7]/div/a[1]').click()
html = driver.page_source
soup = BeautifulSoup(html)
comment_area = soup.findAll('span', {'class': 'u_cbox_contents'})
for i in (range(len(comment_area)):
comment = comment_area[i].text.strip()
print(comment)
print('-'*50)
이제 페이징을 해서 처음 댓글부터 맨끝 댓글까지 파싱해보겠습니다.
먼저 알아놓아야 할 html 코드 사항을 알아보겠습니다.
import time
pagenum = 1
while(True):
time.sleep(1)
html = driver.page_source
soup = BeautifulSoup(html)
comment_area = soup.findAll('span', {'class', 'u_cbox_contents'})
# print(comment_area)
#-------------1페이지 파싱----------------------
for i in range(len(comment_area)):
comment = comment_area[i].text.strip()
print(comment)
print('-'*50)
#--------------1페이지 이후 파싱----------------
for i in range(3, 11):
driver.find_element('xpath', '//*[@id="cbox_module"]/div/div[7]/div/a[' + str(i) + ']').click()
time.sleep(1)
html = driver.page_source
soup = BeautifulSoup(html)
comment_area = soup.findAll('span', {'class', 'u_cbox_contents'})
for j in range(len(comment_area)):
comment = comment_area[j].text.strip()
print(comment)
print('-'*50)
if pagenum == 1:
driver.find_element('xpath','//*[@id="cbox_module"]/div/div[7]/div/a[11]/span[1]').click()
pagenum += 1
else:
driver.find_element('xpath','//*[@id="cbox_module"]/div/div[7]/div/a[12]/span[1]').click()
위 반복문을 시행하면 마지막에 Error가 뜨게 됩니다. 더 이상 읽어들일 댓글이 없기에 뜨는 Error입니다.
우리가 파싱하는 데에 문제가 되지 않기 때문에 Error를 크게 생각하지 않고 파싱을 마무리 해도 좋겠습니다 :)
여기까지 셀레니움에 대해 알아보았습니다 :)
'빅데이터 인공지능 > 데이터분석' 카테고리의 다른 글
[데이터분석] ⑩ 워드 클라우드(Word Cloud) (0) | 2022.07.12 |
---|---|
[데이터분석] ⑨ 형태소 분석 (0) | 2022.07.11 |
[데이터분석] ⑦ 스크레이핑(Scraping) (0) | 2022.07.09 |
[데이터분석] ⑥ 쇼핑몰 고객주문 데이터 프로젝트 실습 (0) | 2022.06.30 |
[데이터분석] ⑤ matplotlib 라이브러리 (0) | 2022.06.28 |
- Total
- Today
- Yesterday
- react-query
- rtl
- 프론트엔드
- frontend
- 자바
- CSS
- 프로젝트 회고
- 딥러닝
- Python
- next.js
- 프론트엔드 공부
- 자바스크립트 기초
- TypeScript
- 인프런
- 스타일 컴포넌트 styled-components
- 머신러닝
- 데이터분석
- 자바스크립트
- jest
- HTML
- testing
- 리액트 훅
- 프론트엔드 기초
- react
- styled-components
- JSP
- 디프만
- 리액트
- 타입스크립트
- 파이썬
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |