티스토리 뷰

728x90
반응형

 

위 사진에서 빨간색 상자로 둘러싸져 있는 부분을 가져와 보겠습니다.

 

개발자도구(F12)를 열고 랭킹에 해당하는 박스가 어떤 태그로 구성되어 있는지 살펴봅니다.

보시면 ol 태그와 그 안에는 li 태그들로 각각 랭킹들이 구성되어 있는 걸 확인할 수 있습니다.

id 가 realTimeRankFavorite인 ol 태그 내의 li 태그들을 모두 가져오는 코드는 아래와 같습니다.

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')

ranks = soup.find('ol', {'id':'realTimeRankFavorite'}).find_all('li')
print(ranks)

그럼 위의 결과는 아래와 같습니다.

[<li class="rank01">
<a href="/webtoon/detail?titleId=703846&amp;no=187" onclick="nclk_v2(event,'rnk*p.cont','703846','1')" title="여신강림-182화">여신강림-182화</a>
<span class="rankBox">
<img alt="변동없음" height="10" src="https://ssl.pstatic.net/static/comic/images/migration/common/arrow_no.gif" title="변동없음" width="7"/> 0
						
					
				</span>
</li>, <li class="rank02">
<a href="/webtoon/detail?titleId=743139&amp;no=77" onclick="nclk_v2(event,'rnk*p.cont','743139','2')" title="한림체육관-77화">한림체육관-77화</a>
<span class="rankBox">
<img alt="변동없음" height="10" src="https://ssl.pstatic.net/static/comic/images/migration/common/arrow_no.gif" title="변동없음" width="7"/> 0
						
					
				</span>
</li>, <li class="rank03">
<a href="/webtoon/detail?titleId=730656&amp;no=122" onclick="nclk_v2(event,'rnk*p.cont','730656','3')" title="사신소년-122화 본국검">사신소년-122화 본국검</a>
<span class="rankBox">
<img alt="변동없음" height="10" src="https://ssl.pstatic.net/static/comic/images/migration/common/arrow_no.gif" title="변동없음" width="7"/> 0
						
					
				</span>
</li>, <li class="rank04">
<a href="/webtoon/detail?titleId=773522&amp;no=8" onclick="nclk_v2(event,'rnk*p.cont','773522','4')" title="1을 줄게-8화">1을 줄게-8화</a>
<span class="rankBox">
<img alt="순위상승" height="10" src="https://ssl.pstatic.net/static/comic/images/migration/common/arrow_up.gif" title="순위상승" width="7"/>1
						
						
					
				</span>
</li>, <li class="rank05">
<a href="/webtoon/detail?titleId=780506&amp;no=32" onclick="nclk_v2(event,'rnk*p.cont','780506','5')" title="2021 최애캐 안녕, 잘 지내니?-32화. &lt;내 ID는 강남미인&gt; 각자의 삶">2021 최애캐 안녕, 잘 지내니?-32화. &lt;내 ID는 강남미인&gt; 각자의 삶</a>
<span class="rankBox">
<img alt="순위상승" height="10" src="https://ssl.pstatic.net/static/comic/images/migration/common/arrow_up.gif" title="순위상승" width="7"/>1
						
						
					
				</span>
</li>, <li class="rank06">
<a href="/webtoon/detail?titleId=702608&amp;no=208" onclick="nclk_v2(event,'rnk*p.cont','702608','6')" title="랜덤채팅의 그녀!-208. 너는 어떻게 지내니">랜덤채팅의 그녀!-208. 너는 어떻게 지내니</a>
<span class="rankBox">
<img alt="순위하락" height="10" src="https://ssl.pstatic.net/static/comic/images/migration/common/arrow_down.gif" title="순위하락" width="7"/>2
						
						
						
					
				</span>
</li>, <li class="rank07">
<a href="/webtoon/detail?titleId=753856&amp;no=62" onclick="nclk_v2(event,'rnk*p.cont','753856','7')" title="달콤살벌한 부부-62화">달콤살벌한 부부-62화</a>
<span class="rankBox">
<img alt="변동없음" height="10" src="https://ssl.pstatic.net/static/comic/images/migration/common/arrow_no.gif" title="변동없음" width="7"/> 0
						
					
				</span>
</li>, <li class="rank08">
<a href="/webtoon/detail?titleId=738174&amp;no=91" onclick="nclk_v2(event,'rnk*p.cont','738174','8')" title="중증외상센터 : 골든 아워-2부 26화 : 대형 재난">중증외상센터 : 골든 아워-2부 26화 : 대형 재난</a>
<span class="rankBox">
<img alt="변동없음" height="10" src="https://ssl.pstatic.net/static/comic/images/migration/common/arrow_no.gif" title="변동없음" width="7"/> 0
						
					
				</span>
</li>, <li class="rank09">
<a href="/webtoon/detail?titleId=738487&amp;no=98" onclick="nclk_v2(event,'rnk*p.cont','738487','9')" title="하루만 네가 되고 싶어-98. 서임식?">하루만 네가 되고 싶어-98. 서임식?</a>
<span class="rankBox">
<img alt="변동없음" height="10" src="https://ssl.pstatic.net/static/comic/images/migration/common/arrow_no.gif" title="변동없음" width="7"/> 0
						
					
				</span>
</li>, <li class="rank10">
<a href="/webtoon/detail?titleId=783053&amp;no=3" onclick="nclk_v2(event,'rnk*p.cont','783053','10')" title="김부장-3화 무법중년">김부장-3화 무법중년</a>
<span class="rankBox">
<img alt="변동없음" height="10" src="https://ssl.pstatic.net/static/comic/images/migration/common/arrow_no.gif" title="변동없음" width="7"/> 0
						
					
				</span>
</li>]

