관련 라이브러리 및 패키지 설치
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>네이버 웹툰 > 요일별 웹툰 > 전체웹툰</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&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)
'Software > Python' 카테고리의 다른 글
[웹스크래핑] HTTP Method - Get vs. Post (0) | 2023.01.18 |
---|---|
[웹스크래핑] Beautifulsoup4 활용 1 - 네이버 웹툰 (0) | 2023.01.17 |
[웹스크래핑] User Agent - 나를 차단한 웹페이지 접속하기 (0) | 2023.01.15 |
[웹스크래핑] 정규식(Regular Expression) (0) | 2023.01.15 |
[웹스크래핑] Requests 라이브러리 기초 (0) | 2023.01.14 |
댓글