본문 바로가기

프로젝트 목록/ParseWEB

ParseWEB [1-7] 영풍문고 베스트 셀러 파싱

7번째 크롤링 및 파싱 강좌로 마지막 베스트 셀러 파싱입니다. 이번 강좌에서는 영풍문고에서 제공해주고 있는 종합 베스트 셀러에 해당하는 데이터를 가져와 보려고 합니다.

사전 정보 수집

이번에도 이전 강좌와 동일하게 모바일 페이지에서 영풍문고의 종합 베스트 셀러를 가져오려고 합니다.


먼저 영풍문고에서 제공하는 베스트 셀러 홈페이지 주소는 아래와 같습니다.

베스트 셀러


해당 페이지를 접속하면 교보문고와 다르게 XHR 요청을 통해 비동기적으로 받아오는 것이 아니라는 것을 확인할 수 있습니다.

페이지 아래쪽을 내려보면 "더보기"가 있는데 해당 요소를 누르면 화면 이동 없이 아래쪽에 이후의 베스트 셀러 정보가 추가되는 것을 볼 수 있습니다.

이를 통해서 XHR로 요청을 보내 받은 응답을 가공해서 자바스크립트를 이용해 아래쪽에 붙여준다는 것을 알 수 있으며 이때의 XHR 요청을 필터링하면 아래와 같은 결과를 얻을 수 있습니다.


해당하는 응답을 보면 아래와 같이 JSON형태로 데이터를 보내주는 것을 확인할 수 있습니다.


그래서 해당 요청을 어떻게 보내는지 확인하면 URL은 http://ypbooks.co.kr/ypbooks/book/kor/getBookListMobileAjax.jsp이고 method는 POST를 사용하며 데이터로 몇 가지 정보를 보내는 것을 볼 수 있습니다.

참고로 보내는 정보 중에서 pageno의 경우에는 2로 되어 있기 때문에 1로 설정하면 1위부터 10위까지에 대한 정보를 얻을 수 있다는 것을 유추할 수 있습니다.


응답을 확인해보면 book_title 키에는 도서명이, salecost 키에는 판매 가격이 있는 것을 확인할 수 있습니다.

이 내용을 기반으로 해서 코드를 작성하면 됩니다.

구현하기

import json
import requests

def get_content():
    url = 'http://ypbooks.co.kr/ypbooks/book/kor/getBookListMobileAjax.jsp'
    post_data={'themeno': 'A000', 'pageno': 1, 'method': 'getBestsellerScrollList'}
    req = requests.post(url, data=post_data)
    content = req.content

    items = json.loads(content)

    result = [(item['book_title'], item['salecost']) for item in items]

    return result

result = get_content()

for index, item in enumerate(result):
    print('[{:2}위] {} / {}'.format(index + 1, item[0], item[1]))

시연 결과

아래 이미지와 같이 영풍문고의 종합 베스트 셀러를 잘 가지고 오는 것을 확인할 수 있습니다.


더 생각해보기

아래 내용은 직접 생각해서 구현을 해보시기 바라며 해당 내용에 대한 답안은 따로 제공하지 않습니다.


  1. JSON 결과에서 다른 키 값들은 어떤 의미가 있는지를 알아봅시다.
  2. 모바일 환경에서는 저자에 대한 정보를 얻을 수 없습니다. 해당 정보를 얻기 위해서는 어떻게 해야 할지 생각해봅시다.
  3. 1위부터 50위까지 내용을 불러오려면 어떻게 해야 하는지를 생각해봅시다.
  4. 종합 분야가 아닌 다른 분야에서의 베스트 셀러 정보를 가지고 오려면 코드를 어떻게 수정해야 할지 생각해봅시다.