[Web Scraping] 네이버웹툰 - 인기 웹툰 및 제목, 링크, 평점 가져오기
데이터 분석을 위한 파이썬 철저 입문책과 국비지원수업 내용을 참고했다.
오늘 구현할 내용은 아래와 같다.
# 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
# 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'])