Python перебирает несколько страниц в API и печатает контент, который мне нужен

Если вы хотите выполнить это как команду Ansible ad-hoc, вы можете сделать следующее:

$ password='SomethingSecret!'
$ ansible 192.168.1.10 -i some_inventory -b -m user -a "name=joe_user \
       update_password=always password=\"{{ \"$password\" | password_hash('sha512') }}\""

Выход из команды:

192.168.1.10 | SUCCESS => {
    "append": false,
    "changed": true,
    "comment": "Joe User",
    "group": 999,
    "home": "/home/joe_user",
    "move_home": false,
    "name": "joe_user",
    "password": "NOT_LOGGING_PASSWORD",
    "shell": "/bin/bash",
    "state": "present",
    "uid": 999
}
0
задан Kendall Kelly 16 January 2019 в 23:46
поделиться

2 ответа

Хорошо, я сначала начну с кода, а затем объясню его.

import request import json

def get_and_print_data(url):
        r = requests.get(url)
        info = r.json()
        for i in info['results']:
                print(i['name'])
        if info.get('next'):
                get_and_print_data(info['next'])

get_and_print_data("https://swapi.co/api/people/")

Код здесь довольно плохой, так как этот метод слишком много делает (получает данные, обрабатывает их, определяет, есть ли следующие страницы и печатает ли данные). Это слишком много логики только для одной функции, но для нашего примера это нормально.

Итак, обо всем по порядку, почему функция? Потому что нам нужно выполнять одни и те же действия (получать, обрабатывать и печатать данные) несколько раз. раз, по одному на страницу. Что меняется? URL, так как для каждой страницы есть разные URL. Таким образом, у нас будет URL в качестве параметра этой функции.

Следующие несколько строк взяты из вашего кода, так что Я предполагаю, что вы знакомы с ними. Тогда у нас есть эта важная строка: if info.get('next'):

В словарях вы обычно извлекаете данные с помощью dictionary[key], и это вызывает и исключение, если ключ не существует, называется KeyError . В этом случае мы должны были использовать попытку / кроме проверки наличия ключа next . Даже если это считается более «питоническим» способом, этот с «если» может быть легче понять.

Что тогда делает .get('next')? Ну, почти то же самое, но вместо броска и исключения он просто вернет None, если ключа нет, и помнит, что в Python None оценивается как ложное.

Короче говоря, это проверит, присутствует ли в вашем ответе ключ next (вы можете видеть, что API возвращает ноль для отсутствующих данных). Если ключ присутствует, мы будем вызывать ту же функцию с URL для следующей страницы и повторять до тех пор, пока в возвращенном JSON не будет отсутствовать (или будет отсутствовать) следующий ключ.

Конечно, нам нужно будет вызвать нашу функцию с начальным URL-адресом и продолжить с этого момента:)

Надеюсь, это поможет, и все легко понять!

0
ответ дан Bogdan Condurache 16 January 2019 в 23:46
поделиться

Мое решение:

import requests
import json

def query_api(url):
    r = requests.get(url)
    info = r.json()
    return info['next'], info['results']

n, r = query_api("https://swapi.co/api/people/")

while n:
    for i in r:
        print(i['name'])
    n, r = query_api(n)

Кроме того, если вы играете с такими API, вы можете взглянуть на request-cahce , который вы можете включить в Ваш код для кэширования результатов API локально, так что вы можете запускать повторные запросы, не превышая ограничения скорости. (И, конечно, быть внимательным к владельцу API).

0
ответ дан v25 16 January 2019 в 23:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: