Python и API: Выигрышная комбинация для чтения общедоступных данных
Оглавление
- Знакомство с API-интерфейсами
- Вызов Вашего первого API с помощью Python
- Изучение передовых концепций API
- Использование API-интерфейсов с помощью Python: Практические примеры
- Заключение
- Читать далее
- Часто задаваемые вопросы
Python - отличный выбор для работы с интерфейсами прикладного программирования (API), позволяющий эффективно использовать их и взаимодействовать с ними. Используя библиотеку запросов, вы можете легко получать данные из API, которые взаимодействуют с помощью HTTP, таких как REST, SOAP или GraphQL. В этом руководстве рассматриваются основы использования REST API с помощью Python, включая аутентификацию и обработку ответов.
К концу этого урока вы поймете, что:
- API - это интерфейс, который позволяет различным системам взаимодействовать, как правило, посредством запросов и ответов.
- Python - это универсальный язык для использования API-интерфейсов, предлагающий библиотеки, подобные запросам, для упрощения процесса.
- REST и GraphQL - это два распространенных типа API, причем REST более широко используется для общедоступных API.
- Для обработки аутентификации по API в Python вы можете использовать ключи API или более сложные методы, такие как OAuth для доступа к защищенным ресурсам.
Знание того, как использовать API, - это один из тех волшебных навыков, который, будучи освоен, откроет целый мир новых возможностей, и использование API с помощью Python - отличный способ овладеть таким навыком.
К концу этого урока вы сможете использовать Python для использования большинства API, с которыми вы столкнетесь. Если вы разработчик, то знание того, как использовать API-интерфейсы с помощью Python, позволит вам интегрировать данные из различных онлайн-источников в свои приложения
Примечание: В этом руководстве вы сосредоточитесь на том, как использовать API с помощью Python, а не на том, как их создавать. Для получения информации о создании API с помощью Python ознакомьтесь с API-интерфейсами Python REST с использованием Flask, Connexion и SQLAlchemy.
Вы можете скачать исходный код для примеров, которые вы увидите в этом руководстве, перейдя по ссылке ниже:
Получите исходный код: Нажмите здесь, чтобы получить исходный код, который вы будете использовать чтобы узнать о работе с API в Python в этом руководстве.
Знакомство с API
API расшифровывается как интерфейс прикладного программирования. По сути, API действует как коммуникационный уровень, или интерфейс, который позволяет различным системам взаимодействовать друг с другом без необходимости точно понимать, что делают другие.
API-интерфейсы могут быть разных видов. Это могут быть API-интерфейсы операционной системы, используемые для таких действий, как включение камеры и звука при подключении к вызову Zoom. Или это могут быть веб-API, используемые для действий, ориентированных на веб-сайт, таких как лайк изображений в вашем Instagram или получение последних твитов.
Независимо от типа, все API-интерфейсы функционируют в основном одинаково. Обычно вы отправляете запрос на получение информации или данных, и API возвращает ответ с тем, что вы запросили. Например, каждый раз, когда вы открываете Twitter или просматриваете свою ленту Instagram, вы, по сути, отправляете запрос к API, стоящему за этим приложением, и получаете ответ в ответ. Это также известно как вызов API.
В этом руководстве вы уделите больше внимания высокоуровневым API, которые взаимодействуют по сетям, также называемым веб-API.
SOAP против REST против GraphQL
Несмотря на то, что некоторые из приведенных выше примеров ориентированы на более новые платформы или приложения, веб-API существуют уже довольно давно. В конце 1990-х и начале 2000-х годов две различные модели проектирования стали нормой публичного представления данных:
- SOAP (Simple Object Access Protocol) обычно ассоциируется с корпоративным миром, имеет более строгое использование на основе контрактов и в основном основан на действиях.
- REST (передача состояния представления) обычно используется для общедоступных API и идеально подходит для получения данных из Интернета. Он намного проще и ближе к спецификации HTTP, чем SOAP.
В настоящее время в городе появился новичок: GraphQL. Созданный Facebook GraphQL - это очень гибкий язык запросов для API, где клиенты сами решают, что именно они хотят получить с сервера, вместо того, чтобы позволить серверу решать, что отправлять.
Если вы хотите узнать больше о различиях между этими тремя моделями дизайна, то вот несколько полезных ресурсов:
- Что такое SOAP?
- Что такое REST?
- API 101: SOAP против REST
- Введение в GraphQL
- Сравнение архитектурных стилей API: SOAP против REST, GraphQL против RPC
Несмотря на то, что GraphQL находится на подъеме и внедряется все большими и большими компаниями, включая GitHub и Shopify, правда в том, что что большинство общедоступных API по-прежнему являются REST API. Поэтому в рамках данного руководства вы узнаете только о REST API и о том, как использовать их с помощью Python.
API и requests: Брак, заключенный на Небесах
При использовании API-интерфейсов с помощью Python вам нужна только одна библиотека: requests. С его помощью вы сможете выполнять большинство, если не все, действий, необходимых для использования любого общедоступного API.
Вы можете установить requests, выполнив следующую команду в своей консоли:
$ python -m pip install requestsпредварительно> кодовый блок>Примеры в этом руководстве были протестированы с использованием Python 3.13.1 и
requests2.32.3. Однако любая поддерживаемая версия Python иrequestsдолжна давать аналогичные результаты.Вызов Вашего первого API с помощью Python
Хватит болтать — пора сделать свой первый вызов API! В первом примере вы будете вызывать популярный API для генерации случайных пользовательских данных.
На протяжении всего урока вы будете видеть новые API-интерфейсы, представленные в блоках оповещений, подобных приведенному ниже. Это удобный способ просмотреть их позже и быстро найти все новые API-интерфейсы, о которых вы узнали.
API генератора случайных пользователей: Это отличный инструмент для генерации случайных пользовательских данных. Вы можете использовать его для генерации любого количества случайных пользователей и связанных с ними данных, а также для указания пола, национальности и многих других фильтров, которые могут быть действительно полезны при тестировании приложений или, в данном случае, API.
Все, что вам нужно, чтобы начать работу с API генератора случайных пользователей, - это знать, с помощью какого URL его вызывать. В этом примере используется URL-адрес
https://randomuser.me/api/, и это самый простой вызов API, который вы можете выполнить:>>> import requests >>> requests.get("https://randomuser.me/api/") <Response [200]>предварительно> кодовый блок>В этом небольшом примере вы импортируете библиотеку
requests, а затем извлекаете данные из URL-адреса для API генератора случайных пользователей. Но на самом деле вы не видите возвращенных данных. Вместо этого вы получаетеResponse [200], что в терминах API означает, что все прошло нормально.Если вы хотите увидеть фактические данные, то вы можете использовать
.textиз возвращаемогоResponseобъекта:>>> import requests >>> response = requests.get("https://randomuser.me/api/") >>> response.text '{"results":[{"gender":"female", "name":{"title":"Ms","first":"Isobel","last":"Wang"}...'предварительно> кодовый блок>Вот и все! Теперь вы знаете все основы использования API. Вам удалось выбрать своего первого случайного пользователя из API генератора случайных пользователей, используя Python и библиотеку
requests.Конечные точки и ресурсы
Как вы видели выше, первой частью информации, необходимой для использования API, является URL API, обычно называемый базовый URL. Структура базовых URL-адресов ничем не отличается от URL-адресов, которые вы используете для просмотра Google, YouTube или Facebook, хотя обычно они содержат слово
api. Это не обязательно, это скорее эмпирическое правило.Например, вот базовые URL-адреса для нескольких известных проигрывателей API:
https://api.twitter.comhttps://api.github.comhttps://api.stripe.comКак вы можете видеть, все вышеперечисленное начинается с
https://apiи включает остальные официальные домены, такие как.twitter.comили.github.com. Нет определенного стандарта для того, как должен выглядеть базовый URL API, но довольно часто он имитирует эту структуру.Если вы попытаетесь открыть любую из приведенных выше ссылок, то заметите, что большинство из них выдают сообщение об ошибке или запрашивают учетные данные. Это связано с тем, что API-интерфейсы иногда требуют выполнения шагов аутентификации, прежде чем вы сможете их использовать. Вы узнаете больше об этом чуть позже в руководстве.
Cat API: Этот API довольно забавный, но также и действительно хороший пример хорошо выполненного API с отличной документацией . С его помощью вы можете выбрать различные породы кошек и некоторые изображения, но если вы зарегистрируетесь, вы также сможете проголосовать за своих любимых кошек.
Далее, используя Cat API, вы попытаетесь выполнить базовый запрос, чтобы увидеть, чем он может отличаться от API генератора случайных пользователей, который вы пробовали выше:
>>> import requests >>> response = requests.get("https://api.thecatapi.com/") >>> response.text '{"message":"The Cat API","version":"1.3.9"}'предварительно> кодовый блок>В этом случае при вызове базового URL-адреса вы получаете общее сообщение
"The Cat API". Это происходит потому, что вы вызываете базовый URL-адрес, который обычно используется для получения самой базовой информации об API, а не реальных данных.Вызов базового URL-адреса сам по себе не доставляет особого удовольствия, но именно здесь пригодятся конечные точки. Конечная точка - это часть URL-адреса, которая указывает, какой ресурс вы хотите получить. Хорошо документированные API-интерфейсы обычно содержат Ссылку на API, которая чрезвычайно полезна для точного определения того, какие конечные точки и ресурсы есть у API и как их использовать.
Вы можете ознакомиться с официальной документацией, чтобы узнать больше о том, как использовать Cat API и какие конечные точки доступны. Там вы найдете
/breedsконечную точку, которую вы можете использовать для извлечения всех доступных ресурсов или объектов breed.Теперь попробуйте это в локальном коде, используя конечную точку breeds и некоторые знания API, которые у вас уже есть:
>>> response = requests.get("https://api.thecatapi.com/v1/breeds") >>> response.text '[{"weight":{"imperial":"7 - 10","metric":"3 - 5"},"id":"abys",...}]'предварительно> кодовый блок>Вот, пожалуйста, ваш первый список пород с использованием Cat API!
Если вы любитель собак, не волнуйтесь. Для вас тоже есть API с той же конечной точкой, но другим базовым URL:
>>> response = requests.get("https://api.thedogapi.com/v1/breeds") >>> response.text '[{...,"id":1,"name":"Affenpinscher",...}]'предварительно> кодовый блок>Держу пари, вы уже думаете о различных способах использования этих API для создания какого-нибудь симпатичного побочного проекта, и это самое замечательное в API. Как только вы начнете ими пользоваться, ничто не помешает вам превратить хобби или страсть в увлекательный проект.
Прежде чем двигаться дальше, вам нужно знать одну вещь о конечных точках - это разница между
- это зашифрованная версия HTTP, которая делает весь трафик между клиентом и сервером намного более безопасным. При использовании общедоступных API-интерфейсов вам определенно следует избегать отправки какой-либо частной или конфиденциальной информации на конечные точки и использовать только те API-интерфейсы, которые предоставляют безопасный базовый URL-адрес.http://иhttps://. В двухhttp://словах,https://HTTPSДля получения дополнительной информации о том, почему важно придерживаться HTTPS при просмотре онлайн, ознакомьтесь с Изучение HTTPS с помощью Python..
В следующем разделе вы немного подробнее познакомитесь с основными компонентами вызова API.
Запрос и ответ
Как вы вкратце прочитали выше, все взаимодействия между клиентом — в данном случае, вашей консолью Python — и API делятся на запрос и ответ:
- Запросы содержат соответствующие данные, относящиеся к вашему вызову запроса API, такие как базовый URL-адрес, конечная точка, используемый метод, заголовки и так далее.
- Ответы содержат соответствующие данные, возвращаемые сервером, включая данные или содержимое, код состояния и заголовки.
Снова используя Cat API, вы можете немного подробнее разобраться в том, что именно находится внутри объектов
RequestиResponse:>>> response = requests.get("https://api.thecatapi.com/v1/breeds") >>> response <Response [200]> >>> response.status_code 200 >>> response.text '[{"weight":{"imperial":"7 - 10","metric":"3 - 5"}, "id":"abys","name":"Abyssinian","origin":"Egypt", "temperament":"Active, Energetic, Independent, Intelligent, Gentle",...}]' >>> response.headers {'content-type': 'application/json; charset=utf-8', 'x-response-time': '1ms', 'Date': 'Mon, 24 Jul 2023 12:37:59 GMT', 'Server': 'Google Frontend', 'Content-Length': '76734', ...} >>> response.request <PreparedRequest [GET]> >>> request = response.request >>> request.url 'https://api.thecatapi.com/v1/breeds' >>> request.path_url '/v1/breeds' >>> request.method 'GET' >>> request.headers {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}предварительно> кодовый блок>Здесь вы получили доступ к нескольким наиболее важным атрибутам, которые доступны для объектов
RequestиResponse.Вы узнаете больше о некоторых из этих атрибутов в этом руководстве, но если вы хотите копнуть еще глубже, то можете ознакомиться с документацией Mozilla по HTTP-сообщениям для получения более подробного объяснения каждого атрибута.
Коды состояния
Коды состояния являются одной из наиболее важных частей информации, которую следует искать в любом ответе API. Они сообщают вам, был ли ваш запрос выполнен успешно, отсутствуют ли данные, не указаны ли учетные данные и так далее.
Со временем вы научитесь распознавать различные коды состояния без посторонней помощи. Но пока что вот список с некоторыми наиболее распространенными кодами состояния, которые вы найдете:
Status code Description 200 OKYour request was successful! 201 CreatedYour request was accepted, and the resource was created. 400 Bad RequestYour request is either wrong or missing some information. 401 UnauthorizedYour request requires some additional permissions. 404 Not FoundThe requested resource doesn’t exist. 405 Method Not AllowedThe endpoint doesn’t allow for that specific HTTP method. 500 Internal Server ErrorYour request wasn’t expected and probably broke something on the server side. Вы видели
200 OKранее в примерах, которые вы выполнили, и, возможно, даже узнаете404 Not Found, просматривая веб-страницы.Забавный факт: Компании, как правило, используют
404страницы с ошибками для личных шуток или просто для развлечения, как в приведенных ниже примерах:404 страницы с ошибками в www.mantralabsglobal.com и www.pixar.com
Однако в мире API у разработчиков есть ограниченное пространство в ответах для такого рода развлечений. Но они компенсируют это в других местах, например, в заголовках HTTP. Совсем скоро вы увидите несколько примеров!
Вы можете проверить статус ответа, используя
.status_codeи.reason. Библиотекаrequestsтакже выводит код состояния в представлении объектаResponse:>>> response = requests.get("https://api.thecatapi.com/v1/breeds") >>> response <Response [200]> >>> response.status_code 200 >>> response.reason 'OK'предварительно> кодовый блок>Ваш запрос возвращает
200, так что вы можете считать его успешным. Но теперь взгляните на неудачный запрос, который запускается, когда вы добавляете опечатку в конечную точку:>>> response = requests.get("https://api.thecatapi.com/v1/breedz") >>> response <Response [404]> >>> response.status_code 404 >>> response.reason 'Not Found'предварительно> кодовый блок>Как вы можете видеть, конечная точка
/breedzне существует, поэтому API возвращает код состояния404 Not Found.Вы можете использовать эти коды статуса, чтобы быстро узнать, нужно ли вам изменить свой запрос, или еще раз проверить документацию на наличие опечаток или пропущенных фрагментов.
HTTP-заголовки
HTTP-заголовки могут определять несколько параметров, управляющих запросами и ответами:
HTTP Header Description AcceptWhat type of content the client can accept Content-TypeWhat type of content the server will respond with User-AgentWhat software the client is using to communicate with the server ServerWhat software the server is using to communicate with the client AuthenticationWho’s calling the API and what credentials they have Существует множество других заголовков, которые вы можете найти при проверке запроса или ответа. Взгляните на Расширенный список Mozilla, если вам интересно, как конкретно используется каждый из них.
Чтобы просмотреть заголовки ответа, вы можете использовать
response.headers:>>> response = requests.get("https://api.thecatapi.com/v1/breeds/abys") >>> response.headers {'content-type': 'application/json; charset=utf-8', 'x-response-time': '1ms', 'Date': 'Mon, 24 Jul 2023 12:41:34 GMT', 'Server': 'Google Frontend', 'Content-Length': '1041', ...}предварительно> кодовый блок>Чтобы сделать то же самое с заголовками запроса, вы можете использовать
response.request.headers, посколькуrequestявляется атрибутом объектаResponse:>>> response = requests.get("https://api.thecatapi.com/v1/breeds/abys") >>> response.request.headers {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}предварительно> кодовый блок>В этом случае вы не определяете какие-либо конкретные заголовки при отправке запроса, поэтому Python возвращает заголовки по умолчанию.
Пользовательские заголовки
Еще один стандарт, с которым вы можете столкнуться при использовании API, - это использование пользовательских заголовков. Обычно они начинаются с
X-, но это не является обязательным требованием. Разработчики API обычно используют пользовательские заголовки для отправки или запроса дополнительной пользовательской информации от клиентов.Забавный факт: Некоторые компании идут на все, чтобы быть забавными и инновационными, используя HTTP-заголовки так, как они не должны были использоваться, например, для получения заявок на работу.
Вы можете использовать словарь для определения заголовков, и вы можете отправить их вместе с вашим запросом, используя
headersпараметр.get().Например, предположим, вы хотите отправить некоторый идентификатор запроса на сервер API, и вы знаете, что можете сделать это с помощью
X-Request-Id:>>> headers = {"X-Request-Id": "<my-request-id>"} >>> response = requests.get("https://example.org", headers=headers) >>> response.request.headers {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'X-Request-Id': '<my-request-id>'}предварительно> кодовый блок>Если вы пройдетесь по словарю
request.headers, то найдетеX-Request-Idв самом конце, среди нескольких других заголовков, которые по умолчанию добавляются к любому запросу API.В ответе может быть много полезных типов заголовков, но одним из наиболее важных является
Content-Type, который определяет тип содержимого, возвращаемого в ответе.
Content-TypeВ наши дни большинство API-интерфейсов используют JSON в качестве типа контента по умолчанию, но вам может потребоваться использовать API, который возвращает XML или другие типы мультимедиа, такие как изображения или видео. В этом случае тип контента будет отличаться.
Если вы вернетесь к одному из предыдущих примеров с использованием Cat API и попытаетесь проверить заголовок
Content-Type, то заметите, что он был определен какapplication/json:>>> response = requests.get("https://api.thecatapi.com/v1/breeds/abys") >>> response.headers.get("Content-Type") 'application/json; charset=utf-8'предварительно> кодовый блок>Заголовок возвращает определенный тип содержимого, который в данном случае равен
application/json. Он также может возвращать указанную кодировку для содержимого ответа.Изображение диаграмм по API: это полезный API, который можно использовать для создания графики в различных размеров, которые вы можете использовать на вашем сайте.
Если, например, вы попытаетесь получить диаграмму из API графических диаграмм, то вы заметите, что тип контента больше не
application/json, а вместо этого это определяется какimage/png:>>> url = "https://image-charts.com/chart?chs=700x125&cht=ls&chd=t:23,15,28" >>> response = requests.get(url) >>> response <Response [200]> >>> response.headers.get("Content-Type") 'image/png'предварительно> кодовый блок>В этом случае в заголовке
Content-Typeуказано, что возвращаемый контент представляет собой изображение в формате PNG. Как просмотреть этот контент, вы узнаете в следующем разделе.Заголовок
Content-Typeочень важен для того, чтобы вы знали, как обрабатывать ответ и что делать с его содержимым. Существуют сотни других допустимых типов контента, включая аудио, видео, шрифты и многое другое.Содержание ответа
Как вы только что узнали, тип содержимого, которое вы найдете в ответе API, будет варьироваться в зависимости от заголовка
Content-Type. Чтобы правильно прочитать содержимое ответа в соответствии с различными заголовкамиContent-Type, пакетrequestsпоставляется с несколькими различными атрибутамиResponse, которые вы можете использовать для манипулирования данными ответа:
.textвозвращает содержимое ответа в формате Unicode..contentвозвращает содержимое ответа в байтах.Вы уже использовали атрибут
.text, указанный выше. Но для некоторых специфических типов данных, таких как изображения и другие нетекстовые данные, использование.contentобычно является лучшим подходом, даже если оно возвращает результат, очень похожий на.text:>>> response = requests.get("https://api.thecatapi.com/v1/breeds/abys") >>> response.headers.get("Content-Type") 'application/json; charset=utf-8' >>> response.content b'{"weight":{"imperial":"7 - 10","metric":"3 - 5"},"id":"abys",...'предварительно> кодовый блок>Как вы можете видеть, нет большой разницы между
.contentи ранее использовавшимся.text, хотяbуказывает на то, что возвращаемое значение состоит из необработанные байты вместо строки.Взглянув на заголовок ответа
Content-Type, вы можете увидеть, что его содержимым являетсяapplication/json, объект JSON. Для такого рода контента библиотекаrequestsсодержит специальный метод.json(), который вы можете использовать для немедленного преобразования ответа API bytes в структуру данных Python :>>> response = requests.get("https://api.thecatapi.com/v1/breeds/abys") >>> response.headers.get("Content-Type") 'application/json; charset=utf-8' >>> response.json() {'weight': {'imperial': '7 - 10', 'metric': '3 - 5'}, 'id': 'abys', 'name': 'Abyssinian', ...} >>> response.json()["name"] 'Abyssinian'предварительно> кодовый блок>Как вы можете видеть, после выполнения
response.json()вы получаете словарь, который можете использовать так же, как и любой другой словарь в Python.Теперь, оглядываясь на недавний пример, который вы запустили с помощью API графических диаграмм, попробуйте извлечь ту же линейную диаграмму и взглянуть на ее содержимое:
>>> url = "https://image-charts.com/chart?chs=700x125&cht=ls&chd=t:23,15,28" >>> response = requests.get(url) >>> response <Response [200]> >>> response.headers.get("Content-Type") 'image/png' >>> response.content b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x02\xbc\x00\x00\x00...'предварительно> кодовый блок>В данном случае, поскольку вы запрашиваете изображение,
.contentне очень полезно. На самом деле, это почти невозможно понять. Однако вы знаете, что это изображение в формате PNG, поэтому можете попробовать сохранить его в файле и посмотреть, что получится:>>> with open("chart.png", mode="wb") as file: ... file.write(response.content) ...предварительно> кодовый блок>Теперь, если вы откроете папку, с которой работаете, то увидите файл
chart.png, представляющий собой изображение линейной диаграммы, которое вы только что извлекли с помощью API. Разве это не удивительно?HTTP-методы
При вызове API существует несколько различных методов, также называемых глаголами, которые вы можете использовать, чтобы указать, какое действие вы хотите выполнить. Например, если вы хотите получить какие-то данные, то вам следует использовать метод
GET, а если вы хотите создать какие-то данные, то вам следует использовать методPOST.При использовании только данных с использованием API-интерфейсов вы обычно будете придерживаться
GETзапросов, но вот список наиболее распространенных методов и их типичных вариантов использования:
HTTP Method Description Requests method POSTCreate a new resource. requests.post()GETRead an existing resource. requests.get()PUTUpdate an existing resource. requests.put()DELETEDelete an existing resource. requests.delete()Обычно вы называете эти четыре метода CRUD-операциями, поскольку они позволяют создавать, считывать, обновлять и удалять ресурсы.
Примечание: Существует дополнительный метод
PATCH, который также связан с CRUD-операциями, но он немного менее распространен, чем четыре вышеперечисленных. Он используется для внесения частичных изменений вместо полной замены ресурса с использованиемPUT.Вы можете прочитать немного больше о различиях между
PUTиPATCH, чтобы понять их различные потребности.Если вам интересны остальные HTTP-методы или вы просто хотите узнать немного больше о тех, которые вы уже открыли, ознакомьтесь с Документацией Mozilla.
До сих пор вы использовали только
.get()для извлечения данных, но вы можете использовать пакетrequestsтакже и для всех других HTTP-методов:>>> requests.post("https://api.thecatapi.com/v1/breeds/abys") <Response [405]> >>> requests.get("https://api.thecatapi.com/v1/breeds/abys") <Response [200]> >>> requests.put("https://api.thecatapi.com/v1/breeds/abys") <Response [405]> >>> requests.delete("https://api.thecatapi.com/v1/breeds/abys") <Response [405]>предварительно> кодовый блок>Если вы попробуете выполнить эти действия на своей консоли, то заметите, что большинство из них возвращает код состояния
405 Method Not Allowed. Это связано с тем, что не все конечные точки допускают использование методовPOST,PUT, илиDELETE. Особенно, когда вы читаете данные с помощью общедоступных API, вы обнаружите, что большинство API разрешают только запросыGET, поскольку вам не разрешено создавать или изменять существующие данные.Параметры запроса
Иногда, когда вы вызываете API, вы получаете массу данных, которые вам не нужны. Например, при вызове конечной точки API для кошек
/breedsвы получаете много информации о данной породе. Но в некоторых случаях вам может потребоваться извлечь только определенную информацию о данной породе. Вот тут-то и пригодятся параметры запроса!Возможно, вы видели или использовали параметры запроса при просмотре онлайн. Например, при просмотре видео на YouTube у вас есть URL-адрес, подобный
https://www.youtube.com/watch?v=aL5GK2LVMWI.v=в URL-адресе - это то, что вы называете параметром запроса. Обычно он указывается после базового URL-адреса и конечной точки.Чтобы добавить параметр запроса к заданному URL-адресу, вы должны добавить вопросительный знак (
?) перед первым параметром запроса. Если вы хотите, чтобы в вашем запросе было несколько параметров запроса, вы можете разделить их с помощью амперсанда (&).Тот же URL-адрес YouTube, указанный выше, с несколькими параметрами запроса будет выглядеть следующим образом:
https://www.youtube.com/watch?v=aL5GK2LVMWI&t=75.Примечание: Если вы внимательно посмотрите на URL, который ранее использовали для вызова API графических диаграмм, то заметите, что он также содержит несколько параметров запроса.
В мире API параметры запроса - это фильтры, которые вы можете отправлять вместе с вашим запросом к API, чтобы еще больше сузить количество ответов. Например, возвращаясь к API генератора случайных пользователей, вы знаете, как генерировать случайного пользователя:
>>> requests.get("https://randomuser.me/api/").json() {'results': [{'gender': 'male', 'name': {'title': 'Mr', 'first': 'Silvijn', 'last': 'Van Bekkum'}, 'location': {'street': {'number': 2480, 'name': 'Hooijengastrjitte'}, 'city': 'Terherne', 'state': 'Drenthe', 'country': 'Netherlands', 'postcode': 59904...}предварительно> кодовый блок>Однако, допустим, вы специально хотите генерировать только случайных пользователей женского пола. Согласно документации , вы можете использовать параметр запроса
gender=для этого:>>> requests.get("https://randomuser.me/api/?gender=female").json() {'results': [{'gender': 'female', 'name': {'title': 'Mrs', 'first': 'Marjoleine', 'last': 'Van Huffelen'}, 'location': {'street': {'number': 8993, 'name': 'De Teebus'}, 'city': 'West-Terschelling', 'state': 'Limburg', 'country': 'Netherlands', 'postcode': 24241...}предварительно> кодовый блок>Это здорово! Теперь предположим, что вы хотите привлечь только пользователей женского пола из Германии. И снова, просматривая документацию, вы находите раздел, посвященный национальности, и для этого вы можете использовать параметр запроса
nat=:>>> requests.get("https://randomuser.me/api/?gender=female&nat=de").json() {'results': [{'gender': 'female', 'name': {'title': 'Ms', 'first': 'Marita', 'last': 'Hertwig'}, 'location': {'street': {'number': 1430, 'name': 'Waldstraße'}, 'city': 'Velden', 'state': 'Rheinland-Pfalz', 'country': 'Germany', 'postcode': 30737...}предварительно> кодовый блок>Используя параметры запроса, вы можете начать получать более конкретные данные из API, что в большей степени адаптирует весь процесс к вашим потребностям.
Чтобы избежать необходимости перестраивать URL-адрес снова и снова, вы можете использовать атрибут
paramsдля отправки словаря всех параметров запроса для добавления к URL-адресу:>>> query_params = {"gender": "female", "nat": "de"} >>> requests.get("https://randomuser.me/api/", params=query_params).json() {'results': [{'gender': 'female', 'name': {'title': 'Ms', 'first': 'Janet', 'last': 'Weyer'}, 'location': {'street': {'number': 2582, 'name': 'Meisenweg'}, 'city': 'Garding', 'state': 'Mecklenburg-Vorpommern', 'country': 'Germany', 'postcode': 56953...}предварительно> кодовый блок>Вы можете применить описанное выше к любому другому API, который вам нравится. Если вы вернетесь к Cat API, вы сможете вернуть только те породы, которые соответствуют определенному названию. Например, если вы хотите найти породу Оборванец, то вы можете сделать это с помощью параметра запроса
q=:>>> query_params = {"q": "ragamuffin"} >>> endpoint = "https://api.thecatapi.com/v1/breeds/search" >>> requests.get(endpoint, params=query_params).json() [{'weight': {'imperial': '8 - 20', 'metric': '4 - 9'}, 'id': 'raga', 'name': 'Ragamuffin', 'temperament': 'Affectionate, Friendly, Gentle, Calm',...}]предварительно> кодовый блок>Вот и все! Отправив параметру запроса
q=значениеragamuffin, вы сможете отфильтровать все породы, соответствующие этому конкретному значению.Совет: Когда вы повторно один и тот же конечную точку, лучше всего определить его в качестве переменная в верхней части вашего кода. Это облегчит вам жизнь при многократном взаимодействии с API.
С помощью параметров запроса вы можете еще больше сузить свои запросы и указать именно то, что вы ищете. Большинство API, которые вы найдете в Интернете, будут иметь какие-то параметры запроса, которые вы можете использовать для фильтрации данных. Не забудьте просмотреть документацию и ссылки на API, чтобы найти их.
Изучение передовых концепций API
Теперь, когда вы хорошо разбираетесь в основах использования API с помощью Python, есть несколько более сложных тем, которые стоит затронуть, хотя бы вкратце, таких как аутентификация, разбивка на страницы и ограничение скорости.
Аутентификация
Аутентификация API - это, пожалуй, самая сложная тема, которую вы изучите в этом руководстве. Несмотря на то, что многие общедоступные API бесплатны и полностью общедоступны, еще больше API-интерфейсов доступно за той или иной формой аутентификации. Многие API-интерфейсы требуют аутентификации, но вот несколько хороших примеров:
Подходы к аутентификации варьируются от простых и понятных, таких как использование ключей API или базовой аутентификации, до гораздо более сложных и безопасных методов, таких как OAuth.
Как правило, при вызове API без учетных данных или с неправильными учетными данными возвращается код состояния
401 Unauthorizedили403 Forbidden.Ключи API
Наиболее распространенным уровнем аутентификации является Ключ API. Эти ключи используются для идентификации вас как пользователя или заказчика API и отслеживания использования вами API. Ключи API обычно отправляются в виде заголовка запроса или в качестве параметра запроса.
API-интерфейсы NASA: Одна из самых крутых коллекций общедоступных API-интерфейсов - это та, которую предоставляет NASA. Вы можете найти API-интерфейсы для получения астрономической картинки дня или снимков, сделанных с помощью Камеры полихроматического изображения Земли (EPIC) и других.
В этом примере вы воспользуетесь API фотографий марсохода НАСА и получите снимки, сделанные 1 июля 2020 года. Для целей тестирования вы можете использовать
DEMO_KEYAPI-ключ, который NASA предоставляет по умолчанию. В противном случае вы можете быстро создать свой собственный, перейдя на главную страницу API NASA и нажав Начать.Вы можете добавить ключ API к своему запросу, добавив параметр запроса
api_key=:>>> endpoint = "https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos" >>> # Replace DEMO_KEY below with your own key if you generated one. >>> api_key = "DEMO_KEY" >>> query_params = {"api_key": api_key, "earth_date": "2020-07-01"} >>> response = requests.get(endpoint, params=query_params) >>> response <Response [200]>предварительно> кодовый блок>Пока все хорошо. Вам удалось отправить аутентифицированный запрос в API NASA и получить ответ
200 OK.Теперь взгляните на объект
Responseи попробуйте извлечь из него несколько картинок:>>> response.json() {'photos': [{'id': 754118, 'sol': 2809, 'camera': {'id': 20, 'name': 'FHAZ', 'rover_id': 5, 'full_name': 'Front Hazard Avoidance Camera'}, 'img_src': 'https://mars.nasa.gov/msl-raw-images/...JPG', 'earth_date': '2020-07-01', 'rover': {'id': 5, 'name': 'Curiosity', 'landing_date': '2012-08-06', 'launch_date': '2011-11-26', 'status': 'active'}}, ... } >>> photos = response.json()["photos"] >>> print(f"Found {len(photos)} photos") Found 12 photos >>> photos[4]["img_src"] 'https://mars.nasa.gov/msl-raw-images/proj/msl/redops/ods/surface/sol/02809/opgs/edr/rcam/RRB_646869036EDR_F0810628RHAZ00337M_.JPG'предварительно> кодовый блок>Используя
.json()для преобразования ответа в словарь Python, а затем извлекая полеphotosиз ответа, вы можете выполнить итерацию по всем объектамPhotoи даже получить определенный URL-адрес изображения фотографии. Если вы откроете этот URL-адрес в своем браузере, то увидите следующую фотографию Марса, сделанную одним из марсоходов:Изображение API марсохода Mars Rover
Для этого примера вы выбрали конкретную фотографию из словаря ответов.
earth_date(2020-07-01) а затем конкретную фотографию из словаря ответов. (4). Прежде чем двигаться дальше, попробуйте изменить дату или загрузить снимки с другой камеры, чтобы увидеть, как это изменит конечный результат.OAuth: Начало работы
Другим очень распространенным стандартом аутентификации API является OAuth. В этом руководстве вы узнаете только основы OAuth, поскольку это очень обширная тема.
Даже если вы не знали, что это часть OAuth, вы, возможно, видели и использовали OAuth flow несколько раз. Каждый раз, когда приложение или платформа предлагает Войти с помощью или Продолжить с помощью , это отправная точка потока OAuth:
Пример кнопок входа в систему OAuth: Spotify
Вот пошаговое описание того, что произойдет, если вы нажмете Продолжить с Facebook:
Приложение Spotify запросит API Facebook запустить процесс аутентификации. Для этого приложение Spotify отправит свой идентификатор приложения (
client_id) и URL-адрес (redirect_uri), чтобы перенаправить пользователя после успешного выполнения или ошибки.Вы будете перенаправлены на веб-сайт Facebook и вам будет предложено войти в систему, используя свои учетные данные. Приложение Spotify не увидит эти учетные данные и не будет иметь к ним доступа. Это самое важное преимущество OAuth.
Facebook покажет вам все данные, которые приложение Spotify запрашивает из вашего профиля, и попросит вас принять или отклонить предоставление этих данных.
Если вы согласитесь предоставить Spotify доступ к своим данным, вы будете перенаправлены обратно в приложение Spotify, где вы уже вошли в систему.
При выполнении шага 4 Facebook предоставит Spotify специальные учетные данные (
access_token), которые он сможет использовать повторно для получения вашей информации. Этот конкретный токен для входа в Facebook действителен в течение шестидесяти дней, но у других приложений могут быть другие сроки действия. Если вам интересно, то на Facebook есть страница настроек , на которой вы можете проверить, какие приложения получили ваш токен доступа к Facebook.Теперь, с более технической точки зрения, вот что вам нужно знать при использовании API с использованием OAuth:
- Вам нужно создать приложение, у которого будет идентификатор (
app_idилиclient_id) и секрет (app_secretилиclient_secret).- У вас должен быть URL-адрес для перенаправления (
redirect_uri), который API будет использовать для отправки вам информации.- В результате аутентификации вы получите код, который вам необходимо обменять на токен доступа.
Существует несколько вариантов описанного выше, но, вообще говоря, большинство потоков OAuth будут содержать шаги, аналогичные этим.
Совет: Когда вы только тестируете и вам нужен какой-то URL-адрес для перенаправления, чтобы получить
code, вы можете воспользоваться сервисом под названием httpbin.Более конкретно, вы можете использовать
https://httpbin.org/anythingв качестве перенаправляющего URL-адреса, поскольку он просто выводит все, что получает в качестве входных данных. Вы можете проверить это самостоятельно, перейдя по этому URL-адресу.Далее вы познакомитесь с примером использования GitHub API!
OAuth: Практический пример
Как вы видели выше, первым шагом является создание приложения. В документации на GitHub содержится отличное пошаговое объяснение, которому вы можете следовать, чтобы сделать это. Единственное, что следует иметь в виду, - это то, что вам необходимо использовать URL-адрес
https://httpbin.org/anything, указанный выше, для поля URL обратного вызова авторизации.API GitHub: Вы можете использовать API GitHub для множества различных вариантов использования, таких как получение списка репозиториев, которые вы становитесь частью сообщества, получаете список своих подписчиков и многое другое.
После создания приложения скопируйте и вставьте
Client_IDиClient_Secretвместе с выбранным URL-адресом перенаправления в файл Python с именемgithub.py:github.pyкодовый блок>import requests # REPLACE the following variables with your Client ID and Client Secret CLIENT_ID = "<REPLACE_WITH_CLIENT_ID>" CLIENT_SECRET = "<REPLACE_WITH_CLIENT_SECRET>" # REPLACE the following variable with what you added in the # "Authorization callback URL" field REDIRECT_URI = "<REPLACE_WITH_REDIRECT_URI>"Теперь, когда у вас есть все важные переменные, вам нужно иметь возможность создать ссылку для перенаправления пользователя на его учетную запись на GitHub, как объясняется в документации на GitHub:
github.pyкодовый блок># ... def create_oauth_link(): params = { "client_id": CLIENT_ID, "redirect_uri": REDIRECT_URI, "scope": "user", "response_type": "code", } endpoint = "https://github.com/login/oauth/authorize" response = requests.get(endpoint, params=params) return response.urlВ этом фрагменте кода вы сначала определяете необходимые параметры, ожидаемые API, а затем вызываете API, используя пакет
requestsи.get().Когда вы отправите запрос к конечной точке
/login/oauth/authorize, API автоматически перенаправит вас на веб-сайт GitHub. В этом случае вы хотите получить параметрurlиз ответа. Этот параметр содержит точный URL-адрес, на который вас перенаправляет GitHub.Следующим шагом в процессе авторизации является обмен полученного вами кода на токен доступа. Опять же, следуя шагам, описанным в документации на GitHub, вы можете создать для него функцию:
github.pyкодовый блок># ... def exchange_code_for_access_token(code=None): params = { "client_id": CLIENT_ID, "client_secret": CLIENT_SECRET, "redirect_uri": REDIRECT_URI, "code": code, } headers = {"Accept": "application/json"} endpoint = "https://github.com/login/oauth/access_token" response = requests.post(endpoint, params=params, headers=headers).json() return response["access_token"]Здесь вы отправляете
POSTзапрос на обмен кода на токен доступа. В этом запросе вы должны отправить своиCLIENT_SECRETиcode, чтобы GitHub мог подтвердить, что этот конкретный код был изначально сгенерирован вашим приложением. Только после этого API GitHub сгенерирует действительный токен доступа и вернет его вам.Теперь вы можете добавить в свой файл следующее и попробовать запустить его:
github.pyкодовый блок># ... link = create_oauth_link() print(f"Follow the link to start the authentication with GitHub: {link}") code = input("GitHub code: ") access_token = exchange_code_for_access_token(code) print(f"Exchanged code {code} with access token: {access_token}")Если все пойдет по плану, то вы должны быть вознаграждены действительным токеном доступа, который вы сможете использовать для выполнения вызовов API GitHub, выдавая себя за аутентифицированного пользователя.
Теперь попробуйте добавить следующий код, чтобы получить свой профиль пользователя с помощью Пользовательского API и напечатать ваше имя, логин и номер телефона количество частных хранилищ:
github.pyкодовый блок># ... def print_user_info(access_token=None): headers = {"Authorization": f"token {access_token}"} endpoint = "https://api.github.com/user" response = requests.get(endpoint, headers=headers).json() name = response["name"] username = response["login"] private_repos_count = response["total_private_repos"] print( f"{name} ({username}) | private repositories: {private_repos_count}" ) # ...Теперь, когда у вас есть действительный токен доступа, вам нужно отправлять его на все ваши запросы к API, используя заголовок
Authorization. Ответом на ваш запрос будет словарь Python, содержащий всю информацию о пользователе. Из этого словаря вы хотите получить поляname,login, иtotal_private_repos. Вы также можете напечатать переменнуюresponse, чтобы увидеть, какие еще поля доступны.Хорошо, так и должно быть! Осталось только собрать все это воедино и попробовать:
github.pyкодовый блок>import requests # REPLACE the following variables with your Client ID and Client Secret CLIENT_ID = "<REPLACE_WITH_CLIENT_ID>" CLIENT_SECRET = "<REPLACE_WITH_CLIENT_SECRET>" # REPLACE the following variable with what you added in # the "Authorization callback URL" field REDIRECT_URI = "<REPLACE_WITH_REDIRECT_URI>" def create_oauth_link(): params = { "client_id": CLIENT_ID, "redirect_uri": REDIRECT_URI, "scope": "user", "response_type": "code", } endpoint = "https://github.com/login/oauth/authorize" response = requests.get(endpoint, params=params) return response.url def exchange_code_for_access_token(code=None): params = { "client_id": CLIENT_ID, "client_secret": CLIENT_SECRET, "redirect_uri": REDIRECT_URI, "code": code, } headers = {"Accept": "application/json"} endpoint = "https://github.com/login/oauth/access_token" response = requests.post(endpoint, params=params, headers=headers).json() return response["access_token"] def print_user_info(access_token=None): headers = {"Authorization": f"token {access_token}"} endpoint = "https://api.github.com/user" response = requests.get(endpoint, headers=headers).json() name = response["name"] username = response["login"] private_repos_count = response["total_private_repos"] print( f"{name} ({username}) | private repositories: {private_repos_count}" ) link = create_oauth_link() print(f"Follow the link to start the authentication with GitHub: {link}") code = input("GitHub code: ") access_token = exchange_code_for_access_token(code) print(f"Exchanged code {code} with access token: {access_token}") print_user_info(access_token=access_token)Когда вы запускаете приведенный выше код, вы выполняете несколько шагов. Сначала генерируется ссылка с просьбой перейти на страницу GitHub для аутентификации.
После перехода по этой ссылке и входа в систему с вашими учетными данными на GitHub вы будете перенаправлены на указанный вами URL обратного вызова с полем
codeв параметрах запроса:Пример кода OAuth на GitHub
После вставки этого кода в вашу консоль вы обмениваете код на повторно используемый токен доступа.
Наконец, API извлекает информацию о вашем пользователе с помощью этого токена доступа. Когда вы печатаете свое имя, логин и количество приватных репозиториев, ваш результат должен выглядеть примерно так:
John Doe (johndoe) | number of private repositories: 42предварительно> кодовый блок>Здесь нужно выполнить довольно много шагов, но важно, чтобы вы потратили время на то, чтобы по-настоящему разобраться в каждом из них. Большинство API, использующих OAuth, ведут себя примерно одинаково, поэтому хорошее знание этого процесса откроет большой потенциал при чтении данных из API.
Не стесняйтесь улучшить этот пример и добавить дополнительные функциональные возможности, например, получить доступ к общедоступным репозиториям и репозиториям, отмеченным звездочками, или просмотреть своих подписчиков, чтобы определить наиболее популярных из них.
В Интернете есть множество отличных ресурсов об OAuth, и если использование API, лежащих в основе OAuth, - это то, что вам действительно нужно, то вам следует провести дополнительные исследования конкретно по этой теме. Вот несколько хороших мест для начала:
С точки зрения использования API, знание OAuth, безусловно, очень пригодится при взаимодействии с общедоступными API. Большинство API используют OAuth в качестве стандарта аутентификации, и на то есть веские причины.
Разбивка на страницы
За отправку большого количества данных между клиентами и серверами и обратно приходится платить: за пропускную способность. Чтобы серверы могли справляться с большим количеством запросов, API-интерфейсы обычно используют разбиение на страницы .
Говоря очень простым языком, разбивка на страницы - это процесс разделения больших объемов данных на множество более мелких фрагментов. Например, всякий раз, когда вы переходите на страницу вопросов в Stack Overflow, вы видите внизу что-то вроде этого:
Пример разбивки на страницы в Stack Overflow
Вы, вероятно, знаете это по многим другим веб-сайтам, и концепция в основном одинакова на разных сайтах. В частности, для API это обычно обрабатывается с помощью параметров запроса, в основном следующих двух:
- Атрибут
page, который определяет, какую страницу вы запрашиваете в данный момент- Атрибут
size, который определяет размер каждой страницыНазвания конкретных параметров запроса могут сильно отличаться в зависимости от разработчиков API, но концепция одна и та же. Некоторые пользователи API могут также использовать HTTP-заголовки или ответ в формате JSON для возврата текущих фильтров разбивки на страницы.
Снова используя API GitHub, вы можете найти конечную точку события в документации, которая содержит параметры запроса разбивки на страницы. Параметр
per_page=определяет количество возвращаемых элементов, аpage=позволяет разбивать несколько результатов на страницы. Вот как использовать эти параметры:>>> response = requests.get("https://api.github.com/events?per_page=1&page=0") >>> response.json()[0]["id"] '14345572615' >>> response = requests.get("https://api.github.com/events?per_page=1&page=1") >>> response.json()[0]["id"] '14345572808' >>> response = requests.get("https://api.github.com/events?per_page=1&page=2") >>> response.json()[0]["id"] '14345572100'предварительно> кодовый блок>С помощью первого URL-адреса вы можете получить только одно событие. Но, используя параметр запроса
page=, вы можете продолжать разбивать результаты на страницы, чтобы быть уверенным, что сможете извлекать все события, не перегружая API.Ограничение скорости
Учитывая, что API общедоступны и ими может пользоваться любой желающий, люди с дурными намерениями часто пытаются злоупотреблять ими. Чтобы предотвратить такие атаки, API-интерфейсы используют метод, называемый ограничение скорости, который ограничивает количество запросов, которые пользователи могут выполнить за определенный промежуток времени.
Некоторые API могут заблокировать ваш IP-адрес или ключи API, если вы слишком часто превышаете установленный лимит скорости. Будьте осторожны и не превышайте лимиты, установленные разработчиками API. В противном случае вам, возможно, придется подождать некоторое время, прежде чем снова вызывать этот API.
В приведенном ниже примере вы снова будете использовать API GitHub и конечную точку
/events. Согласно документации , GitHub допускает около шестидесяти неаутентифицированных запросов в час. Если вы сделаете это выше, то получите код состояния 403 и не сможете больше выполнять вызовы API в течение некоторого времени.Предупреждение: Запуск следующего фрагмента кода на некоторое время действительно заблокирует доступ к GitHub, поэтому перед запуском убедитесь, что вам некоторое время не нужен доступ к API GitHub.
В целях демонстрации вы намеренно попытаетесь превысить лимит скорости на GitHub, чтобы посмотреть, что произойдет. В приведенном ниже коде вы будете запрашивать данные до тех пор, пока не получите код состояния, отличный от
200 OK:>>> endpoint = "https://api.github.com/events" >>> for i in range(1, 100): >>> response = requests.get(endpoint) >>> print(f"{i} - {response.status_code}") >>> if response.status_code != 200: >>> break 1 - 200 2 - 200 3 - 200 4 - 200 5 - 200 ... 56 - 200 57 - 200 58 - 403 >>> response <Response [403]> >>> response.json() {'message': "API rate limit exceeded for <ip-address>.", 'documentation_url': 'https://developer.github.com/v3/#rate-limiting'}предварительно> кодовый блок>Вот и все: примерно после шестидесяти запросов API перестал возвращать
200 OKответов и вместо этого вернул403 Forbiddenответа, информируя вас о том, что вы превысили лимит скорости API.Некоторые API, такие как GitHub, могут даже включать в заголовки дополнительную информацию о вашем текущем лимите скорости и количестве оставшихся запросов. Это очень полезно для того, чтобы избежать превышения установленного лимита. Взгляните на последнюю версию
response.headers, чтобы узнать, сможете ли вы найти эти конкретные заголовки, ограничивающие скорость.Использование API с помощью Python: Практические примеры
Теперь, когда вы ознакомились со всей теорией и поэкспериментировали с несколькими API, вы можете закрепить полученные знания с помощью нескольких практических примеров. Вы можете изменить приведенные ниже примеры, чтобы приспособить их к вашим собственным целям.
Вы можете ознакомиться с примерами, загрузив исходный код, доступный по ссылке ниже:
Получите исходный код: Нажмите здесь, чтобы получить исходный код, который вы будете использовать чтобы узнать о работе с API в Python в этом руководстве.
Поиск и выборка популярных GIF-файлов
Как насчет того, чтобы создать небольшой скрипт, который будет извлекать три самых популярных GIF-файла с веб-сайта GIPHY? Для этого вам нужно создать приложение и получить API-ключ от GIPHY. Вы можете ознакомиться с инструкциями, развернув поле ниже, а также ознакомиться с документацией по быстрому запуску GIPHY .
Шаг 1: Создайте учетную запись GIPHY
Вам следует начать с создания учетной записи GIPHY:
Настройка GIPHY: Создайте учетную запись
Здесь нет ничего нового, просто ваша обычная форма электронной почты и пароля с дополнительным полем имени пользователя.
Шаг 2: Создайте приложение
После создания вашей учетной записи GIPHY вы можете перейти в Панель управления разработчика, чтобы просмотреть существующие приложения:
Настройка GIPHY - Панель управления разработчика
В этом случае вы еще не настроили приложение, поэтому оно выглядит немного пустым. Вы можете создать свое первое приложение, нажав кнопку Создать приложение:
Настройка GIPHY: Создание нового приложения
Обязательно выберите версию API, а не SDK. После этого вам нужно будет ввести еще несколько сведений о вашем приложении:
Настройка GIPHY: Выберите имя
Вы можете увидеть пример названия и описания приложения выше, но не стесняйтесь заполнять их по своему усмотрению.
Шаг 3: Получение ключа API
Как только вы выполните описанные выше действия, вы должны открыть новое приложение на своей панели мониторинга, под разделом "Ваши приложения". Там у вас будет ключ API, который выглядит следующим образом:
Настройка GIPHY: ключ API
Теперь вы можете скопировать и вставить этот API-ключ в свой код для выполнения запросов к API GIPHY.
После того, как у вас на руках будет ключ API, вы можете приступить к написанию некоторого кода для использования этого API. Однако иногда очень полезно провести несколько тестов, прежде чем внедрять большой объем кода. Некоторые API-интерфейсы на самом деле предоставляют вам инструменты для извлечения данных API непосредственно из документации или их информационной панели.
В данном конкретном случае GIPHY предоставляет вам Обозреватель API, который после создания вашего приложения позволяет вам начать использовать API без написания строки кода. Некоторые другие API-интерфейсы предоставляют вам средства поиска в самой документации.
В любом случае, вы всегда можете использовать код для использования API, и именно это вы и сделаете здесь. Возьмите ключ API с панели управления и, заменив значение переменной
API_KEY, приведенной ниже, вы можете начать использовать API GIPHY:giphy_trending.pyкодовый блок>1import requests 2 3# Replace the following with the API key generated. 4API_KEY = "API_KEY" 5endpoint = "https://api.giphy.com/v1/gifs/trending" 6 7params = {"api_key": API_KEY, "limit": 3, "rating": "g"} 8response = requests.get(endpoint, params=params).json() 9for gif in response["data"]: 10 title = gif["title"] 11 trending_date = gif["trending_datetime"] 12 url = gif["url"] 13 print(f"{title} | {trending_date}\n{url}\n")В верхней части файла, в строках 4 и 5, вы определяете свой
API_KEYи GIPHY APIendpoint, поскольку они не будут меняться так часто, как остальные.В строке 7, используя то, что вы узнали из раздела параметры запроса, вы определяете
paramsи добавляете свой собственный ключ API. Вы также включаете несколько других фильтров:limitдля получения3результатов иratingдля получения только соответствующего контента.Наконец, после получения ответа вы повторяете результаты в строке 9. Для каждого GIF-файла вы печатаете его название, дату и URL-адрес в строке 13.
Запуск этого фрагмента кода в консоли приведет к появлению несколько структурированного списка GIF-файлов:
$ python giphy_trending.py Excited Schitts Creek GIF by CBC | 2024-11-28 20:45:14 https://giphy.com/gifs/cbc-schittscreek-schitts-creek-SiGg4zSmwmbafTYwpj Saved By The Bell Shrug GIF by PeacockTV | 2024-11-28 20:30:15 https://giphy.com/gifs/peacocktv-saved-by-the-bell-bayside-high-school-dZRjehRpivtJsNUxW9 Schitts Creek Thank You GIF by CBC | 2024-11-28 20:15:07 https://giphy.com/gifs/cbc-funny-comedy-26n79l9afmfm1POjCпредварительно> кодовый блок>Теперь, допустим, вы хотите создать скрипт, который позволяет вам искать определенное слово и получать первое совпадение по GIPHY для этого слова. Другая конечная точка и небольшое изменение приведенного выше кода могут сделать это довольно быстро:
giphy_search.pyкодовый блок>import requests # Replace the following with the API key generated. API_KEY = "API_KEY" endpoint = "https://api.giphy.com/v1/gifs/search" search_term = "shrug" params = {"api_key": API_KEY, "limit": 1, "q": search_term, "rating": "g"} response = requests.get(endpoint, params=params).json() for gif in response["data"]: title = gif["title"] url = gif["url"] print(f"{title} | {url}")Вот и все! Теперь вы можете модифицировать этот скрипт по своему вкусу и создавать GIF-файлы по запросу. Попробуйте выбрать GIF—файлы из вашего любимого шоу или фильма, добавить ярлык на свой терминал , чтобы получать самые популярные GIF-файлы по запросу, или интегрироваться с другим API из вашей любимой системы обмена сообщениями - WhatsApp, Slack, как хотите. Тогда начинайте отправлять GIF-файлы своим друзьям и коллегам!
Поиск в Google Книгах
Если вы увлекаетесь книгами, то, возможно, вам понадобится быстрый способ поиска нужной книги. Возможно, вы даже захотите подключить его к поисковой системе вашей местной библиотеки, чтобы узнать, доступна ли данная книга по ISBN .
В этом примере вы будете использовать API Google Books и общедоступную конечную точку volumes для поиска книг.
Вот простой фрагмент кода для поиска слов
"moby dick"во всем каталоге:google_books.pyкодовый блок>1import requests 2 3endpoint = "https://www.googleapis.com/books/v1/volumes" 4query = "moby dick" 5 6params = {"q": query, "maxResults": 3} 7response = requests.get(endpoint, params=params).json() 8for book in response["items"]: 9 volume = book["volumeInfo"] 10 title = volume.get("title", "") 11 published = volume.get("publishedDate", "") 12 description = volume.get("description", "") 13 print(f"{title} ({published})\n{description}\n")Этот пример кода очень похож на те, что вы видели ранее. В строках 3 и 4 вы начинаете с определения важных переменных, таких как конечная точка и, в данном случае, запрос.
После выполнения запроса к API в строке 8 вы начинаете просматривать результаты. Затем в строке 13 вы печатаете наиболее интересную информацию для каждой книги, соответствующую вашему первоначальному запросу:
$ python google_books.py Moby-Dick (2016-04-12) "Call me Ishmael." So begins the famous opening... Moby Dick (1892) A literary classic that wasn't recognized for its... Moby Dick; Or, The Whale (1983-08-16) The story of Captain Ahab's...предварительно> кодовый блок>Вы можете напечатать переменную
bookвнутри цикла, чтобы увидеть, какие еще поля доступны. Вот несколько примеров, которые могут быть полезны для дальнейшего улучшения этого кода:
industryIdentifiersaverageRatingиratingsCountimageLinksИнтересная задача, которую можно решить с помощью этого API, - использовать свои знания OAuth и создать свое собственное приложение bookshelf, которое будет вести учет всех книг, которые вы прочитали или хотите прочитать. Вы даже можете подключить его к своему любимому книжному магазину или библиотеке, чтобы быстро найти книги из списка ваших пожеланий, которые доступны рядом с вами. Это только одна идея. Можете ли вы предложить что-нибудь еще?
Заключение
Вы можете так много узнать об API: разные заголовки, разные типы контента, разные методы аутентификации и так далее. Однако концепции и методы, которые вы изучили в этом руководстве, позволят вам практиковаться с любым API, который вам нравится, и использовать Python для любых ваших потребностей в использовании API.
В этом уроке вы узнали:
- Что такое API и для чего вы можете его использовать
- Каковы коды состояния, Заголовки HTTP и методы HTTP
- Как вы можете использовать Python для использования общедоступных данных с помощью API
- Как вы можете использовать аутентификацию при использовании API с помощью Python
Продолжайте и попробуйте этот новый волшебный навык с любыми общедоступными API, которые вам нравятся! Вы также можете просмотреть примеры, которые вы выполнили в этом руководстве, загрузив исходный код по ссылке ниже:
Получите исходный код: Нажмите здесь, чтобы получить исходный код, который вы будете использовать чтобы узнать о работе с API в Python в этом руководстве.
Читать далее
Примеры API в этом руководстве - лишь малая часть из множества общедоступных API, доступных бесплатно. Вот список коллекций API, которые вы можете использовать, чтобы найти свой следующий любимый API:
Вы можете ознакомиться с ними и найти API, который соответствует вам и вашим увлечениям и, возможно, вдохновит вас на создание небольшого проекта с его использованием. Если вы наткнетесь на хороший общедоступный API, о котором, по вашему мнению, должны знать другие люди, читающие это руководство, пожалуйста, оставьте комментарий ниже!
Часто задаваемые вопросы
Теперь, когда у вас есть некоторый опыт использования API в Python, вы можете воспользоваться приведенными ниже вопросами и ответами, чтобы проверить свое понимание и резюмировать то, что вы узнали.
Эти часто задаваемые вопросы относятся к наиболее важным понятиям, которые вы рассмотрели в этом руководстве. Нажмите на переключатель Показывать/скрывать рядом с каждым вопросом, чтобы открыть ответ.
API, или интерфейс прикладного программирования, действует как коммуникационный уровень, который позволяет различным системам взаимодействовать друг с другом без необходимости понимания внутренней работы каждой системы.
Да, Python отлично подходит для использования API, особенно с такими библиотеками, как
requests, которые упрощают выполнение HTTP-запросов и обработку ответов.
API-интерфейсы REST (Representational State Transfer) используют стандартные методы HTTP и фокусируются на ресурсах и действиях, в то время как GraphQL позволяет клиентам точно указывать, какие данные им нужны, обеспечивая большую гибкость в запросах.
Вы управляете аутентификацией API в Python, используя такие методы, как ключи API, OAuth или базовая аутентификация, часто отправляя учетные данные в заголовках или в качестве параметров запроса.
<статус завершения article-slug="python-api" class="btn-group mb-0" data-api-article-bookmark-url="/api/v1/статьи/python-api/bookmark/" статус завершения data-api-article-url="/api/v1/articles/python-api/завершение_статуса/"> статус завершения> <кнопка поделиться bluesky-text="Интересная статья на #Python от @realpython.com :" email-body="Ознакомьтесь с этой статьей на Python:%0A%0APython и API: Выигрышная комбинация для чтения общедоступных данных" email-subject="Статья на Python для вас" twitter-текст="Интересная статья на #Python от @realpython:" url="https://realpython.com/python-api/" url-title="Python и API: выигрышная комбинация для чтения общедоступных данных"> кнопка поделиться> Back to Top









