본문 바로가기

프로젝트 목록/ParseWEB

ParseWEB [1-6] 교보문고 베스트 셀러 파싱

6번째 크롤링 및 파싱 강좌입니다. 이번 강좌에서는 교보문고에서 제공해주고 있는 종합 일간 베스트 셀러에 해당하는 데이터를 가져와 보려고 합니다.

사전 정보 수집

이번에는 이전 강좌와 다르게 모바일 페이지에서 교보문고의 종합 일간 베스트 셀러를 가져오려고 합니다.

모바일 페이지의 경우 PC 페이지와 다르게 로딩하는 데이터도 적기 때문에 파싱을 하는 입장에서도 편리합니다.


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

베스트 셀러


해당 페이지를 접속하면 잠깐 로딩 창이 나오고 데이터가 출력되는 것을 확인할 수 있습니다. 따라서 이것을 통해 비동기적으로 데이터를 받아온다는 사실을 유추할 수 있습니다.

즉 개발자도구를 이용해서 XHR 요청을 필터링하면 우리가 원하는 데이터를 얻을 수 있다는 것을 의미합니다. XHR 요청을 필터링하면 아래와 같은 결과를 얻을 수 있습니다.


필터링한 요청들을 보면 이름이 ajaxBestLink.ink라는 요청을 볼 수 있습니다. 이름을 통해서 해당 요청이 베스트 셀러 정보를 가지고 온다는 사실을 알 수 있습니다.

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


그래서 해당 요청을 어떻게 보내는지 확인하면 아래와 같이 URL은 http://m.kyobobook.co.kr/digital/ebook/ajaxBestList.ink이고 method는 POST를 사용하며 데이터로 몇 가지 정보를 보내는 것을 확인할 수 있습니다.


응답을 확인해보면 titlen 태그에는 도서명이, author 태그에는 저자가, 그리고 salePrice 태그에는 판매 가격이 있는 것을 확인할 수 있습니다.

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

구현하기

import xml.etree.ElementTree as ET
import requests

def get_content():
    url = 'http://m.kyobobook.co.kr/digital/ebook/ajaxBestList.ink'
    post_data = {
        'count1': 1,
        'item_position': 1,
        'listCateGubun': 1,
        'listSortType': 0,
        'listSortType2': 0,
        'listSortType3': 0,
        'listSortType4': 0,
        'class_code': '',
    }
    req = requests.post(url, data=post_data)
    content = req.content

    xml = ET.fromstring(content)

    book_names = map(lambda x: x.text, xml.iter('titlen'))
    book_authors = map(lambda x: x.text, xml.iter('author'))
    book_prices = map(lambda x: x.text, xml.iter('salePrice'))

    return list(zip(book_names, book_authors, book_prices))

result = get_content()

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

시연 결과

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


더 생각해보기

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


  1. XHR 요청을 보낼 때 같이 보내는 값들은 어떤 의미를 가지며 없는 경우 어떻게 되는지 알아봅시다.
  2. XML 결과에서 다른 태그들은 어떤 의미가 있는지를 알아봅시다.
  3. 30위 이후의 내용을 불러오려면 어떻게 해야하는지를 생각해봅시다.
  4. 종합 분야가 아닌 다른 분야에서의 베스트 셀러 정보를 가지고 오려면 코드를 어떻게 수정해야 할지 생각해봅시다.