티스토리 뷰

 

▶셀레니움(Selenium)

셀레니움은 브라우저를 컨트롤 할 수 있도록 지원하는 라이브러리 입니다.

 

▷셀레니움 실행을 위한 chrome 드라이버 다운로드

1) 우선 크롬 버전을 확인해야 합니다. (버전에 맞는 드라이버를 설치하기 위함 입니다.)

주소창에 chrome://version/ 입력해서 버전을 확인합니다.

 

2) 버전에 맞는 크롬 드라이버 다운로드

버전에 완전히 동일하지 않아도 괜찮습니다. 최대한 비슷한 버전으로 설치하시면 되겠습니다.

https://sites.google.com/chromium.org/driver/

 

ChromeDriver - WebDriver for Chrome

WebDriver is an open source tool for automated testing of webapps across many browsers. It provides capabilities for navigating to web pages, user input, JavaScript execution, and more. ChromeDriver is a standalone server that implements the W3C WebDriver

sites.google.com

 

▷셀레니움 설치 및 import

!pip install selenium
from selenium import Webdriver
from selenium.webdriver.common.keys import Keys

 

▷연습 예제

1) 드라이버로 접속할 사이트 : https://www.python.org

 

Welcome to Python.org

The official home of the Python Programming Language

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) # 엔터키를 쳐줌

첫 번째 줄 코드는 다음을 의미합니다.

이전 스크레이핑에서 알아봤던 원하는 부분의 html 코드를 보는 방법을 이용해서 찾습니다

위 코드를 실행해보면 드라이버로 열린 크롬창이 lambda를 검색해서 페이지가 잘 넘어간 모습을 볼 수 있겠습니다.

 

 

▷네이버 웹툰 댓글

0) 네이버 웹툰 댓글창에 대한 이해

 

네이버 웹툰

매일매일 새로운 재미, 네이버 웹툰.

comic.naver.com

우선 위 사이트에 접속 해서 아무 웹툰이나 눌러줍니다.

웹툰 맨 밑에 보시면 댓글창이 있는 걸 볼 수 있겠습니다.

하지만, 이전에 알아보았던 크롤링 방법처럼 시도하면 파싱이 불가능합니다.

 

왜나하면, 이 댓글창은 본래 사이트가 있는데, 이것을 가져와서 쓰는 것이기에 본래 사이트를 통해 파싱을 시도해야 합니다.

댓글 부분에 대한 html 코드 입니다

저 부분이 바로 본래 사이트를 의미합니다.

다만, 완전한 웹사이트 주소가 아니기 때문에 조금 수정이 필요합니다.

앞에 http://comic.naver.com/...으로 입력하면 되겠습니다. 

 

1) 드라이버를 통해 접속할 사이트 : https://comic.naver.com/comment/comment?titleId=795487&no=19

 

네이버 웹툰

 

comic.naver.com

 

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]

.

.

.

로 확인이 가능합니다.
 
우선 페이지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를 크게 생각하지 않고 파싱을 마무리 해도 좋겠습니다 :)

 


여기까지 셀레니움에 대해 알아보았습니다 :)

728x90
LIST
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함