코린이의 개발 일지

[파이썬 웹크롤링] 파이썬으로 네이버 웹툰 제목 목록 가져오기 - BeautifulSoup 사용 본문

프로젝트/콘솔 프로그램

[파이썬 웹크롤링] 파이썬으로 네이버 웹툰 제목 목록 가져오기 - BeautifulSoup 사용

폴라민 2022. 1. 23. 15:30
반응형

안녕하세요 폴라민 입니다.

 

오늘은 네이버 웹툰 사이트에서 beautifulsoup을 이용해 웹툰 목록 가져오기를 해보겠습니다.

요즘은 셀레니움도 많이 쓰던데 동적인 작업할 때는 셀레이움을 사용해야 하지만 저는 텍스트 가져오는 것은 BeautifulSoup이 편하더라구요ㅎㅎ 

 

그럼 시작하겠습니다.

 

 

우선 웹툰 사이트로 가봅시다.

 

링크는 아래 달아둘게요!

https://comic.naver.com/webtoon/weekday?order=User 

 

네이버 웹툰

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

comic.naver.com

 

 

 

 

 

요즘 웹툰들이 정말 셀 수 없이 많아요... 예전에는 개수가 진짜 적어서 모르는 웹툰이 없었는데 지금은 모르는 웹툰이 대다수네요.

 

아무튼 사이트에 갔으니 크롬 개발자 도구를 켜 줍니다. 

윈도우 쓰시는 분들은 F12 누르시면 됩니다.

 

 

 

 

 

 

 

 

 

그러면 이런식으로 뜨는데요! 오른쪽 창에서 왼쪽 상단에 박스에 화살표 있는 모양 보이시나요?

 

Elements 글자 왼쪽, 왼쪽에 있습니다. 그 모양을 클릭해주면

 

 

 

 

 

 

 

이렇게 마우스 커서를 갖다 대면 그 부분의 HTML 문서 위치를 찾아 줍니다. 

저희는 제목들을 긁어오고 싶은 거니까 웹툰 제목 부분 태그를 찾아봅시다.

 

 

 

 

 

 

자 제목 보이시나요? 여기서 잠깐 알고 가야할 HTML 내용들을 말해보자면

 

태그란? 저기 <li> <div> 이런 것들을 태그라고 한다.

보통 크롤링을 할 때는 <a> 신의 탑 </a> 이런식으로 태그의 시작과 끝 사이에 있는 텍스트를 가져온다. 

 

HTML 을 배우는 포스팅은 아니니 우선 간략히 크롤링에 필요한 정보만 적어보았습니다. 그러면 이제 정보를 가져와 봅시다.

 

 

 

우선 웹페이지를 가져와줄 라이브러리 requests를 import 해주고 BeautifulSoup도 import 해줍니다.

 

 

 

사실 5번 줄까지는 크롤링할 웹사이트 주소만 달라지고 항상 같다고 보시면 돼요. 

주소는 아까 접속한 네이버 웹툰 사이트로 해 줍니다.

 

자 이제 soup이라는 변수에 HTML 내용을 담았죠. 

find_all 이라는 함수를 사용해서 우리가 찾으려는 데이터를 가져올 겁니다.

 

※ find_all 함수는 입력받은 태그 정보에 해당하는 모든 텍스트를 가져와 리스트 형태로 반환합니다.

 

 

 

 

웹툰이 요일별로 구분이 되어 있어서 요일별로 데이터를 긁어와 리스트에 담았습니다.

 

import requests
from bs4 import BeautifulSoup

res=requests.get('https://comic.naver.com/webtoon/weekday?order=User') # 웹페이지 가져오기.
soup=BeautifulSoup(res.content,'html.parser') #웹페이지 파싱하기.
data=soup.find_all('div',class_="col_inner")

 

 

 

보시면 div 태그에서 class 가 col_inner인 것들을 전부 찾아서 data 변수에 저장했습니다.

