본문 바로가기
Software/Python

[웹스크래핑] Beautifulsoup4 활용 1 - 네이버 웹툰

by 리미와감자 2023. 1. 17.
728x90
반응형

실습1 : 네이버 웹툰 전체 목록(제목) 가져오기

 

import requests
from bs4 import BeautifulSoup

url = "https://comic.naver.com/webtoon/weekday" # 접근할 url
res = requests.get(url) # 원하는 url의 정보
res.raise_for_status() # 웹페이지의 상태가 정상인지 확인

soup = BeautifulSoup(res.text, "lxml") # 가져온 HTML 문서를 파서를 통해 BeautifulSoup 객체로 만듦

 

# 네이버 웹툰 전체 목록 가져오기
cartoons = soup.find_all("a", attrs={"class":"title"}) # HTML 문서에서 태그명이 a이고 class 속성이 title인 값을 모두 가져옴
# class 속성이 title인 모든 "a" 요소를 반환
for cartoon in cartoons:
    print(cartoon.get_text())

1. soup.find_all() 함수를 사용하여 class 속성이 title(제목)인 모든 a 요소를 가져온다.

2. 가져온 모든 a 요소의 텍스트만 출력한다.

 

 


실습2 : 내가 원하는 웹툰의 제목과 링크 가져오기

 

import requests
from bs4 import BeautifulSoup

url = "https://comic.naver.com/webtoon/list?titleId=179704" # 접근할 url
res = requests.get(url) # 원하는 url의 정보
res.raise_for_status() # 웹페이지의 상태가 정상인지 확인

soup = BeautifulSoup(res.text, "lxml") # 가져온 HTML 문서를 파서를 통해 BeautifulSoup 객체로 만듦

url : https://comic.naver.com/webtoon/list?titleId=179704 

 

안나라수마나라

따뜻한 감성의 하일권 작가 2010 작품.철없는 마술사를 만난 한 소녀의 성장 드라마.당신, 마술을 믿으시나요?

comic.naver.com

접근할 url은 네이버웹툰인 안나라수마나라이다. 나머지 포맷은 첫번째 실습과 똑같다.

 

 

cartoons = soup.find_all("td", attrs={"class":"title"})

1. soup.find_all() 함수를 사용하여 class 속성이 title인 모든 td 요소를 가져온다.

 

for cartoon in cartoons:
    title = cartoon.a.get_text() # 제목 가져오기
    link = "https://comic.naver.com" + cartoon.a["href"] # 속성값을 사용하여 링크 가져오기
    print(title, link)

2. 웹툰의 제목과 링크를 가져온다. 링크는 "https://comic.naver.com/"가 빠진 채로 가져오기때문에 직접 붙여준다.

 

결과

5화 빛은 없다 https://comic.naver.com/webtoon/detail?titleId=179704&no=6&weekday=fri
4화 저주에 걸린 아이 https://comic.naver.com/webtoon/detail?titleId=179704&no=5&weekday=fri
3화 장난감의 속성 https://comic.naver.com/webtoon/detail?titleId=179704&no=4&weekday=fri
2화 구멍난 스타킹 https://comic.naver.com/webtoon/detail?titleId=179704&no=3&weekday=fri
1화 쫓아간다 https://comic.naver.com/webtoon/detail?titleId=179704&no=2&weekday=fri
예고편 https://comic.naver.com/webtoon/detail?titleId=179704&no=1&weekday=fri

 

전체 코드

import requests
from bs4 import BeautifulSoup

url = "https://comic.naver.com/webtoon/list?titleId=179704" # 접근할 url
res = requests.get(url) # 원하는 url의 정보
res.raise_for_status() # 웹페이지의 상태가 정상인지 확인

soup = BeautifulSoup(res.text, "lxml") # 가져온 HTML 문서를 파서를 통해 BeautifulSoup 객체로 만듦

cartoons = soup.find_all("td", attrs={"class":"title"})
# title = cartoons[0].a.get_text() # 제목 가져오기
# link = cartoons[0].a["href"] # 속성값을 사용하여 링크 가져오기
# print(title)
# print("https://comic.naver.com" + link)

for cartoon in cartoons:
    title = cartoon.a.get_text() # 제목 가져오기
    link = "https://comic.naver.com" + cartoon.a["href"] # 속성값을 사용하여 링크 가져오기
    print(title, link)

 


실습3 : 네이버 웹툰 평점 구하기

import requests
from bs4 import BeautifulSoup

url = "https://comic.naver.com/webtoon/list?titleId=179704" # 접근할 url
res = requests.get(url) # 원하는 url의 정보
res.raise_for_status() # 웹페이지의 상태가 정상인지 확인

soup = BeautifulSoup(res.text, "lxml") # 가져온 HTML 문서를 파서를 통해 BeautifulSoup 객체로 만듦

실습2와 같다.

 

1. 평점에 커서를 올려보면 평점은 div 요소 밑에 strong 요소로 감싸져있다.

# 평점 구하기
total_rates = 0
cartoons = soup.find_all("div", attrs={"class":"rating_type"})
for cartoon in cartoons:
    rating = cartoon.strong.get_text() # 평점 가져오기
    total_rates += float(rating)
    print(rating)
print("전체 점수 : ", total_rates)
print("평균 점수 : ", total_rates / len(cartoons))

2. soup.find_all() 함수를 사용하여 class 속성이 rating_type인 모든 div 요소를 가져온다.

 

3. strong 태그값을 가져와서 전체 점수와 평균 점수를 구한다.

 

결과

9.95
9.96
9.96
9.96
9.95
9.93
전체 점수 :  59.71
평균 점수 :  9.951666666666666

 

728x90
반응형

댓글