Yunow
@Yunow
Профессионально шучу про tensorflow

Почему vk_api python долго обрабатывает с stand alone приложением?

Код выгружает инфу о подписчиках группы в csv
import vk_api, csv
token = "1234"

vk_session = vk_api.VkApi(token=token,app_id="1234")
vk = vk_session.get_api()
print(vk)
##Сохраняет бд Юзеров в FILENAME
def bdGroupUsers(group_id=29534144):
    FILENAME = "out12.csv"

    count_members = vk.groups.getMembers(group_id=group_id, count=0)["count"] #число участников в группе
    while_count= count_members//11000 + 1
    def code(offset=0):
        code = '''
        var i = 0;
        var members = [];
        var offset = '''+str(offset)+''';
        while(i < 11){
        members.push(API.groups.getMembers({"group_id": '''+str(group_id)+ ''', "offset": offset, "fields": "can_write_private_message, city"})["items"]);
        i = i + 1;
        offset = offset + 1000;
        }
        return members;
        '''
        return code
    offset = 0
    ku = 0
    df=[]
    columns = ["can_access_closed", "can_write_private_message", 'city', 'deactivated', 'first_name', 'id', 'is_closed', 'last_name'] #заголовки таблицы
    with open(FILENAME, "w", newline="", encoding='utf8') as file:
        writer = csv.DictWriter(file, fieldnames=columns)
        writer.writeheader()


    with open(FILENAME, "w", newline="", encoding='utf8') as file:
        writer = csv.DictWriter(file, fieldnames=columns)
        while ku <while_count-1:
            y = vk.execute(code=code(offset))
            for i in y:
                for j in i:
                    writer.writerow(j)
            print(ku)
            offset+=11000
            ku+=1
bdGroupUsers()


Скорость выгрузки около 1200-1800чел\сек. Прочитав о возможностях выгружать до 75 тысяч юзеров в сек результатом не очень доволен. Помогите, боги vk api, где моя глупейшая ошибка?
  • Вопрос задан
  • 197 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега ВКонтакте
♬♬
Поверхностный взгляд
На первый взгляд, косяк в числе запросов в одной "пачке" - их можно 25, а у вас всего 11.

И подозрение на тормоза из-за частоты запросов. Библиотека vk_api, если используется именно она, с ошибками превышения частоты запросов (3 в секунду) поступает просто: откладывает следующую попытку на пол-секунды. См. too_many_rps_handler

Разумнее считать время самостоятельно и точно укладываться в 3 запроса в секунду.

Вы пишете про 1200-1800 в секунду, это как-то совсем медленно, учитывая, что первые 33 тысячи то уж точно должно были бы вернуться за первую секунду с тем кодом, что в примере.


Upd. Попробовал безо всяких питонов прямо на странице приложения ВК создать хранимую процедуру и в ней получать список участников группы. Та же картина. Если только id пользователей – выполняется быстро.
Стоит добавить поля city и can_write_private_message, как долго думает и вылетает с ошибкой.

Видимо, надо «понять и простить» ВК, не справляющийся с такой нагрузкой в установленных лимитах времени/ресурсов и бить на меньшие партии, или выполнять доп. запросы.

Например, если такой парсинг требуется не однократно, а снова и снова, есть смысл кэшировать у себя данные пользователей (надеясь, что они не станут менять город и закрывать/открывать сообщения каждый день) и при повторных запросах сначала получать только id, а потом запрашивать city и can_write_private_message только для новичков.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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