본문 바로가기
Python/크롤링&스크래핑

[웹스크래핑] Beautifulsoup4 기본

by 리미와감자 2023. 1. 15.

관련 라이브러리 및 패키지 설치

pip install beautifulsoup4 : 스크래핑을 위한 패키지

pip install lxml : 구문을 분석하는 파서(Parser)


실습 : 네이버웹툰

 

1. url 접근 및 BeautifulSoup 객체 만들기

import requests
from bs4 import BeautifulSoup

url = "https://comic.naver.com/webtoon/weekday"
res = requests.get(url)
res.raise_for_status()

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

1. 네이버웹툰 url의 정보를 requests.get() 함수를 사용하여 가져온다.

2. res.raise_for_status() : 웹페이지를 정상적으로 사용할 수 있는지 확인한다

3. 가져온 HTML 문서를 파서를 통해 BeautifulSoup 객체로 만든다.

 

 

2. 각종 태그 및 속성 가져오기

soup = BeautifulSoup(res.text, "lxml") # 가져온 HTML 문서를 파서를 통해 BeautifulSoup 객체로 만듦
print(soup.title) # 제목 가져오기
print(soup.title.get_text()) # 제목의 텍스트만 가져오기
print(soup.a) # soup 객체에서 처음 발견되는 a 요소 출력
print(soup.a.attrs) # soup 객채에서 처음 발견되는 a 요소 속성 정보 확인
print(soup.a["href"]) # a 요소의 href 속성 값 정보 확인
print(soup.find("a", attrs={"class":"Nbtn_upload"})) # a 요소 중에서 Class의 속성이 Nbtn_upload인 것들 중 처음으로 발견되는 것을 가져옴
print(soup.find(attrs={"class":"Nbtn_upload"})) # Class의 속성이 Nbtn_upload인 것들 중 처음으로 발견되는 것을 가져옴

 

결과

<title>네이버 웹툰 &gt; 요일별  웹툰 &gt; 전체웹툰</title>
네이버 웹툰 > 요일별  웹툰 > 전체웹툰
<a href="#menu" onclick="document.getElementById('menu').tabIndex=-1;document.getElementById('menu').focus();return false;"><span>메인 메뉴로 바로가기</span></a>
{'href': '#menu', 'onclick': "document.getElementById('menu').tabIndex=-1;document.getElementById('menu').focus();return false;"}
#menu
<a class="Nbtn_upload" href="/mypage/myActivity" onclick="nclk_v2(event,'olk.upload');">웹툰 올리기</a>
<a class="Nbtn_upload" href="/mypage/myActivity" onclick="nclk_v2(event,'olk.upload');">웹툰 올리기</a>
<a href="/webtoon/detail?titleId=654774&amp;no=347" onclick="nclk_v2(event,'rnk*p.cont','654774','2')" title="소녀의 세계-2부 128화">소녀의 세계-2부 128화</a>

 

 

3. 네이버 웹툰 인기급상승 인기순위 가져오기

# 네이버 웹툰 인기급상승 인기순 1~10위 가져오기

rank1 = soup.find("li", attrs={"class":"rank01"})

HTML 문서에서 class 속성값이 rank01인 "li"(list)를 찾는다. -> 인기 급상승 인기순위

 

# 1. 자식 관계 요소
print(rank1.a.get_text()) # rank1의 a 요소(링크)만 가져오기
#2. 형제 관계 요소
print(rank1.next_sibling) # 개행문자
rank2 = rank1.next_sibling.next_sibling # 다음 위치의 형제 관계 요소를 가져옴
rank3 = rank2.next_sibling.next_sibling # 다음 위치의 형제 관계 요소를 가져옴
rank2 = rank3.previous_sibling.previous_sibling # 이전 위치의 형제 관계 요소를 가져옴

rank들 사이에 개행문자가 있어서 next_sibling을 두 번 해야한다. 아래의 함수를 사용하면 개행문자가 있는지 없는지 확인할 필요없다.

 

rank2 = rank1.find_next_sibling("li") # 다음 위치의 li 형제 관계 요소를 가져옴
rank3 = rank2.find_next_sibling("li") # 다음 위치의 li 형제 관계 요소를 가져옴
rank2 = rank3.find_previous_sibling("li") # 다음 위치의 li 형제 관계 요소를 가져옴

요소.find_next_sibling("태그 종류") 함수를 사용하면 원하는 태그의 형제 관계 요소만을 가져올 수 있다.

 

all_rank = rank1.find_next_siblings("li") # 다음 위치의 li 모든 형제 관계 요소를 가져옴

요소.find_next_siblings("태그 종류") 함수를 사용하면 모든 형제 관계 요소를 가져올 수 있다.

 

# 3. 부모 관계 요소
print(rank1.parent)

find 함수의 다양한 사용법

 

rank1 = soup.find("li", attrs={"class":"rank01"})
webtoon = soup.find("a", text="소녀의 세계-2부 128화") # 헤당 텍스트에 해당하는 a 요소를 가져온다.

속성뿐만 아니라 텍스트를 찾아서 해당 요소를 가져올 수 있다.

 

 


전체 코드

import requests
from bs4 import BeautifulSoup

url = "https://comic.naver.com/webtoon/weekday"
res = requests.get(url)
res.raise_for_status()

soup = BeautifulSoup(res.text, "lxml") # 가져온 HTML 문서를 파서를 통해 BeautifulSoup 객체로 만듦
print(soup.title) # 제목 가져오기
print(soup.title.get_text()) # 제목의 텍스트만 가져오기
print(soup.a) # soup 객체에서 처음 발견되는 a 요소 출력
print(soup.a.attrs) # soup 객채에서 처음 발견되는 a 요소 속성 정보 확인
print(soup.a["href"]) # a 요소의 href 속성 값 정보 확인
print(soup.find("a", attrs={"class":"Nbtn_upload"})) # a 요소 중에서 Class의 속성이 Nbtn_upload인 것들 중 처음으로 발견되는 것을 가져옴
print(soup.find(attrs={"class":"Nbtn_upload"})) # Class의 속성이 Nbtn_upload인 것들 중 처음으로 발견되는 것을 가져옴


# 네이버 웹툰 인기급상승 인기순 1~10위 가져오기 #

rank1 = soup.find("li", attrs={"class":"rank01"})

# 1. 자식 관계 요소
print(rank1.a.get_text()) # rank1의 a 요소(링크)만 가져오기

#2. 형제 관계 요소
print(rank1.next_sibling) # 개행문자
rank2 = rank1.next_sibling.next_sibling # 다음 위치의 형제 관계 요소를 가져옴
rank3 = rank2.next_sibling.next_sibling # 다음 위치의 형제 관계 요소를 가져옴
rank2 = rank3.previous_sibling.previous_sibling # 이전 위치의 형제 관계 요소를 가져옴

rank2 = rank1.find_next_sibling("li") # 다음 위치의 li 형제 관계 요소를 가져옴
rank3 = rank2.find_next_sibling("li") # 다음 위치의 li 형제 관계 요소를 가져옴
rank2 = rank3.find_previous_sibling("li") # 다음 위치의 li 형제 관계 요소를 가져옴

all_rank = rank1.find_next_siblings("li") # 다음 위치의 li 모든 형제 관계 요소를 가져옴

# 3. 부모 관계 요소
print(rank1.parent)


# find 함수 #

webtoon = soup.find("a", text="소녀의 세계-2부 128화") # 헤당 텍스트에 해당하는 a 요소를 가져온다.
print(webtoon)

댓글