본문 바로가기
iaa.dev/Python

교보문고의 연간 베스트셀러 가져오기- 3

by chopper.kid 2021. 12. 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)

교보문고에서 데이터를 가져오는건 이정도에서 마무리하겠습니다.

 

반응형
SMALL

댓글