본문 바로가기
iaa.dev/Python

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

by chopper.kid 2021. 12. 2.

교보문고 베스트셀러 페이지에서 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

댓글