저번 시간엔 아마도 분기별로 가장 많이 방영된 애니메이션 태그(판타지, 일상 등)을 알아보았다. 이번 시간에는 라프텔에 있는 테마 기능에 대해서 알아보자.
우선, 라프텔 테마 기능은 https://laftel.net/theme/basic/{id}
형식으로 접근할 수 있다. 최근의 테마인, https://laftel.net/theme/basic/158 에 접근한 다음, 어떤 API 요청을 하는 지 보면 다음 API가 요청되는 것을 알 수 있다.
https://laftel.net/api/recommends/v1/themes/158/
이 API의 response는 다음과 같다.
형식을 뜯어보면, 대충 id
는 이 테마의 id(number)인 것 같고, title
은 이 테마이 제목, 그리고 content
는 이 테마의 설명이고, theme_item_list
는 이 테마에 속한 애니메이션들을 나타내는 것 같다. theme_item_list
를 펼쳐보면 다음과 같다.
첫 번째 포스팅에서 설명한 정보 중에서 필요한 부분만을 보내주고 있다는 것을 알 수 있다(전문 용어로 뭐라고 하는 지는 모르겠다). 첫 번째 포스팅에서 추측한 애니메이션 API 명세를 사용하면, 여기서 얻지 못한 정보들(has_free_episode
, award
등)을 얻을 수 있을 것이다.
img_url
인데, 첫 번째 포스팅에서 설명한 api/v1.0/items/{id}/detail
API로 얻어오는 것은 img
이다. 용도가 다른 것은 아닌가 조사해보았지만, 용도가 동일한 것을 확인했다. 아마 API를 수동으로 짜서 두 개의 속성 이름이 다른 것이 아닐까 싶다. 아님 말고.최근에 판권이 만료된 애니메이션을 찾아보자. 첫 번째 포스팅에서 사용한 API로 애니메이션을 전수조사해서 판권만료가 된 애니메이션을 찾을 수도 있겠지만, 이 방법은 너무 비효율적이다. 다행히도, 라프텔은 그달에 판권이 만료된 애니메이션을 테마로 만들어두기 때문에 그 테마들을 모두 찾아, 그 테마에 속하는 애니메이션을 전부 판권이 만료된 애니메이션으로 간주하면 라프텔에서 판권 만료가 된 모든 애니메이션을 찾을 수 있을 것이다.
import requests
import time
import random
import json
expired_themes = []
for x in range(120,130):
url = "https://laftel.net/api/recommends/v1/themes/" + str(x) + "/"
header = {"laftel": "TeJava"}
response = requests.get(url = url, headers = header)
if (response.status_code == 200):
data = response.json()
title = data["title"]
if ("판권" in title):
expired_themes.append((x, title))
time.sleep(random.random())
print("판권 만료를 알리는 테마들: ")
print(expired_themes)
이 코드를 실행하면, 테마 id
가 120~129이고, title
에 "판권"이 포함된 테마들은 모두 expired_themes
에 기록된다.
우리가 필요로 하는 것은 expired_themes
에 있는 테마들에 속한 애니메이션들 이므로, expired_themes에 포함된 각 테마가 가진 모든 애니메이션을 기록해야 한다. 테마에 속한 애니메이션을 list로 반환하는 메소드를 만들자.
def animations_from_theme(data):
animations = []
for x in data:
id = x["id"]
content = x["item"]
content_id = content["id"]
content_name = content["name"]
animations.append((content_id, content_name))
return animations
animations_from_theme
메소드를 추가한 버전은 다음과 같다.
import requests
import time
import random
import json
def animations_from_theme(data):
animations = []
for x in data:
id = x["id"]
content = x["item"]
content_id = content["id"]
content_name = content["name"]
animations.append((content_id, content_name))
return animations
expired_themes = []
expired_animations = []
for x in range(120,130):
url = "https://laftel.net/api/recommends/v1/themes/" + str(x) + "/"
header = {"laftel": "TeJava"}
response = requests.get(url = url, headers = header)
if (response.status_code == 200):
data = response.json()
title = data["title"]
if ("판권" in title):
expired_animations.extend(animations_from_theme(data["theme_item_list"]))
time.sleep(random.random())
print("판권 만료된 애니메이션들 : ")
for x, y in expired_animations:
print(y)
위 코드를 실행하면, 판권 만료된 애니메이션들을 찾을 수 있다.