본문 바로가기
데이터 시각화 및 애플리케이션 개발/AI 컴퓨터 비전프로젝트

AI 컴퓨터 비전 프로젝트_2개월차_(크롤링::네이버웹툰 댓글 크롤링)

by 바다의 공간 2024. 5. 28.

1.크롤링과 스크레이핑

- 크롤링(crawling):인터넷의 데이터를 활용하기 위해 정보들을 분석하고 활용할 수 있도록 하는 수집하는 행위

- 스크레이핑(Scraping): 크롤링후 데이터를 추출하고 가공하는 행위


전시간에 배웠던 크롤링과 스크레이핑은 정적인 페이지 내에서 데이터를 긁어오는것들이었습니다.

그렇지만 모든 홈페이지가 정적인 페이지는 아니예요

인스타그램이나 페이스북 같은건 스크롤을 내리면 추가로 생긴 데이터는 파싱을 할 수 없습니다.

그 이후에 쌓였기때문이죠

그래서 이런데이터가 유동적으로 움직이거나 다이나믹한 페이지는

다른 프로그램을 사용해서 파싱해야합니다.

즉 사람처럼 움직여주고 사람처럼 데이터를 가져와서 활용해보는걸 해볼겁니다.

브라우저를 컨트롤해야하기때문에 주피터노트북라는걸 사용하게 됩니다.


주피터 노트북 설치 및 실행방법

*아래 방법은 명령프롬포트(cmd)에서 실행하는 방법입니다.

*사전에 파이썬이 설치되어있어야 설치가 진행됩니다.

 

명령프롬포트를 실행-> 실행할 폴더 경로 선택 -> 경로 복사 후 프롬포트에 붙여넣기 ->  pip install jupyter -> (설치중) -> jupyter notebook

특징 : 폴더하나를 선택해서 실행되는 곳에서 노트북용파일을 만들게됩니다. 

주피터 노트북은 사용하는동안 서버역할을 하기때문에 절대로 창을 닫으면 안 됩니다.

주피터는 코랩이랑 거의 똑같고 단축키는 살짝 다릅니다.

일단 먼저 esc를 누르면 명령모드로 됩니다.일반 추가하거나 삭제하거나 할 수 있습니다.


단축키

enter : 편집(수정)모드

esc : 명령모드

esc + a : 위쪽에 셀 추가 

esc + d + d :셀 삭제

esc + b : 아래쪽에 셀 추가 

esc + m :마크다운모드 변경

esc + y : 코드모드로 변경

자동완성기능이 있고 tap키를 누르면 사용할 수 있는 것들이 보여주고 enter치면 완성이 됩니다.

외는 코랩과 완벽히 일치함.


2. 셀레니움

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

* 리눅스 명령어로 설치 및 사용가능 => !pip install selenium

- 셀레니움을 사용만 할 수 있도록 하는 명령어

 

* 알아서 연동시켜줄 수 있는 설치명령어 =>   !pip install chromedriver_autoinstaller  

 

#임포트 확인

1.브라우저를 컨트롤할 수 있는 기능을 가진 클래스

2. 키보드를 치는 키보드를 제어할 수 있는 클래스

이 두가지를 이용합니다.

이렇게 친 후

#크롬 브라우저 띄우기

driver = webdriver.Chrome()를 실행하면

Chrome에의해 제어된 웹 브라우저가 하나 생성됩니다.

#구글로 이동하기

driver.get('https://www.google.com')등을 실행하는 순간 그 브라우저가 구글로 변경됩니다.

 

검색창에 글자를 써보고싶을때는 검색창->우클릭->검사후 html확인

#검색창 요소 찾기

search = driver.find_element('name','q') ->name의 q라는 속성을 찾아달라는 의미입니다.

 

셀레니움객체 안에서는!

find : 선택자의 한개를 찾을 때 

find_element :여러개를 찾을때 

 

#검색창에 날씨 문자열 적기

(1)search.send_keys('날씨')

이 매소드는 날씨라는 단어를 쳐줘~ 라는 뜻입니다.

#엔터키 누르기

(2)search.send_keys(keys.RETURN)

이 매소드는 엔터키를 치라는 뜻입니다.

그럼 위처럼 이렇게 구글에 날씨가 검색된 모습이 됩니다.


 

네이버웹툰 베스트 댓글 크롤링

사용할 사이트는 아래와 같습니다.

#https://comic.naver.com/webtoon/detail?titleId=812354&no=52&week=thu  

 

#드라이버 실행(창 띄우기)

driver = webdriver.Chrome()

driver.get(' https://comic.naver.com/webtoon/detail?titleId=812354&no=52&week=thu ')

 

#파싱하기 위한 설치(코랩은 기본설치되어있는 기능)

!pip install bs4

 

#제대로 설치됐는지 임포트하기

frome bs4 import BeautifulSoup

 

#제대로 설치됐는지 임포트하기

frome bs4 import BeautifulSoup

 

#셀레니움 객체가 페이지를 가지고있기에 BeautifulSoup에 넣어주기

soup = BeautifulSoup(driver.page_source)

 

#댓글부분에 해당하는 부분찾기

<span class="u_cbox_contents" style="" data-lang="ko">썸바디헬미</span>

에서 볼드처리된 부분으로 댓글들이 모두 공통적으로 받는걸 볼 수 있습니다.

그래서 저 부분을 선택자로 사용합니다.

 

15개 댓글을 크롤링해보기

#선택자로 선택하기

comment_area = soup.find_all('span',{'class',:'u_cbox_contents'})

print(comment_area)

선택자 출력

모두 리스트형태로 출력되는것을 확인할 수 있습니다.

하나끝날때마다 구분을 하기 위해서 -를 넣고, 15개의 모든 댓글을 출력하기 위해서 for문으로 돌리겠습니다.

 

#for문으로 돌리기

print('********** 베스트 댓글 **********')
for i in range(len(comment_area)):
comment = comment_area[i].text.strip()
print(comment)
print('-' * 30)

댓글 크롤링


 

네이버웹툰 일반 댓글 크롤링

 

네이버 웹툰 베스트댓글과 전체댓글을 각각 눌러보면

url이 변경되는것이 아니라 한 페이지 내에서 이동되는걸 확인할 수 있습니다.

이러한것은 내부적으로 코드가 변경되는것이므로 이럴때는 사람처럼 클릭을 해주고 크롤링을 다시 해줘야합니다.

이럴때 사용할 수 있는것이 Xpath입니다.

 

 

 

 

 

*Xpath : 기존의 컴퓨터 파일 시스템에서 사용하는 경로 표현식과 유사한 경로 언어

예) 전체댓글->검사->html우클릭->copy full xpath (해당요소의 경로)

 

#사람처럼 클릭하기 위한 전체댓글 클릭하기

driver.find_element('xpath', '/html/body/div[1]/div[5]/div/div/div[5]/div[1]/div[3]/div/div/div[4]/div[1]/div/ul/li[2]/a/span[2]').click()

 

#소스를 가져와서 같은 영역에 있는것을 선택자로 가져오기

soup = BeautifulSoup(driver.page_source)
comment_area = soup.find_all('span', {'class', 'u_cbox_contents'})
print(comment_area)

 

#전체댓글 for문을 이용하여 가져오기

print('********** 전체 댓글 **********')
for i in range(len(comment_area)):
    comment = comment_area[i].text.strip()
    print(comment)
    print('-' * 30)

 

이렇게 전체적으로 원하는 부분(댓글)만 취합해서 가져올 수 있습니다.