如何使用python循环分页API
我需要从RESTAPI检索500部最受欢迎的电影,但结果限制在每页20部,并且我只能每10秒调用40次()。我无法动态循环分页结果,因此500个最受欢迎的结果都在一个列表中 我可以成功地返回前20名最受欢迎的电影(见下文)并列举电影的数量,但我无法完成循环,该循环允许我对前500名进行分页,而不会因API速率限制而超时如何使用python循环分页API,python,restful-url,Python,Restful Url,我需要从RESTAPI检索500部最受欢迎的电影,但结果限制在每页20部,并且我只能每10秒调用40次()。我无法动态循环分页结果,因此500个最受欢迎的结果都在一个列表中 我可以成功地返回前20名最受欢迎的电影(见下文)并列举电影的数量,但我无法完成循环,该循环允许我对前500名进行分页,而不会因API速率限制而超时 import requests #to make TMDB API calls #Discover API url filtered to movies >= 2004
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'])
我需要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
大多数API都包含一个
next\uURL
字段,以帮助您循环查看所有结果。让我们来检查一些案例
1.无next\u url
字段
您可以循环浏览所有页面,直到结果字段为空:
import请求#进行TMDB API调用
#发现过滤到电影>=2004且包含戏剧类型的API url_ID:18
发现\u api\u url=https://api.themoviedb.org/3/discover/movie?
api_key=['my api key']&language=en-US&sort_-by=popularity.desc&include_-成人=false&include_-video=false&primary_-release_-year=>%3D2004&with_-genres=18'
最受欢迎的电影=[]
新结果=真
页码=1
而新的结果是:
discover\u api=requests.get(discover\u api\u url+f“&page={page}”).json()
new_results=discover_api.get(“results”,[])
最受欢迎的电影。扩展(新结果)
页码+=1
#按人气描述打印电影id和电影标题
对于我来说,列举电影(最受欢迎的电影):
印刷品(i、胶片['id']、胶片['title'])
2.取决于总页数
字段
import请求#进行TMDB API调用
#发现过滤到电影>=2004且包含戏剧类型的API url_ID:18
发现\u api\u url=https://api.themoviedb.org/3/discover/movie?
api_key=['my api key']&language=en-US&sort_-by=popularity.desc&include_-成人=false&include_-video=false&primary_-release_-year=>%3D2004&with_-genres=18'
discover\u api=requests.get(discover\u api\u url.json())
最受欢迎的电影=探索api[“结果”]
对于范围内的页面(2,发现api[“总页面”]+1):
discover\u api=requests.get(discover\u api\u url+f“&page={page}”).json()
最受欢迎的电影。扩展(发现api[“结果”])
#按人气描述打印电影id和电影标题
对于我来说,列举电影(最受欢迎的电影):
印刷品(i、胶片['id']、胶片['title'])
3. <代码>下一个url
字段存在!耶!
同样的想法,只是现在我们检查next\u url
字段是否为空-如果为空,则为最后一页
import请求#进行TMDB API调用
#发现过滤到电影>=2004且包含戏剧类型的API url_ID:18
发现(api)https://api.themoviedb.org/3/discover/movie?
api_key=['my api key']&language=en-US&sort_-by=popularity.desc&include_-成人=false&include_-video=false&primary_-release_-year=>%3D2004&with_-genres=18'
discover\u api=requests.get(discover\u api.json())
最受欢迎的电影=探索api[“结果”]
当发现_api[“下一个_url”]时:
discover_api=requests.get(discover_api[“next_url”]).json()
最受欢迎的电影。扩展(发现api[“结果”])
#按人气描述打印电影id和电影标题
对于我来说,列举电影(最受欢迎的电影):
印刷品(i、胶片['id']、胶片['title'])
API响应不包含下一个url字段吗?它取决于API。由于响应包含一些分页字段(“page”:1,“total_pages”:5085,…}
),我希望它接受一个page=n
字段。@AdamGold,据我所知,没有下一个url字段,但有一个“page”参数,它需要一个整数值,如果没有输入值,则默认为“1”。话虽如此,我认为您的第一个解决方案可以工作,但似乎没有任何逻辑将循环限制为顶部的“n”(在我的示例中为500个)结果。@SergeBallesta,API将接受“page=n”参数,但我还需要将这些页面中的结果限制为顶部的“n”(在本例中为500个结果)。我不一定要循环查看所有结果,直到我达到前500个结果——我还需要确保我能够处理每10秒40个请求的API速率限制。我尝试使用您的第一个解决方案,但收到一个错误(见下文)。另外,我想限制循环只返回前“n”个结果,而不是遍历所有内容并可能返回比我需要的更多的结果。收到的错误是什么?顺便说一句,我会选择解决方案2。它更优雅。如果要限制结果的数量,请获取前N页(范围(2,26)
以获取前25页),或者检查最受欢迎的电影长度是否超过N。类型错误回溯(最近一次调用)在3 page=1 4 while new_results:--->5 discover_api=requests.get(discover_api+f“&page={page}”).json()6 new_results=discover_api[“results”]7最受欢迎的电影。扩展(new_results)类型错误:不支持的操作数类型对于+:'dict'和'str'
我使用了您对解决方案#1的更新响应,并收到另一条错误消息:KeyError回溯(最近一次调用)在4中,而新的_结果:5 discover_api=requests.get(discover_api_url+f“&page={page}”).json()--->6新结果=发现api[“结果”]7部最受欢迎的电影。扩展(新结果)8页+=1键错误:“结果”
已修复并更新。我再次建议您使用第二种解决方案。
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