对Marvel开发人员的API调用,仅接收一页

时间:2018-05-29 16:15:45

标签: python-3.x api

所以,漫威开发者的网站非常酷,但是一些“如何”链接已关闭,我最近不得不将他们的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)

1 个答案:

答案 0 :(得分:1)

他们在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=specialhashasdescribed&limit=100

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

如果你发出这样的GET请求:

http://gateway.marvel.com/v1/public/characters?ts=1&apikey=foobar&hash=specialhashasdescribed&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