iaa.dev/Python

교보문고 Python 으로 베스트셀러 정보 가져오기 (스크레이핑)

chopper.kid 2021. 12. 2. 21:31

교보문고 베스트셀러 페이지에서 Python 으로 랭킹정보를 가져오는 간단한 스크레이핑에 대해 설명하겠습니다.

 

먼저 교보문고의 베스트셀러 정보 제공 페이지의 URL  은

http://www.kyobobook.co.kr/bestSellerNew/bestseller.laf?orderClick=d79

로 orderClick 이 어떤 파라미터인지 모르지만 일단 그대로 사용해보겠습니다.

 

from urllib.request import urlopen
from bs4 import BeautifulSoup as bs

# 교보문고 베스트셀러 URL
url = "https://www.kyobobook.co.kr/bestSellerNew/bestseller.laf?orderClick=d79"
html = urlopen(url)
soap = bs(html, "html.parser")

여기까지가 기본준비단계로 웹페이지 파싱에는 여러가지 방법이 있는데 지금은 일단 이걸로 진행합니다.

 

베스트셀러 페이지를 소스보기로 해서 쭉 훑어보면 

 

<h4 class="title_best_basic">
		분야 종합
		 <!--  베스트 셀러일때만 노출 -->
		
			 <!--  종합주간 -->
				<small>(집계기준 : 2021.11.24 ~ 2021.11.30)</small>

여기에서 랭킹 관련정보가 시작이니까 여기서부터 끌어와보겠습니다.

태그가 h4 이고 class 이름이 title_best_basic 그리고 그안에 또 small 태그가 있습니다.

그 순서대로 가져와봅니다.

# 집계기준 날짜
statistics_date = soap.find('h4', {'class': 'title_best_basic'}).find('small').text
print(statistics_date)

그리고 이대로 실행해보면 

(집계기준 : 2021.11.24 ~ 2021.11.30)

이렇게 출력됩니다. 

<small>(집계기준 : 2021.11.24 ~ 2021.11.30)</small>

의 small 태그내의 문자열입니다. 

 

다시 html 소스코드를 쭉살펴보면 랭킹리스트가 시작되는 태그가 다음과 같은걸 알 수 있습니다.

<!-- 펼쳐보기 리스트 -->
		
		<ul class="list_type01">

따라서 ul 태그 list_type01 클래스명을 지정하여 다음과 같은 값을 가져옵니다.

bestseller_contents = soap.find('ul', {'class': 'list_type01'})

html ul 태그내를 확인해보면 

 

<div class="detail">
	<div class="subtitle">서울대 소비트렌드 분석센터의 2022 전망</div>
		<div class="title">
			<a onclick="javascript:ecommerceClickListGA('9788959897001', 'KOR', '트렌드 코리아 2022', '미래의창', '130911', '김난도', '', '베스트셀러');" 
               href="http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788959897001"><strong>트렌드 코리아 2022</strong></a>

이렇게 되어있습니다.

 

bestseller_list = bestseller_contents.findAll('div', {'class': 'detail'})

로 resultset 을 가져오고 

# 제목
title_list = [b_detail.find('div', {'class': 'title'}).find('strong').text for b_detail in bestseller_list]
print(title_list)

해서 출력해보면 

 

['트렌드 코리아 2022', '거꾸로 읽는 세계사', '미드나잇 라이브러리', '그냥 하지 말라',....]

베스트셀러 제목 리스트를 구할 수 있습니다.

 

반응형

 

순위 확인도 할겸 번호도 추출해보겠습니다.

 

<li>
  <div class="cover">
  <a onclick="javascript:ecommerceClickListGA('9788959897001', 'KOR', '트렌드 코리아 2022', '미래의창', '130911', '김난도', '', '베스트셀러');"
  href="http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788959897001">
  <strong class="rank">1</strong>

번호가 strong 태그에 있으므로 

 

cover_list = bestseller_contents.findAll('div', {'class':'cover'})
# Rank
rank_list = [cover.find('strong', {'class': 'rank'}).text for cover in cover_list]

로 구해질 수 있습니다.

 

이제 구한 값들을 차례대로 출력해보겠습니다.

 

print(statistics_date)
for i in range(len(title_list)):
    print(rank_list[i]+": "+title_list[i])

실행해보면 다음과 같습니다.

(집계기준 : 2021.11.24 ~ 2021.11.30)
1: 트렌드 코리아 2022
2: 거꾸로 읽는 세계사
3: 미드나잇 라이브러리
4: 그냥 하지 말라
5: NFT 레볼루션
6: 원피스. 100: 패왕색
7: 달러구트 꿈 백화점
8: 주식투자 절대원칙
9: 투자는 디테일에 있다
10: 웰씽킹(Wealthinking)(양장본 HardCover)
11: 달러구트 꿈 백화점. 2
12: 거인의 포트폴리오
13: 소크라테스 익스프레스(20만 부 기념 윈터 에디션)
14: 흔한남매 겨울밤 대소동(양장본 HardCover)
15: 듄. 1(DUNE)(양장본 HardCover)
16: 이상한 과자 가게 전천당. 12(양장본 HardCover)
17: 불편한 편의점(15만부 기념 윈터 에디션)
18: 보이지 않는 것에 의미가 있다
19: 장면들
20: 세계미래보고서 2022: 메타 사피엔스가 온다

 

전체 코드를 정리하면 다음과 같습니다.

 

from urllib.request import urlopen
from bs4 import BeautifulSoup as bs

# 교보문고 베스트셀러 URL
url = "https://www.kyobobook.co.kr/bestSellerNew/bestseller.laf?orderClick=d79"
html = urlopen(url)
soap = bs(html, "html.parser")

# 집계기준 날짜
statistics_date = soap.find('h4', {'class': 'title_best_basic'}).find('small').text

bestseller_contents = soap.find('ul', {'class': 'list_type01'})
bestseller_list = bestseller_contents.findAll('div', {'class': 'detail'})

# 제목
title_list = [b_detail.find('div', {'class': 'title'}).find('strong').text for b_detail in bestseller_list]

cover_list = bestseller_contents.findAll('div', {'class': 'cover'})
rank_list = [cover.find('strong', {'class': 'rank'}).text for cover in cover_list]

print(statistics_date)
for i in range(len(title_list)):
    print(rank_list[i]+": "+title_list[i])

 

반응형
SMALL