본문 바로가기
개인 공부/WEB

beautiful soup을 활용한 웹 스크래핑

by 아메리카노와떡볶이 2022. 3. 7.
728x90
웹 스크래핑 실습

특정 사이트에서 원하는만큼의 데이터를 스크랩하고 싶다면 어떻게 할 수 있을까?

beautifulsoup library 를 통해 간단하게 web scraping을 실습해보자.

 

1. 사이트 특정하기

먼저 스크랩하고자 하는 사이트를 특정한다. 이번 실습에서 활용할 사이트는 네이버 웹툰 그중에서도

헬퍼 2 : 킬베로스 를 선택했다.

 

현재 글 작성시점인 3월 7일 기준으로 292화가 최신화다.

 

2. 원하는 데이터 선택하기

내가 이 사이트에서 스크랩하고자 하는 내용은 "평균 평점보다 낮은 회차의 목록" 이다.

따라서 회차와 제목, 그리고 평점 데이터를 스크랩해야 할 것이다.

각각 하나씩 확인해보자.

 

먼저 회차와 제목은 <td> 태그 아래에 <a> 태그에 텍스트로 저장되어있다.

 

그리고 평점정보는 <div> 태그 아래에 <strong>태그에 텍스트로 저장되어있다.

 

3. bs4를 이용해서 데이터 스크랩하기

이제 원하는 데이터 텍스트가 담겨있는 태그를 활용해서 실제로 스크랩해보자.

 

import requests
from bs4 import BeautifulSoup

#get tltle
def GetTitle(title_list):
    titles = soup.find_all("td",attrs={"class":"title"})
    for title in titles:
        title_list.append(title.a.get_text())
    return title_list    

#get rate        
def GetRate(cnt,sum,rate_list):
    rates = soup.find_all("div",attrs={"class":"rating_type"})
    for rate in rates:
        num = rate.strong.get_text()
        sum = sum + float(num)
        cnt += 1
        rate_list.append(num)
    return cnt,sum,rate_list

sum = 0.0
cnt = 0
title = []
rate = []
page=30
while page>0:
    url = "https://comic.naver.com/webtoon/list?titleId=670143&weekday=thu"
    url += "&page="+str(page)
    res = requests.get(url)
    res.raise_for_status()
    soup = BeautifulSoup(res.text, "lxml")

    title = GetTitle(title)
    cnt, sum, rate = GetRate(cnt,sum,rate)
    page = page -1

#평균계산
avg = sum / float(cnt)
print("헬퍼 2 : 킬베로스의 "+str(cnt) + "화 평균 평점은 "+str(avg)+" 입니다")
print("[+]--------------- 평균 평점 이하 회차 리스트 -------------------[+]")

#평균보다 낮은 화 출력
for i in range(len(rate)):
    if float(rate[i])<avg:
        print(title[i],rate[i])

1. 태그와 클래스를 활용해서 원하는 데이터 리스트를 객체로 얻어낸 다음

2. 텍스트만 추출하기 위해 텍스트를 담고있는 태그에서 get_text 함수를 사용해서 추출한다.

 

결과

 

간단한 내용이지만 재밌다

 

참고

https://www.crummy.com/software/BeautifulSoup/bs4/doc/

 

Beautiful Soup Documentation — Beautiful Soup 4.9.0 documentation

Non-pretty printing If you just want a string, with no fancy formatting, you can call str() on a BeautifulSoup object, or on a Tag within it: str(soup) # ' I linked to example.com ' str(soup.a) # ' I linked to example.com ' The str() function returns a str

www.crummy.com

 

 

728x90

댓글