Асинхронность asyncio в Python Что не так?

Здравствуйте. На просторах интернета нашел интересное решение поиска пользователей в контакте через API с помощью asyncio. Но почему то скрипт не работает...Несколько дней уже бьюсь и не могу найти ответ. Вроде все правильно, но получаю ответ от сервера: 'Too many requests per second', Где ошибка? Помогите, пожалуйста найти проблему. Вот источник: https://habr.com/ru/post/529696/
Вот ошибка:
60d03506cef1a366193056.png
Вот сам код:
import asyncio
from aiohttp import ClientSession
import json
import nest_asyncio

nest_asyncio.apply()

list_token=[]
with open('tokens.txt', 'r') as f:
    for line in f:
        list_token.append(str(line).rstrip('\n'))
len(list_token)
list_data=[]
 
async def bound_fetch_zero(sem,id,session):
        async with sem:
            await fetch_zero(id,session)
 
 
async def fetch_zero(id, session):
    url = build_url(id)
    try:
        async with session.get(url) as response:

                # Считываем json
                resp=await response.text()
                js=json.loads(resp)
                list_users=[x for x in js['response'] if x != False]

                # Проверяем если город=1(Москва) тогда добавляем в лист
                for it in list_users:
                    try:
                        if it[0]['city']['id']==1:
                                list_data.append(it[0]['id'])
                    except Exception:
                        pass
 
    except Exception as ex:
        print(f'Error: {js}')
 
#  Генерация url к апи вк, 25 запросов в одном
def build_url(id):
    api = 'API.users.get({{\'user_ids\':{},\'fields\':\'city\'}})'.format(
        id * 25 + 1)
    for i in range(2, 26):
        api += ',API.users.get({{\'user_ids\':{},\'fields\':\'city\'}})'.format(
            id * 25 + i)
    url = 'https://api.vk.com/method/execute?access_token={}&v=5.101&code=return%20[{}];'.format(
        list_token[id%len(list_token)], api)
    return url
 
 
async def run_zero(id):
    tasks = []
    sem = asyncio.Semaphore(1000)
 
    async with ClientSession() as session:
 				
      	#  Значение 3200 зависит от вашего числа токенов 
        for id in range((id - 1) * 3200, id * 3200):
            task = asyncio.ensure_future(bound_fetch_zero(sem,id, session))
            tasks.append(task)
 
        responses = asyncio.gather(*tasks)
        await responses
        del responses
        await session.close()
 
# Запускаем  сборщик
for i in range(0,17):
  for id in range(i*500+1,(i+1)*500+1):
      print(id)
      loop = asyncio.new_event_loop()
      asyncio.set_event_loop(loop)
      loop.run_until_complete(run_zero(id))
      
  # Сохраняем айдишники в файл и очищаем лист
  with open(f'data_main{i}.txt', 'w') as f:
            for item in list_data:
              f.write(f'{item}\n')

  print(len(list_data))
  list_data.clear()
  • Вопрос задан
  • 390 просмотров
Пригласить эксперта
Ответы на вопрос 1
ramzis
@ramzis
FullStackOverflow
Ответ в ошибке
Прочитаю документацию API, там должен быть пункт сколько запросов разрешено делать в секунду
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы