Как я могу прочитать все страницы ответа API, используя aiohttp с discord.py ?

#python #python-3.x #pagination #discord.py #aiohttp

#python #python-3.x #Разбивка на страницы #discord.py #aiohttp

Вопрос:

Я использую discord.py переписать и использовать aiohttp. Документации по этому API очень мало, и из того, что я видел, я нигде не видел ссылки «next_page» в ответе.

Как мне сделать так, чтобы при выполнении запроса учитывались все страницы ответа json, а не только первая страница по умолчанию?

Вот мой текущий соответствующий код:

 async def command(ctx, *, name):
    if not name:
        return await ctx.channel.send('Uhhhh. How am I supposed to show you info if you don't enter a name?')
    async with ctx.channel.typing():
        async with aiohttp.ClientSession() as cs:
            async with cs.get("https://website.items.json") as r:
                data = await r.json()
                listings = data["items"]
                for k in listings:
                    if name.lower() == k["name"].lower():
                        await ctx.channel.send("message with results and player info as ascertained in the above code")```
 

Ответ №1:

Вы просто берете максимальное количество страниц и повторяете его. Окончательный URL-адрес будет выглядеть следующим образом.

 https://theshownation.com/mlb20/apis/items.json?page=2
 

Вот как вы настраиваете цикл

 for page_number in range(1,total_pages):
    url = f'https://theshownation.com/mlb20/apis/items.json?page={page_number}'
 

Редактировать:

Полная реализация выглядит следующим образом.

 @bot.command()
async def card(ctx, *, player_name):
    if not player_name:
        return await ctx.channel.send('Uhhhh. How am I supposed to show you player info if you don't enter a player name?')

    async with ctx.channel.typing():
        async with aiohttp.ClientSession() as cs:
            for page_number in range(1, 20):
                async with cs.get(f"https://theshownation.com/mlb20/apis/items.json?page={page_number}") as r:
                    data = await r.json()
                    print(data["page"])
                    listings = data["items"]
                    for k in listings:
                        if player_name.lower() == k["name"].lower():
                            return await ctx.channel.send("message with results and player info as ascertained in the above code")
                            

    await ctx.send('Sorry could not find him')
 

Комментарии:

1. Спасибо вам за ответ. Я сделал пару вариантов этого, но, должно быть, я делаю что-то неправильно. Используя ваш пример « для page_number в диапазоне (1,122): асинхронно с cs.get(» theshownation.com/mlb20/apis/items.jsonamp;page = » {page_number}) как r:« дает мне такую обратную трассировку: ошибка типа: можно только объединить str (не «установить») в str

2. Это должно быть async with cs.get(f"https://theshownation.com/mlb20/apis/items.jsonamp;page={page_number}") as r

3. Хорошо, я только что подключил это предложение. Ошибки обратной трассировки больше нет, но она по-прежнему извлекается только с первой страницы ответа API. Когда вводится имя, например, на странице 77, консоль при повторении печатает первую страницу ответа API. Когда вводится имя, которое находится на первой странице ответа API, консоль печатает первую страницу ответа API при повторении, и бот отправляет мое сообщение await ctx.channel.send на канал discord при повторении. Есть предложения?

4. Я вижу, вы неправильно выполнили цикл. Я внес правку выше, чтобы показать вам, как это сделать. Имейте в виду, что вам нужно немного изменить его, чтобы сделать цикл для total_pages

5. Спасибо, я думаю, что это становится ближе. Добавление return инструкции в отправленное сообщение остановило отправку ботом сотен сообщений, хотя теперь он отправляет только одно совпадение, когда их может быть несколько (одного и того же player_name ). Я попробовал несколько разных версий цикла, чтобы попытаться прочитать все страницы ответа API, но, похоже, я все еще не могу заставить его читать дальше страницы 1. Прошу прощения, мне было трудно найти подходящие примеры, которые используют aiohttp вместо запросов, и когда я это сделал, я не смог заставить их работать для этой цели.