본문 바로가기

데이터 분석 - Python

[데이터 분석] 네이버 웹툰 데이터 크롤링 with python

"11/03 수정 중"

 

데이터 분석 그리고 크롤링(정확하게 말하면 크롤링이라고 하기는 힘들지만) 연습을 하기 위해 어떤 데이터를 대상으로 분석을 해볼까 고민하고 있었다. 예전에 웹툰 이미지로 실습을 해봤던 경험도 있기에 웹툰에 대한 웹 크롤링과 데이터 분석을 해보고자 했다.

 

우선 구체적으로 분석에 대한 계획이 없었기에 네이버웹툰에서 연재 중인 작품들에 대한 기본적인 작품명, 작가, 평점에 대한 데이터를 수집하고자 했다.

 

[환경] Python(3.9)을 사용하였으며 가상환경에서 bs4(BeautifulSoup)과 request 라이브러리를 사용했다.

 

 

 

우선 현재 연재중인 작품들의 작품, 제목, 평점, 연재 요일을 가져오기로 정했고 네이버 웹툰에 접속하여 페이지가 어떤 식으로 구성되어있는지 살펴봤다.

 

네이버 웹툰 페이지 / 네이버 웹툰 작품의 페이지

처음 네이버 웹툰 페이지를 보고 selenium을 이용해서 동적 크롤링을 해야겠다 생각했는데, 요일별 페이지의 주소는 간단한 규칙으로 되어있었고 작품을 클릭해서 웹툰 작품 페이지로 넘어가면 작품의 평균 평점을 확인할 수 없었다(또한, 19세 이상 감상이 가능한 작품은 로그인이 필요하다).

 

네이버 웹툰 - 요일별 - 월요일

 

하지만 '요일별 - 각 요일' 혹은 '연도별' 탭으로 가면 평점을 확인할 수 있었다.

selenium 같은 동적 크롤링은 필요 없다고 판단했고 절차를 간단히 하기 위해 요일별 페이지 주소에 대해 request 모듈로 각 요일 페이지의 소스코드를 가져오는 것으로 했다.

 

python 코드

페이지를 확인해 보면 월요일부터 일요일 그리고 데일리플러스라는 8가지 범주로 분류되어있다.

요일별 주소에서 앞 'https://comic.naver.com/webtoon/weekdayList?week=' 까지는 동일하며 뒷부분에 'mon', 'tue'와 같이 요일만 따로 붙여서 사용하면 된다.

 

import requests

h = 'https://comic.naver.com/webtoon/weekdayList?week='
day = ['mon', 'tue', 'wed', 'thu','fri','sat','sun','dailyplus']

for i in day:
    page = requests.get(h+i)

위와 같이 반복문을 써주면 8개 페이지의 주소를 for문을 통해 각각 가져올 수 있다.

 

 

요일, 제목, 작가, 평점, 그리고 페이지 주소 총 5개의 정보를 가져오고자 하며 이를 위해 데이터 프레임을 만든다.

df = pd.DataFrame(columns=['days','title', 'author', 'rating', 'url'])

 

 

다음으로 웹페이지에 대한 html 요소를 알아볼 필요가 있다. 웹 페이지에서 마우스 오른쪽 클릭 후 '검사'를 누르면 오른쪽 아래(이미지 B)와 같은 개발자 도구가 나온다. Inspector를 클릭한 후 확인하고 싶은 곳에 올려두면 왼쪽 아래 그림(이미지 A)과 같이 파란색으로 화면이 변하며 다시 클릭하면 해당 부분의 html요소를 확인 가능하다.

이미지 A(왼쪽) / 이미지 B(오른쪽)

'참교육'이라는 웹툰을 클릭하면 이미지 C를 확인할 수 있다.

파란색 div class="list_area_daily_img" 안에 'ul' -> 'li' -> 'dl'로 깊이 내려가 보면 다음 'dt', 'dd' 등에서 웹툰에 대한 기본적인 정보가 보인다.

또한 이미지 B를 자세히 보면 각 <li>는 페이지에 나와있는 각각의 작품에 대한 요소가 있음을 확인할 수 있다. 

이미지 C

 

이제 BeautifulSoup 패키지를 이용해 페이지를 불러오고 위에서 찾은 html 경로를 참고하여 정보들을 불러오면 된다.

 

"

11/03 수정 중...

"

 

각 요일 페이지를 각각 요청을 보내고 html 정보를 응답 받는다.

따라서, findAll('dl')을 통해 각각의 모든 작품에 대한 정보를 가져오고 data라는 변수에 넣는다.

data변수 안에 있는 각 작품에 대한 값들을 for문을 통해 하나씩 가져오고 필요한 정보를 추출하여 미리 만들어둔 데이터 프레임에 넣어준다. 필요한 정보는 title, author, rating, url이라는 변수로 for문 안에 들어가 있다.

추가적으로, 각 변수에 띄어쓰기, 줄 바꾸기 같은 것을 제거하기 위해 replace와 strip함수를 사용했다.

 

최종 코드

from bs4 import BeautifulSoup
import requests
import pandas as pd

h = 'https://comic.naver.com/webtoon/weekdayList?week='
day = ['mon', 'tue', 'wed', 'thu','fri','sat','sun','dailyplus']
df = pd.DataFrame(columns=['days','title', 'author', 'rating', 'url'])

for i in day:
    page = requests.get(h+i) # mon, tue, ... , dailyplus
    soup = BeautifulSoup(page.text, 'page.parser')

    data = soup.find('div', {'class': 'list_area daily_img'})
    data = data.findAll('dl') #
    days = i

    for l in data:
        title = l.find('dt').text.replace('\n', '').strip()
        author=l.find('dd',{'class': 'desc'}).text.replace('\n', '').replace('\t', '')
        rating=l.find('strong').text
        url = 'https://comic.naver.com' + l.find('dt').find('a')['href']
        
        df = pd.concat([df, pd.DataFrame([[days, title, author, rating, url]],
        columns=['days', 'title', 'author','rating','url'])])

 

df를 확인해보면 아래와 같은 dataframe이 만들어진 것을 볼 수 있다. 총 658개의 작품이 들어가 있다.