저번 포스팅 -알라딘 중고책 프로젝트 (1) - 알라딘 API 살펴보기
앞서 알라딘 API를 사용하는 방법을 간단하게 알아보았다. 이제 이 API를 이용하여 본격적으로 데이터를 추출하는 과정을 진행해보려 한다.
알라딘 API는 다른 API 보다 사용하기가 훨씬 간편하다. 엑세스 토큰이 필요하다던가(TTBKey가 있긴 하지만...) 헤더값을 보낸다거나 하는 귀찮은 작업이 필요없다. 각설하고 바로 데이터 추출 코드로 가보자!
데이터 추출
import requests
import json
book_lists = []
for i in range(1, 11):
url = f"http://www.aladin.co.kr/ttb/api/ItemList.aspx?ttbkey={TTBKey}&QueryType=ItemNewAll&SearchTarget=Used&SubSearchTarget=Book&MaxResults=50&start={i}&output=js&Version=20131101&OptResult=usedList"
res = requests.get(url)
items = json.loads(res.text)['item']
나는 원하는 데이터만 추출하여 이를 딕셔너리로 만들고 여러 개의 딕셔너리를 다시 리스트에 넣는 방식을 선택하였다. 알라딘 API에서는 한번에 최대 50개의 데이터만 주기 때문에 이를 for문을 사용하여 10번 반복, 총 500개의 데이터를 받아온다.
원래는 1000개의 데이터까지 받을 수 있지만 혹시나 많은 데이터를 받았다가 중복되는 데이터가 너무 많이 발생하여 비효율적인 DB적재가 일어날 수도 있다고 생각하여, 처음에는 욕심부리지 않고 500개만 받아온 뒤 조금씩 수를 올려볼 예정이다.
본격적인 데이터 추출에 앞서 어떤 데이터를 추출하는지 다시 살펴보기 위해 저번 포스팅에서 봤던 xml을 다시 한 번 보자!
<item itemId="272877854">
<title>[중고] 밤의 피크닉</title>
<link>http://www.aladin.co.kr/shop/wproduct.aspx?ItemId=272877854&partner=openAPI&start=api</link>
<author>온다 리쿠 (지은이), 권남희 (옮긴이)</author>
<pubDate>2005-09-05</pubDate>
<description>2005년 제26회 요시카와 에이지 문학상 신인상 수상작. 일본 서점 직원들이 선정하는 제2회 서점대상 수상작이기도 하다. 1회 수상작은 국내에도 소개되어 많은 사랑을 받은 . 어린 날의 떨림과 반짝거림, 가볍게 들떠 있다가도 곧 무겁게 가라앉곤 하는 10대 시절의 공기를 예리하게 그려냈다.</description>
<isbn>U884964888</isbn>
<isbn13/>
<priceSales>3900</priceSales>
<priceStandard>8700</priceStandard>
<mallType>USED</mallType>
<stockStatus/>
<mileage>0</mileage>
<cover>https://image.aladin.co.kr/product/58/20/coversum/8937830892_2.jpg</cover>
<categoryId>50998</categoryId>
<categoryName>중고샵>국내도서>소설/시/희곡>일본소설>1950년대 이후 일본소설</categoryName>
<publisher>북폴리오</publisher>
<salesPoint>7945</salesPoint>
<adult>false</adult>
<customerReviewRank>9</customerReviewRank>
<subInfo>
<usedType>aladinUsed</usedType>
<newBookList>
<newBook>
<itemId>582029</itemId>
<isbn>8937830892</isbn>
<priceSales>10800</priceSales>
<link>https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=582029&partner=openAPI</link>
</newBook>
</newBookList>
<usedList>
<aladinUsed>
<itemCount>9</itemCount>
<minPrice>4400</minPrice>
<link>https://www.aladin.co.kr/shop/UsedShop/wuseditemall.aspx?ItemId=582029&TabType=2&partner=openAPI</link>
</aladinUsed>
<userUsed>
<itemCount>216</itemCount>
<minPrice>800</minPrice>
<link>https://www.aladin.co.kr/shop/UsedShop/wuseditemall.aspx?ItemId=582029&TabType=1&partner=openAPI</link>
</userUsed>
</usedList>
</subInfo>
</item>
코드를 보면서 여기서 어떤 데이터를 추출하는지 살펴보자!
for item in items:
book_dict = {}
book_dict['itemid'] = item['itemId']
book_dict['title'] = item['title'][5:]
book_dict['author'] = item['author'].split(',')[0].split('(')[0]
book_dict['categoryname_large'] = item['categoryName'].split('>')[2] if len(item['categoryName'].split('>')) > 2 else "UNKNOWN"
book_dict['categoryname_small'] = item['categoryName'].split('>')[3] if len(item['categoryName'].split('>')) > 3 else "UNKNOWN"
book_dict['customer_review_rank'] = item['customerReviewRank']
book_dict['pricesales'] = item['priceSales']
book_dict['pricestandard'] = item['priceStandard']
book_dict['pubdate'] = item['pubDate']
book_dict['publisher'] = item['publisher']
book_dict['aladinused_itemcount'] = int(item['subInfo']['usedList']['aladinUsed']['itemCount'])
book_dict['userused_itemcount'] = int(item['subInfo']['usedList']['userUsed']['itemCount'])
book_dict['userused_minprice'] = item['subInfo']['usedList']['userUsed']['minPrice']
book_lists.append(book_dict)
for문 앞에 들여쓰기가 되어있는 것은 앞서 본 코드에 이어지는 이중 for문이기 때문이다. (실수 아님😎) 위와 같은 데이터를 추출할 것이고, 추출한 값을 딕셔너리로 만들고 이를 만들어 놓은 리스트에 추가할 것이다.
전체 코드 보기
import requests
import json
def used_book_info(TTBKey):
book_lists = []
for i in range(1, 11):
url = f"http://www.aladin.co.kr/ttb/api/ItemList.aspx?ttbkey={TTBKey}&QueryType=ItemNewAll&SearchTarget=Used&SubSearchTarget=Book&MaxResults=50&start={i}&output=js&Version=20131101&OptResult=usedList"
res = requests.get(url)
items = json.loads(res.text)['item']
for item in items:
book_dict = {}
book_dict['itemid'] = item['itemId']
book_dict['title'] = item['title'][5:]
book_dict['author'] = item['author'].split(',')[0].split('(')[0]
book_dict['categoryname_large'] = item['categoryName'].split('>')[2] if len(item['categoryName'].split('>')) > 2 else "UNKNOWN"
book_dict['categoryname_small'] = item['categoryName'].split('>')[3] if len(item['categoryName'].split('>')) > 3 else "UNKNOWN"
book_dict['customer_review_rank'] = item['customerReviewRank']
book_dict['pricesales'] = item['priceSales']
book_dict['pricestandard'] = item['priceStandard']
book_dict['pubdate'] = item['pubDate']
book_dict['publisher'] = item['publisher']
book_dict['aladinused_itemcount'] = int(item['subInfo']['usedList']['aladinUsed']['itemCount'])
book_dict['userused_itemcount'] = int(item['subInfo']['usedList']['userUsed']['itemCount'])
book_dict['userused_minprice'] = item['subInfo']['usedList']['userUsed']['minPrice']
book_lists.append(book_dict)
print(f"{i}번째 배치 완료!")
length = len(book_lists)
print(f"총 {length}개의 데이터가 추출되었습니다.")
return book_lists
위에서 살펴본 코드들을 함수화하여 정리한 코드이다. 사실 추출하는 과정이 너무나 간단하여 딱히 살펴볼 내용이 없는 것 같다...😂
black이나 flake8을 이용하여 코드 컨벤션을 지키려고 하였는데, 코드가 몇 줄 안돼서 굳이 그럴 필요까지는 없을 것 같아서 가독성이 별로 좋지 않은 점은 양해 부탁드립니다 ㅎㅎ
다음은?
데이터를 추출하였으니 이제 추출한 데이터를 DB에 넣는 과정을 진행해야 한다. 계속해서 언급했던 중복되는 데이터를 어떻게 처리할 지와 postgresql을 이용하므로 DB조작을 위한 psycopg 사용은 어떻게 할 것인지와 같은 고민을 해야할 것 같다.
'프로젝트 > 알라딘 중고책 프로젝트' 카테고리의 다른 글
알라딘 중고책 프로젝트 (5) - superset (0) | 2022.04.23 |
---|---|
알라딘 중고책 프로젝트 (4) - RDS, EC2 구축하기 (0) | 2022.04.19 |
알라딘 중고책 프로젝트 (3) - 데이터 적재하기 | 코드 완성 (0) | 2022.04.13 |
알라딘 중고책 프로젝트 (1) - 알라딘 API 살펴보기 (3) | 2022.04.07 |
알라딘 중고책 프로젝트 (0) - 프로젝트 개요 (0) | 2022.03.24 |