find_all 은 리스트를 return한다고 했으니 data는 리스트 형태겠죠?

 

data=[월요일 웹툰 정보~~, 화요일 웹툰 정보~~, 수요일 웹툰 정보~~ ... ]

이렇게 아마 구성되어 있을 겁니다.

 

이제 각각의 요일별 정보에서 웹툰 제목만 빼 와야겠죠.

 

import requests
from bs4 import BeautifulSoup

res=requests.get('https://comic.naver.com/webtoon/weekday?order=User') # 웹페이지 가져오기.
soup=BeautifulSoup(res.content,'html.parser') #웹페이지 파싱하기.
data=soup.find_all('div',class_="col_inner")
for daily_list in data:
    print("\n")
    title=daily_list.find('span')
    print(title.get_text())

 

print("\n") 은 그냥 출력할 때 보기 좋으라고 넣었습니다.

 

for 문으로 돌려 주면서 요일별 정보를 하나씩 가져옵니다.

우선 무슨 요일 인지 출력해주기 위해서 span 태그를 찾아 요일을 출력해주었습니다.

 

 

 

 

h4 태그 하위에 있는 span 태그에 월요 웹툰이라고 적어져 있는 부분을 긁어온 것입니다.

 

그 다음에 웹툰 목록을 가져와야죠.

 

 

 

 

a 태그 중에서 class 가 'title'인 내용을 긁어와야겠네요.

 

 

import requests
from bs4 import BeautifulSoup

res=requests.get('https://comic.naver.com/webtoon/weekday?order=User') # 웹페이지 가져오기.
soup=BeautifulSoup(res.content,'html.parser') #웹페이지 파싱하기.
data=soup.find_all('div',class_="col_inner")
for daily_list in data:
    print("\n")
    title=daily_list.find('span')
    print(title.get_text())
    lst=daily_list.find_all('a',class_='title')
    for index,name in enumerate(lst):
        print(str(index+1)+'. '+name.get_text(),end=', ')

 

 

월요 웹툰, 즉 타이틀은 한개만 가져오면 되니까 find 메소드를 썼지만 웹툰 목록은 보시다시피 li 태그가 굉장히 여러개잖아요? 따라서 find_all 함수로 한꺼번에 가져왔습니다.

 

자 이제 데이터는 다 가져왔으니 출력해줄 일만 남았습니다.

저는 enumerate를 사용해서 제목 앞에 인덱스도 적어줬어요.

 

 

잘 출력 되네요. 근데 한가지 거슬리는 부분이 있죠.

 

 

가장 끝 제목 뒤에도 콤마가 붙었어요. 이거는 예외처리로 간단히 제거할 수 있습니다.

 

 

import requests
from bs4 import BeautifulSoup

res=requests.get('https://comic.naver.com/webtoon/weekday?order=User') # 웹페이지 가져오기.
soup=BeautifulSoup(res.content,'html.parser') #웹페이지 파싱하기.
data=soup.find_all('div',class_="col_inner")
for daily_list in data:
    print("\n")
    title=daily_list.find('span')
    print(title.get_text())
    lst=daily_list.find_all('a',class_='title')
    for index,name in enumerate(lst):
        if index==len(lst)-1:
            print(str(index+1)+'. '+name.get_text())
            break
        print(str(index+1)+'. '+name.get_text(),end=', ')

 

index가 마지막 순서일 경우 콤마 없이 출력되도록 해주었습니다.

 

 

실행해보면

 

 

 

잘 출력 되네요.

 

이렇게 오늘은 전체 웹툰 목록을 출력해보기를 해봤는데, 목록이 너무 많죠?

 

 

다음 번에는 별점순으로 정렬도 해보고, 인기순으로 정렬한 후 별점 9.9 이상인 웹툰만 추려오는 내용을 다뤄보도록 하겠습니다.

 

그럼 웹툰 크롤링 2탄에서 만나요! 안녕~~

 

반응형
Comments