我需要从REST API检索500部最受欢迎的电影,但是结果限制为每页20部,并且每10秒只能进行40次调用(https://developers.themoviedb.org/3/getting-started/request-rate-limiting)。我无法动态浏览分页结果,因此500个最受欢迎的结果都在一个列表中。
我可以成功返回前20名最受欢迎的电影(请参见下文)并枚举电影的数量,但是我陷入了循环工作,使我无法通过API分页进入前500名而不会超时速率限制。
import requests #to make TMDB API calls
#Discover API url filtered to movies >= 2004 and containing Drama genre_ID: 18
discover_api = 'https://api.themoviedb.org/3/discover/movie?
api_key=['my api key']&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=false&primary_release_year=>%3D2004&with_genres=18'
#Returning all drama films >= 2004 in popularity desc
discover_api = requests.get(discover_api).json()
most_popular_films = discover_api['results']
#printing movie_id and movie_title by popularity desc
for i, film in enumerate(most_popular_films):
print(i, film['id'], film['title'])
Sample response:
{
"page": 1,
"total_results": 101685,
"total_pages": 5085,
"results": [
{
"vote_count": 13,
"id": 280960,
"video": false,
"vote_average": 5.2,
"title": "Catarina and the others",
"popularity": 130.491,
"poster_path": "/kZMCbp0o46Tsg43omSHNHJKNTx9.jpg",
"original_language": "pt",
"original_title": "Catarina e os Outros",
"genre_ids": [
18,
9648
],
"backdrop_path": "/9nDiMhvL3FtaWMsvvvzQIuq276X.jpg",
"adult": false,
"overview": "Outside, the first sun rays break the dawn. Sixteen years old Catarina can't fall asleep. Inconsequently, in the big city adults are moved by desire... Catarina found she is HIV positive. She wants to drag everyone else along.",
"release_date": "2011-03-01"
},
{
"vote_count": 9,
"id": 531309,
"video": false,
"vote_average": 4.6,
"title": "Brightburn",
"popularity": 127.582,
"poster_path": "/roslEbKdY0WSgYaB5KXvPKY0bXS.jpg",
"original_language": "en",
"original_title": "Brightburn",
"genre_ids": [
27,
878,
18,
53
],
我需要python循环才能将分页的结果附加到单个列表中,直到捕获了500部最受欢迎的电影。
Desired Output:
Movie_ID Movie_Title
280960 Catarina and the others
531309 Brightburn
438650 Cold Pursuit
537915 After
50465 Glass
457799 Extremely Wicked, Shockingly Evil and Vile
答案 0 :(得分:2)
大多数API都包含一个next_url
字段,以帮助您循环浏览所有结果。让我们研究一些情况。
next_url
字段您可以循环浏览所有页面,直到results
字段为空:
import requests #to make TMDB API calls
#Discover API url filtered to movies >= 2004 and containing Drama genre_ID: 18
discover_api_url = 'https://api.themoviedb.org/3/discover/movie?
api_key=['my api key']&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=false&primary_release_year=>%3D2004&with_genres=18'
most_popular_films = []
new_results = True
page = 1
while new_results:
discover_api = requests.get(discover_api_url + f"&page={page}").json()
new_results = discover_api.get("results", [])
most_popular_films.extend(new_results)
page += 1
#printing movie_id and movie_title by popularity desc
for i, film in enumerate(most_popular_films):
print(i, film['id'], film['title'])
total_pages
字段import requests #to make TMDB API calls
#Discover API url filtered to movies >= 2004 and containing Drama genre_ID: 18
discover_api_url = 'https://api.themoviedb.org/3/discover/movie?
api_key=['my api key']&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=false&primary_release_year=>%3D2004&with_genres=18'
discover_api = requests.get(discover_api_url).json()
most_popular_films = discover_api["results"]
for page in range(2, discover_api["total_pages"]+1):
discover_api = requests.get(discover_api_url + f"&page={page}").json()
most_popular_films.extend(discover_api["results"])
#printing movie_id and movie_title by popularity desc
for i, film in enumerate(most_popular_films):
print(i, film['id'], film['title'])
next_url
字段存在!是的!同样的想法,只是现在我们检查next_url
字段是否为空-如果为空,则为最后一页。
import requests #to make TMDB API calls
#Discover API url filtered to movies >= 2004 and containing Drama genre_ID: 18
discover_api = 'https://api.themoviedb.org/3/discover/movie?
api_key=['my api key']&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=false&primary_release_year=>%3D2004&with_genres=18'
discover_api = requests.get(discover_api).json()
most_popular_films = discover_api["results"]
while discover_api["next_url"]:
discover_api = requests.get(discover_api["next_url"]).json()
most_popular_films.extend(discover_api["results"])
#printing movie_id and movie_title by popularity desc
for i, film in enumerate(most_popular_films):
print(i, film['id'], film['title'])