[파이썬] beautifulsoup4 2장 - 웹툰 스크래핑

0

1장에서 다뤘듯이 bs4와 lxml을 기본적으로 파일에 적용을 해야함.

> import requests
from bs4 import BeautifulSoup
url = "원하는 url"
res = requests.get(url)
res.raise_for_status()
soup = BeautifulSoup(res.text, "lxml")

find_all() 함수

find_all 함수는 soup의 모든 정보를 가져오는 것을 의미함.
-> 이 또한 soup.find_all("태그이름", "태그 속성")을 통해 가져올 정보를 지정할 수 있음.

soup.find_all("a", attrs = {"class" : "class이름"})

웹툰 가져오기

글을 쓰는 오늘은 목요일이기에 목요일 1등 웹툰인 "독립일기" 내용을 가져와보도록 할 것임.

1. 스크래핑을 위한 기본적인 코드에서 "원하는 코드" 부분을 독립일기 사이트인 https://comic.naver.com/webtoon/list?titleId=748105&weekday=thu 로 설정함

2. 위 사이트에서 제목 태그 부분을 알기 위해 개발자 도구를 활용함. 그러면 아래와 같은 정보를 알 수 있음

-> 이를 통해 제목 태그는 "td"이고 속성은 class = "title"이라는 것을 알 수 있음.

3. 위 정보를 이용하여 soup의 정보를 가져옴.

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

4. 제목을 가져와보고자 함.

title = cartoons[0].a.get_text()

-> 2번에서 제목은 a 태그에 있다는 것을 알 수 있기에 a 태그의 텍스트 정보를 가져오면서 제목을 가져올 수 있음.

5. 링크 또한 가져올 것임.

link = cartoons[0].a["href"]

-> 이렇게 가져오면 a 태그의 href 속성을 가져와라는 의미임.
-> 2번을 봤을때, href가 "/webtoon/detail?titleId=748105&no=188&weekday=thu" 라는 것을 알 수 있는데 사이트에서는 앞에 https://comic.naver.com 이 더 있기에 이 부분을 앞에 합쳐줘야 완전한 링크를 얻을 수 있음.

link = "https://comic.naver.com" + cartoons[0].a["href"]

6. 평점 가져오기

평점 태그는 위와 같음.

rating = soup.find_all("div", attrs={"class" : "rating_type"})

-> 이를 통해 각 회차별 웹툰 평점를 가져올 수 있음.
-> 반복문을 통해 점수를 가져와서 평점 평균을 구할 수 있음

for i in rating:

rate = i.strong.get_text()
print(rate)
trates += float(rate)

print("평점 합: ", trates)
print("평점 평균: ", trates / len(rating))

7. 위의 모든 코드들은 터미널에서 바로 적용 가능함.
-> 파이썬은 인터프리터 언어이기 때문에 한 줄 한 줄 바로 해석 적용을 해서 터미널에서 바로 코드를 작성하여 웹 스크래핑을 할 수 있음. 즉 위에 작성한 코드를 터미널에서 바로 작성하면 제목, 링크, 평점 등을 바로 알 수 있는 것.
-> 코드들을 친 후에 터미널에서 빠져나오는 것은 exit()를 통해 할 수 있음.

전체코드

import requests
from bs4 import BeautifulSoup

url = "https://comic.naver.com/webtoon/list?titleId=748105&weekday=thu"
res = requests.get(url)
res.raise_for_status()

soup = BeautifulSoup(res.text, "lxml")

# 제목 + 링크 구하기
cartoons = soup.find_all("td", attrs= {"class" : "title"})

for i in cartoons:
    title = i.a.get_text()
    link = "https://comic.naver.com" + i.a["href"]
    print(title, link)
    
# 평점 구하기
trates = 0
rating = soup.find_all("div", attrs={"class" : "rating_type"})
for i in rating:
    rate = i.strong.get_text()
    print(rate)
    trates += float(rate)
print("평점 합: ", trates)
print("평점 평균: ", trates / len(rating))

0개의 댓글