Задать вопрос
@argoars

Что такое rate limit в запросах?

Всем привет, столкнулся с проблемой, что уже не моуг понять, что такое Rate Limit в запросе к api. Впринцепи я понимаю, что это, но на практике оно работает не так как я думаю. Я пишу свой первый проект связанный с криптой, и там я отправляю запрос к бирже Mexc, на получение orderbook для каждого символа. Вот скрип:
import asyncio
import json
import aiohttp


counter = 0

async def get_symbols(session):
    symbols = []
    async with session.get('https://api.mexc.com/api/v3/defaultSymbols') as response:
        data = await response.json()
        for i in data['data']:
            if 'USDT' in i:
                symbols.append(i)
    return symbols


async def get_orderbook(session, symbol, semaphore):
    global counter
    orderbook = {}
    async with semaphore:
        async with session.get(f'https://api.mexc.com/api/v3/depth?symbol={symbol}&limit=10') as response:
            await asyncio.sleep(10)
            counter +=1
            print(response.status, counter)
            try:
                data = await response.json()
                if 'asks' in data and 'bids' in data:
                    asks = data['asks']
                    bids = data['bids']
                    orderbook[symbol] = {
                        'a': asks,
                        'b': bids
                    }
                    return orderbook
            except aiohttp.ContentTypeError as e:
                print(e)


async def main():
    async with aiohttp.ClientSession() as session:
        symbols = await get_symbols(session)
        tasks = []
        symbols_len = len(symbols)
        counter = 0
        semaphore = asyncio.Semaphore(100)
        for symbol in symbols:
            counter +=1
            tasks.append(get_orderbook(session, symbol, semaphore))
            print(f'{counter}/{symbols_len}')
        orderbook = await asyncio.gather(*tasks)
        print(orderbook)
        with open ('sdf.txt', 'w') as f:
            json.dump(orderbook, f, indent=4)



if __name__ == '__main__':
    asyncio.run(main())


Но как и у любого api есть свои лимиты, я пытаюсь их соблюдать, но у меня не получается. Прошу пожалуйста помочь мне с данной проблемой т.к в документации api написано, что с 1 ip 500req/10s но я даже не могу отправить 250 запросов за 10 секунд. Вот документация - https://mexcdevelop.github.io/apidocs/spot_v3_en/?...
Если же я правильно понимаю свой же скрипт, то я отправляю по 100 запросов каждые 10 секунд, что правда, но api предоставляет возможность до 500 запросов каждые 10 секунд отправлять, но если я захочу отправлять больше 100, то сразу ошибка
Прошу сильно не судить т.к это первый проект)
  • Вопрос задан
  • 95 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
shabelski89
@shabelski89
engineer
Не понимаю зачем async , код максимально синхронный, ещё и с глобальными переменными.

Возьмите готовые решения, например pymexc .
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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