교보문고의 연간 베스트셀러 가져오기- 3
이전 글에서 한페이지에서 얻을 수 있는 데이터갯수를 늘리는 법을 알아봤습니다.
교보문고의 베스트셀러 정보 가져오기-2
이전에 쓴글 교보문고 Python 으로 베스트셀러 정보 가져오기 (스크레이핑) 교보문고 베스트셀러 페이지에서 Python 으로 랭킹정보를 가져오는 간단한 스크레이핑에 대해 설명하겠습니다. 먼저 교
vuxy.tistory.com
from bs4 import BeautifulSoup as bs
from urllib import request, parse
data = parse.urlencode({'perPage': '500'}).encode()
req = request.Request("http://www.kyobobook.co.kr/bestSellerNew/bestseller.laf", data=data)
html = request.urlopen(req)
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]
for i in range(len(title_list)):
print(rank_list[i]+": "+title_list[i])
print(statistics_date)
이전 코드를 실행해보면 결과가 다음과 같습니다.
196: 주린이가 가장 알고 싶은 최다질문 TOP 77(교보 단독 리커버)
197: 그러라 그래(양장본 HardCover)
198: 부의 시나리오(교보 단독 20만 부 기념 리커버 에디션)
199: 지옥. 1
200: 죽이고 싶은 아이(우리학교 소설 읽는 시간)
(집계기준 : 2021.11.24 ~ 2021.11.30)
200개의 데이터이고 집계기준이 1주일의 데이터입니다.
그럼 연간데이터나 월간데이터를 가져오려면 어떻게 해야할지 알아보겠습니다.
베스트셀러 페이지의 왼편 주간 / 월간 / 연간 등의 메뉴가 보입니다.
마우스를 메뉴에 가져가 보면
주간은
https://www.kyobobook.co.kr/bestSellerNew/bestseller.laf?range=1&kind=0&orderClick=DAA&mallGb=KOR&linkClass=A
월간은
https://www.kyobobook.co.kr/bestSellerNew/bestseller.laf?range=1&kind=2&orderClick=DAB&mallGb=KOR&linkClass=A
연간은
https://www.kyobobook.co.kr/bestSellerNew/bestseller.laf?range=1&kind=3&orderClick=DAC&mallGb=KOR&linkClass=A
입니다. 값이 다른게 kind 와 orderClick 입니다. 둘중 하나가 기간과 관련있겠죠. 이름으로 보면 kind 가 더 가깝구요.
그럼 POST 로 리퀘스트 할때 kind 를 넣어서 해보겠습니다.
data = parse.urlencode({'perPage': '500', 'kind': '2'}).encode()
kind:2 로 해서 실행해보면
.......
199: SCP 재단: 확보하고 격리하고 보호하라
200: 너의 말이 좋아서 밑줄을 그었다
(집계기준 : 2021.11.01 ~ 2021.11.30)
입니다.
전달의 월간 데이터를 가져옵니다.
data = parse.urlencode({'perPage': '500', 'kind': '3'}).encode()
kind:3 로 해서 실행해보면
199: 안녕, 소중한 사람
200: 초격차: 리더의 질문(양장본 HardCover)
(집계기준 : 2020.01.01 ~ 2020.12.31)
전년의 1년간의 데이터를 가져옵니다.
연간데이터는 맞긴 한데 나는 올해의 데이터를 원하는데.... 그럼 어쩌지 ?
HTML 소스 를 보면
//집계기간 조회
function goSellBestYmw(selBestYmw){
document.frmList.selBestYmw.value=selBestYmw;
getBestseller();
}
이 함수가 기간과 연관되어있습니다.
2020 년의 데이터를 구할시 selBestYmw 에 '2020000'의 값을 넣습니다.
그럼 2021000을 넣어보겠습니다.
에러가 나면서 가져오질 못하네요.
다시 HTML 소스를 확인해보겠습니다.
<!-- 최 상위 영역 -->
<form name="frmList" id="frmList" method="post" action="/bestSellerNew/bestseller.laf">
<input type="hidden" name="targetPage" value='' />
<input type="hidden" name="mallGb" value='KOR' />
<input type="hidden" name="range" value='1' />
<input type="hidden" name="kind" value='0' />
<input type="hidden" name="kyoboTotalYn" value='N' />
<input type="hidden" name="selBestYmw" value='2021114' />
<input type="hidden" name="linkClass" value='A' />
<input type="hidden" name="cateDivYn" value='' />
<input type="hidden" name="pageNumber" value='1' />
<input type="hidden" name="perPage" value='20' />
<input type="hidden" name="excelYn" value='N' />
<input type="hidden" name="seeOverYn" value='Y' />
<input type="hidden" name="loginYN" value="N"/>
디폴트로 selBestYmw 에 '2021114' 가 들어가 있습니다. 이 값으로 실행해보겠습니다.
199: 지옥. 1
200: 죽이고 싶은 아이(우리학교 소설 읽는 시간)
(집계기준 : 2021.01.01 ~ 2021.12.31)
문제 없이 결과를 가져옵니다.
최종적으로 월간 / 연간 / 주간 관련 데이터를 가져오는 코드는 다음과 같습니다.
from bs4 import BeautifulSoup as bs
from urllib import request, parse
#kind : 2 월간 , kind : 3 연간 , kind : 0 주간
#selBestYmw : 주간 / 월간 /연간의 기간을 지정합니다.
data = parse.urlencode({'perPage': '500', 'kind': '3', 'selBestYmw': '2021114'}).encode()
req = request.Request("http://www.kyobobook.co.kr/bestSellerNew/bestseller.laf", data=data)
html = request.urlopen(req)
soap = bs(html, "html.parser")
print(soap)
# 집계기준 날짜
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]
for i in range(len(title_list)):
print(rank_list[i]+": "+title_list[i])
print(statistics_date)
교보문고에서 데이터를 가져오는건 이정도에서 마무리하겠습니다.