Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python循环分页API_Python_Restful Url - Fatal编程技术网

如何使用python循环分页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

我需要从RESTAPI检索500部最受欢迎的电影,但结果限制在每页20部,并且我只能每10秒调用40次()。我无法动态循环分页结果,因此500个最受欢迎的结果都在一个列表中

我可以成功地返回前20名最受欢迎的电影(见下文)并列举电影的数量,但我无法完成循环,该循环允许我对前500名进行分页,而不会因API速率限制而超时

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