Парсинг данных через API с Python. Жетоны на предъявителя - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь создать проект, в котором программа автоматически анализирует файл данных из API, выполняет вычисления и возвращает мне некоторый результат. И я застрял в парсинге данных из API. Итак, на сайте, к которому я пытаюсь получить доступ, написано следующее:

    **Authentication and API Token
    USDA ESMIS provides the api-token to all users. Once you have created and confirmed your account, you can request the api-token by making a POST request to /user-token.

    A curl request to get the api-token:
    curl -X POST "https://usda.library.cornell.edu/user_token" -d '{"auth": {"email":"john.smith@example.com","password":"password"}}' -H "Content-Type: application/json"
    
Authorization and API Requests
    To access the API, all requests need an api-token to be passed in the Authorization request header as a bearer token.
    
Authorization: Bearer api-token
    You can also get the api-token below using the POST request to /user_token. Use the api-token with the Authorize feature on this page to test the API.**

Ссылка на полный текст .

Я преобразовываю локон запрос в:

import requests

headers = {
 'accept': '*/*',
 'Content-Type': 'multipart/form-data:',
}

data = '{auth[email]:aaaa,auth[password]:aaaaaa}'

response = requests.post('https://usda.library.cornell.edu/user_token', headers=headers, data=data)

Но получаю только ошибку 400. Насколько я понимаю, проблема в токенах на предъявителя. Я пытался найти ответы на часто задаваемые вопросы или руководства по этому топу c, но безуспешно. Не могли бы вы в общем посоветовать, что мне нужно знать для парсинга данных через API с помощью Python с такими токенами, и порекомендовать ресурсы, чтобы узнать об этом?

1 Ответ

0 голосов
/ 02 августа 2020

Я думаю, что страница USDA немного сбивает с толку. По крайней мере, форма, из которой вы извлекли data = '{auth[email]:aaaa,auth[password]:aaaaaa}', не соответствует ни одному из известных мне вариантов Curl или python .requests. Не то чтобы я знаю о большинстве из этих вариантов, поэтому могу ошибаться, но и у меня это не сработало. Идеально работает модель, показанная в приведенном вами примере кода:

   A curl request to get the api-token:
   curl -X POST "https://usda.library.cornell.edu/user_token" -d '{"auth": {"email":"john.smith@example.com","password":"password"}}' -H "Content-Type: application/json"

, что соответствует фрагменту Python:

token = requests.post("https://usda.library.cornell.edu/user_token",
                      json={'auth':
                               {'email': 'john.smith@example.com',
                                'password':'password'}})

Это будет создать ответ JSON, который вы можете получить с помощью метода json объекта ответа:

bearer = token.json()['jwt']

bearer будет строкой типа 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjg2MDN9.CWZPPpzCGj8qnOrHow8eJmDkzn5sSpSoFPffgq57Ayo', которую вам нужно передать ваши запросы API.

Самый простой способ сделать это, как мне кажется, - просто предоставить заголовок напрямую. (Несомненно, requests предоставляет механизм для этого, поэтому, если вы рыскаете по документации, вы можете найти его. Я этого не делал, потому что сделать это вручную очень просто.)

data = requests.get(
    'https://usda.library.cornell.edu/api/v1/publication/search?q=Avocado',
    headers={'Authorization': 'Bearer '+token.json()['jwt']})

Опять же , проще всего будет использовать метод json для извлечения информации:

>>> import pprint
>>> pprint.pprint(data.json())
[{'agency': ['National Agricultural Statistics Service'],
  'agency_acronym': ['NASS'],
  'contact_email': ['nass@nass.usda.gov'],
  'contact_organization': ['National Agricultural Statistics Service'],
  'description': ['This special publication reports on the damage done to the '
                  'citrus, avocado, vegetable, and sugar cane crops in Florida '
                  'following Hurricane Cleo in 1964. '],
  'frequency': ['Seasonal'],
  'id': 'dv13zt23r',
  'identifier': ['SpecHurrDa'],
  'keywords': ['Citrus',
               'hurricanes',
               'weather',
               'sugarcane',
               'avocados',
               'vegetables'],
  'resource_type': ['Report'],
  'status': ['Inactive'],
  'subject': ['Crops and Crop Products:Sugar Crops',
              'Crops and Crop Products:Fruits',
              'Agriculture Economics and Management:Weather',
              'Crops and Crop Products:Vegetables and Pulses'],
  'subscribable': 'No',
  'title': ['Special Hurricane Damage Report: August 26-27, 1964']},
   
   ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...