본문 바로가기
Python/Web Scraping

[Web Scraping] 네이버웹툰 - 인기 웹툰 및 제목, 링크, 평점 가져오기

by 개폰지밥 2022. 10. 10.
반응형

데이터 분석을 위한 파이썬 철저 입문책과 국비지원수업 내용을 참고했다.
오늘 구현할 내용은 아래와 같다.


# Workshop

네이버 웹툰 https://comic.naver.com/webtoon/weekday

대학원 탈출일지 웹툰 주소 : https://comic.naver.com/webtoon/detail?titleId=790713&no=64&weekday=tue

1. 요일별 전체 웹툰 제목 모두 가져오기 
2. 인기 급상승 웹툰 10개 가져오기 
3. 만화 "독립 일기"의 제목, 링크, 평점 가져오기


워크 샵을 시작하기 앞서 웹 스크래핑과 웹 크롤링 차이에 대해서 알아보려고 한다.

| 웹 클롤링 vs 웹 스크레핑

웹 크롤링은 웹 스크레핑과 같은 의미로 쓰이기도 하지만, 웹 크롤링은 보통 전체의 내용을 긁어와서 복제하는 것을 말하며, 대규모로 이루어지고 웹 크롤링을 수행하는 프로그램을 웹 크롤러(web crawler)라고 합니다.
웹 스크레핑은 웹 사이트에서 특정 데이터를 추출하는 것을 포함하며, 웹 스크레핑을 수행하는 프로그램을 웹 스크레이퍼(web scraper)라고 한다.


# WorkShop2

인기 급상승 웹툰 10개 가져오기

 

필요한 import를 선언 해주고  스크랩핑 할 url과 본인의 User-agent를 header로 선언해준다.
User-agent를 선언하는 이유와 확인 방법이 그리고 Workshop1이 궁금하시면 아래 클릭 부탁드립니다.
https://seul96.tistory.com/376

 

[Web Scraping] Naver Webtoon - 요일별 전체 웹툰 제목 가져오기

Web Scraping 국비지원에서 웹 스크랩핑을 배웠는데, 익숙해지지 않아 연습을 해보려고 한다. 데이터 분석을 위한 파이썬 철저 입문책과 국비지원수업 내용을 참고했다. 오늘 구현할 내용은 아래와

seul96.tistory.com

# import 및 별칭 선언
import requests as req
from bs4 import BeautifulSoup as bea

# url 및 headers 선언
url = "https://comic.naver.com/webtoon/weekday"
headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"}
res = req.get(url, headers)


인기 급상승 웹툰을 가져오기 위하여 먼저 웹툰 제목을 선택합니다.
개발자 모드(F12) -> 마우스 커서(select an element in the page to inspect it) -> 제목(알기 원하는 부분) ->
마우스 오른쪽 -> Copy -> Copy selector
결과 : #realTimeRankFavorite > li.rank01 > a

제목을 잘 가져오는지 테스트

soup.select_one("#realTimeRankFavorite > li.rank01 > a").get_text()

싸움 독학, 입학용병, 사형소년, 이번 생도 잘부탁해 등은 ol이라는 클래스에 id는 realTimeRankFavorite에 있고,

li라는 태그를 이용하고 class의 속성을 이용하여 rank01, rank02, rank03으로 나누고 있다.

즉 rank01은 싸움 독학, rank02는 입학용병, rank03는 사형소년인 것이다.

BeautifulSoup을 이용하여 원하는 값을 추출하기 위하여 아래와 같이 선언해보았다. 

soup.find('전체 태그', {"전체 태그의 속성":"원하는 값 속성"}) -> 이해하기 쉽게 강제로 적어봄. 정답은 X

ol = soup.find("ol",{"id":"realTimeRankFavorite"})

li = ol.find_all('li')

find_all은 문자를 가져오는 get_text()를 사용할 수 없기 때문에 for문을 사용한다.

for li in lis:
    a=li.find('a')
    print(a.get_text())

 

# WorkShop3

만화 "독립일기"의 제목, 링크, 평점 가져오기

| 구현 형태

웹툰 제목 : 평점
링크

| 예시

63화-자취로망  : 9.97
https://comic.naver.com/webtoon/detail?titleId=790713&no=64&weekday=tue

 

위와 같이 원하는 부분 먼저 제목을 클릭합니다.

개발자 모드(F12) -> 마우스 커서(select an element in the page to inspect it) -> 제목(알기 원하는 부분) ->
마우스 오른쪽 -> Copy -> Copy selector

결과 :

- 제목 & 링크 : #content > table > tbody > tr:nth-child(3) > td.title > a
- 평점 : #content > table > tbody > tr:nth-child(3) > td:nth-child(3) > div > strong

url2="https://comic.naver.com/webtoon/list?titleId=790713&weekday=tue"
res2=req.get(url2, headers)
res2.status_code

결과 : 200
soup2 = bea(res2.text, 'lxml')
print(soup2.prettify)

먼저 제목을 뽑아보겠습니다.

titles2 = soup2.select("td.title > a")
titles2

글자만 뽑도록 .get_text()를 사용해보겠습니다.

for title in titles2:
    print(title.get_text())

 

평점을 뽑아보겠습니다.

rates = soup2.select("td:nth-child(3) > div > strong")
for rate in rates:
    print(rate.get_text())

제목(titles2)과 평점(rates)를 같이 뽑아내기 위하여 zip 함수를 써서 for문을 돌렸고

titles2에 있는 링크를 뽑아내기 위하여 'href'부분을 가져왔습니다.

for title, rate in zip(titles2, rates):
    print(title.get_text() + " " + " : " + rate.get_text())
    print('https://comic.naver.com' + title['href'])

 

반응형

댓글