Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 22, 2021 16:04:28

IgorMln
Зарегистрирован: 2021-06-22
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Здравствуйте. На просторах интернета нашел интересное решение поиска пользователей в контакте через 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()

Отредактировано IgorMln (Июнь 22, 2021 16:06:51)

Офлайн

#2 Июнь 22, 2021 18:40:40

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

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

IgorMln
Я вижу,что ошибка говорит,что слишком частые запросы. Но при этом процентов 80 json отдает без ошибки,а остальное с указанной ошибкой
По-моему очевидно, что вконтакт не желает чтобы его ДДОсили запросами и поэтому ограничевает количество запросов в единицу времени от конкретного адресата.



Офлайн

#3 Июнь 24, 2021 14:06:01

Stepa075
Зарегистрирован: 2021-06-24
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Сделать меньшее количество запросов и/или больше паузы между запросами.

Офлайн

#4 Июнь 25, 2021 13:45:55

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

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

А ещё лучше вообще от асинхронности отказаться.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Июнь 25, 2021 14:13:00

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

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

А еще не плохо бы самому для начала прочитать статью по ссылке, которую публикуешь. Я там вижу, в первых же строках

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

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

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

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

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

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

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

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

Действительно! Что ж такое то!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version