Найти - Пользователи
Полная версия: Асинхронность asyncio в Python Что не так?
Начало » Python проекты » Асинхронность asyncio в Python Что не так?
1
IgorMln
Здравствуйте. На просторах интернета нашел интересное решение поиска пользователей в контакте через API с помощью asyncio. Но почему то скрипт не работает…Несколько дней уже бьюсь и не могу найти ответ. Вроде все правильно, но получаю ответ от сервера: ‘Too many requests per second’, Где ошибка? Помогите, пожалуйста найти проблему. Вот источник: https://habr.com/ru/post/529696/
Вот ошибка:

Я вижу,что ошибка говорит,что слишком частые запросы. Но при этом процентов 80 json отдает без ошибки,а остальное с указанной ошибкой
 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()
FishHook
IgorMln
Я вижу,что ошибка говорит,что слишком частые запросы. Но при этом процентов 80 json отдает без ошибки,а остальное с указанной ошибкой
По-моему очевидно, что вконтакт не желает чтобы его ДДОсили запросами и поэтому ограничевает количество запросов в единицу времени от конкретного адресата.
Stepa075
Сделать меньшее количество запросов и/или больше паузы между запросами.
Rodegast
А ещё лучше вообще от асинхронности отказаться.
FishHook
А еще не плохо бы самому для начала прочитать статью по ссылке, которую публикуешь. Я там вижу, в первых же строках

Токены
Главная и первая проблема в ограничениях вк апи: 5 запросов в секунду для одного токена.

'error': {'errorcode': 6, ‘errormsg’: ‘Too many requests per second’}

Для того чтобы обойти это ограничение, нам понадобится много токенов. Есть три варианта как их получить:

Ручками регистрировать новых пользователей и получать токен

Купить токены

Сгенерировать токены с помощью библиотеки vk (pip install vk)

и даже решение подсказали, и не одно, а цельных три.

Несколько дней уже бьюсь и не могу найти ответ.

Действительно! Что ж такое то!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB