python-3.x - Marvel 开发者 API 调用,仅收到一页

标签 python-3.x api

所以,Marvel 开发者的网站非常酷,但是一些“操作方法”链接已关闭,我最近不得不在一个项目中使用他们的 API。我的问题是,我使用的 API 调用仅下拉一页字符,即 20 个字符。由于文档不可用,是否有一个通用的技巧来拉下所有页面?我应该得到更多大约 200 个字符。我使用的示例“3-Man to Ultra-Man”代码如下......

import urllib.request
import urllib.parse
import json

url = 'http://gateway.marvel.com/v1/public/characters?ts=1&apikey=<my_api_key>'
json_obj = urllib.request.urlopen(url)

data = json.load(json_obj)
new_dict = {}

print (data['attributionText'])

for people in data['data']['results']:
    char = (people ['name'])
print(char)

最佳答案

他们在 API 中实现了一些分页。查看json data中的json响应键:

In [41]: j['data'].keys()
Out[41]: dict_keys(['offset', 'limit', 'total', 'count', 'results'])

In [42]: j['data']['offset']
Out[42]: 0

In [43]: j['data']['limit']
Out[43]: 20

In [44]: j['data']['total']
Out[44]: 1491

In [45]: j['data']['count']
Out[45]: 20

您通常可以通过添加分页参数作为查询参数来控制请求中的分页。您通常还可以控制排序。

我尝试了几个,似乎有效。因此,如果您将请求更改为:

http://gateway.marvel.com/v1/public/characters?ts=1&apikey=foobar&hash=specialhashasscribed&limit=100

您将获得 100 条记录,而不是 20 条。通常,您在单个请求中可以获得的页面数量是有限制的(不确定这里是什么)。另外,这只是记录的第一页。要获取下一页 100,请使用 offset 参数,该参数告诉 API 在返回之前要跳过多少条记录(有时也是要跳过的页数。但在本例中是记录)。

如果您发出如下所示的 GET 请求:

http://gateway.marvel.com/v1/public/characters?ts=1&apikey=foobar&hash=specialhashasscribed&limit=100&offset=100

您将获得第二页 100 条记录。

通常,当您使用这样的 API 时,您必须自己编写代码,通过更改偏移参数并使用一些简单的算术来对结果集进行分页。

这是一个快速的 python 文件,用于显示所有内容及其输出。它使用了很棒的requests库,您可以使用 pip 安装该库.

  import os
  import time

  from hashlib import md5

  import requests  # pip install requests to get this library

  # getting this from env variables, you can replace them with your
  # values, but keep the private key private!
  PUBLIC_KEY = os.getenv('MARVEL_PUBLIC_KEY')
  PRIVATE_KEY = os.getenv('MARVEL_PRIVATE_KEY')


  CHARACTER_URL = 'http://gateway.marvel.com/v1/public/characters'


  def get_hash_and_ts_params():
      ts = str(time.time())
      combined = ''.join([ts, PRIVATE_KEY, PUBLIC_KEY])
      hash_value = md5(combined.encode('ascii')).hexdigest()
      return {'ts': ts, 'hash': hash_value}


  def paged_requests(page_size=100):
      params = {'apikey': PUBLIC_KEY, 'limit': page_size}
      for i in range(2):
          hash_params = get_hash_and_ts_params()
          params.update(hash_params)
          params.update({'offset': page_size * i}) # offset, how many records to skip
          resp = requests.get(CHARACTER_URL, params)
          print(f'Requested page {i} of {page_size} records')
          resp.raise_for_status()  # stop if there are any errors!
          print(f'Full request URL: {resp.request.url}')
          j = resp.json()
          first_ten = [a['name'] for a in j['data']['results']][:10]
          print(f'First ten records: {first_ten}')
      print('Done')


  if __name__ == '__main__':                                                                                                                                                                                                                                                          
      paged_requests()

以及它在我的机器上生成的输出以及我的 API 值:

root@7a1440316d88:/# python marvel.py
Requested page 0 of 100 records
Full request URL: http://gateway.marvel.com/v1/public/characters?apikey=my_public_key&limit=100&ts=1&hash=my_unique_has_value_1&offset=0
First ten records: ['3-D Man', 'A-Bomb (HAS)', 'A.I.M.', 'Aaron Stack', 'Abomination (Emil Blonsky)', 'Abomination (Ultimate)', 'Absorbing Man', 'Abyss', 'Abyss (Age of Apocalypse)', 'Adam Destine']
Requested page 1 of 100 records
Full request URL: http://gateway.marvel.com/v1/public/characters?apikey=my_public_key&limit=100&ts=2&hash=my_unique_hash_value_2&offset=100
First ten records: ['Ben Parker', 'Ben Reilly', 'Ben Urich', 'Bengal', 'Beta-Ray Bill', 'Betty Brant', 'Betty Ross', 'Beyonder', 'Bi-Beast', 'Big Bertha']
Done

关于python-3.x - Marvel 开发者 API 调用,仅收到一页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50588755/

相关文章:

mysql - 使用 sailsJS 未将值插入 mysql 数据库

api - sails.js restful api 中 find-feature 的结果数(在较新版本中)

api - 用于调用电话的 Web API

python - 使用参数名称创建新文件夹而不覆盖现有结果

python - sqlite3 : command not found Python 3 on Windows 10

Python 循环获取请求

python - Django 休息框架中的异步

facebook - 如何使用 Facebook API 作为粉丝页面管理员共享 Facebook 粉丝页面的链接

javascript - 如何在 API 调用中传递 key 作为授权 header

html - 安装 HTML : AttributeError: 'str' object has no attribute 'decode'