교보문고 Python 으로 베스트셀러 정보 가져오기 (스크레이핑)
교보문고 베스트셀러 페이지에서 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])