위 내용을 보면 알겠지만, 랭크에 해당하는 li 태그들이 모두 가져와졌습니다.

이제 li 태그 내부에 있는 링크, 웹툰 제목, 순위변동내역을 가져와보겠습니다.

코드로 작성하기 전에 다시 li 태그의 세부 구성요소들을 살펴보겠습니다.

위 이미지에선 첫 번째 랭크와 네 번째 랭크 요소를 보고 있는데요. href 에 해당하는 부분이 웹툰페이지로 이동하는 링크를 나타내고 있고, title 은 웹툰 제목, rankBox 클래스를 가지고 있는 span 태그의 하위요소에 img 태그의 title 속성은 순위변동내역을 알려주고 있고, 마지막으로 img 태그 형제 요소에는 숫자가 적혀있는데, 이 또한 얼마나 순위가 변동되었는 지를 나타냅니다. 바로 아래와 같은 부분인 것이죠.

이제 코드로 작성해보겠습니다.

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')

ranks = soup.find('ol', {'id':'realTimeRankFavorite'}).find_all('li')
# print(ranks)
for rank in ranks:
	print(rank.a['title'])
	print('https://comic.naver.com' + rank.a['href'])
	prefix = ''
	if rank.span.img['title'] == '순위하락':
		prefix = '-'
	elif rank.span.img['title'] == '순위상승':
		prefix = '+'
	print('변동 : ' + prefix + rank.span.img.next_sibling.strip())

위 코드를 실행해보면 다음과 같은 결과가 출력됩니다.

여신강림-182화
https://comic.naver.com/webtoon/detail?titleId=703846&no=187
변동 : 0
한림체육관-77화
https://comic.naver.com/webtoon/detail?titleId=743139&no=77
변동 : 0
사신소년-122화 본국검
https://comic.naver.com/webtoon/detail?titleId=730656&no=122
변동 : 0
2021 최애캐 안녕, 잘 지내니?-32화. <내 ID는 강남미인> 각자의 삶
https://comic.naver.com/webtoon/detail?titleId=780506&no=32
변동 : +1
1을 줄게-8화
https://comic.naver.com/webtoon/detail?titleId=773522&no=8
변동 : -1
랜덤채팅의 그녀!-208. 너는 어떻게 지내니
https://comic.naver.com/webtoon/detail?titleId=702608&no=208
변동 : 0
중증외상센터 : 골든 아워-2부 26화 : 대형 재난
https://comic.naver.com/webtoon/detail?titleId=738174&no=91
변동 : +1
달콤살벌한 부부-62화
https://comic.naver.com/webtoon/detail?titleId=753856&no=62
변동 : -1
김부장-3화 무법중년
https://comic.naver.com/webtoon/detail?titleId=783053&no=3
변동 : 0
하루만 네가 되고 싶어-98. 서임식?
https://comic.naver.com/webtoon/detail?titleId=738487&no=98
변동 : 0

이렇게 네이버 만화 인기 급상승 웹툰 순위를 가져와보았습니다.

 

- 끝 -

 


혹시 만약 파이썬 크롤링이 처음이고, BeautifulSoup 과 requests 모듈이 설치되어 있지 않다면 설치 해주셔야 합니다.

pip install requests
pip install beautifulsoup4
pip install lxml
728x90
반응형
댓글